#1 2017-12-03 12:24:58

Nikita_janio
Учасник
Зареєстрований: 2017-12-03
Повідомлень: 3

Помогите разобраться с ардуино

Я начинаю только знакомство с ардуино много чего не знаю, поэтом требуется ваша помощь.

Вообщем хочу сделать из ардуино контроллер зажигания светодиодов. А именно чтобы были разные режимы(переключаемые кнопкой), информация о режиме (номер режима) выводился на oled экран(128х32).
Первый режим подразумевает цветомузыку.
второй режим просто переключает светодиоды по порядку.

Написал код но ничего не работает. Думаю проблема в том что функция loop выполняет все сравнения чем отнимает время зажигания светодиодов.

По идее надо как-то зациклить выполнение одного из режимов, а  не нужные для режимов вычисления чтобы запускались при дополнительном условии. Но как это сделать я не знаю.
помогите.

К слову arduino uno r3


#include <OLED_I2C.h>
OLED  myOLED(SDA, SCL, 8);
extern uint8_t MegaNumbers[];
  uint8_t numchars;

int MicValue;
int sped;
int mode;
int correction;
int MicPin = A1;
int button = 1;

int redPin = 2;          
int greenPin = 3;
int bluePin = 4;
int YellowPin = 5;


void setup() {
  // put your setup code here, to run once:
  pinMode(11, INPUT);

  pinMode(redPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
  pinMode(bluePin, OUTPUT);
  pinMode(YellowPin, OUTPUT);
  pinMode(MicPin, INPUT);

  digitalWrite(redPin, LOW);      
  digitalWrite(greenPin, LOW);
  digitalWrite(bluePin, LOW);
  digitalWrite(YellowPin, LOW);

  myOLED.begin();  
}

void loop() {
      button = digitalRead(11);
      
      correction = 499;                        //вычисление для режима 1
      MicValue = analogRead(MicPin)+correction;
        
      sped = analogRead(A2)/2                 //вычисление для режима 2

      
   if(button == 1){         //вычисления режима работы
    mode++;
    delay(1000);
   }
   if(mode == 3 && l == 1){
    mode = 1;
    }
    if(mode == 1){              //режим 1
      
    myOLED.setFont(MegaNumbers);
    myOLED.print("  1  ", 0, 0);
    myOLED.print("     ", 0, 50);
    myOLED.update();

  

  if (MicValue > 500) {   
    digitalWrite(bluePin,HIGH);
    delay(100);            
    }
  
  if (MicValue > 515) {      
    digitalWrite(greenPin, HIGH);
    delay(100);            
    }
  
  if (MicValue > 530) {     
    digitalWrite(redPin, HIGH);
    delay(100);              
    }
    
  if (MicValue > 545) {     
    digitalWrite(YellowPin, HIGH);
    delay(100);              
    }  

digitalWrite(greenPin, LOW);    //все гасим для стобо-эффекта
digitalWrite(redPin, LOW);
digitalWrite(bluePin,LOW);
digitalWrite(YellowPin,LOW);
delay(5);                  
    }
      if(mode == 2) {        // режим 2
        
    myOLED.setFont(MegaNumbers);
    myOLED.print("  2  ", 0, 0);
    myOLED.print("     ", 0, 50);
    myOLED.update();


        
    digitalWrite(redPin, HIGH);
    delay(sped);
    digitalWrite(redPin, LOW); 
    digitalWrite(bluePin, HIGH);
    delay(sped);
    digitalWrite(bluePin, LOW);
    digitalWrite(YellowPin, HIGH);
    delay(sped);
    digitalWrite(YellowPin, LOW); 
    digitalWrite(greenPin, HIGH);
    delay(sped);
    digitalWrite(greenPin, LOW); 
      }
    }
    
    
    
    

Остання редакція Nikita_janio (2017-12-03 12:27:29)

Неактивний

#2 2017-12-03 12:39:43

vvr
Учасник
Зареєстрований: 2015-04-12
Повідомлень: 874

Re: Помогите разобраться с ардуино

Nikita_janio пише:

Я начинаю только знакомство с ардуино много чего не знаю, поэтом требуется ваша помощь.

научитесь правильно подключать и  работать с кнопкой, переключать режимы, разберитесь что такое дребезг контактов и как с ним бороться.

разберитесь как выводить информацию на дисплей.

поиграйтесь со светодиодами, научитесь как мигать-моргать-гореть без делеев.

и только потом собирайте всё в кучу.

учить вас никто не будет (как и на любом другом форуме), могут только подсказать.

Остання редакція vvr (2017-12-03 12:41:26)

Неактивний

#3 2017-12-03 16:22:22

lol
Гість

Re: Помогите разобраться с ардуино

а могли бы просто подсказать использовать функцию while вместо if

#4 2017-12-03 16:26:14

lol
Гість

Re: Помогите разобраться с ардуино

lol пише:

а могли бы просто подсказать использовать функцию while вместо if

нахрена пацану жизнь портить
крч nikita просто используй while чтобы зациклировать какуюто часть кода
только переходы от режима к режиму отдельно в каждом режиме должны быть

вот я переиначил код должно работать

#include <OLED_I2C.h>
OLED  myOLED(SDA, SCL, 8);
extern uint8_t MegaNumbers[];
  uint8_t numchars;

int MicValue;
int sped;
int mode;
int correction;
int MicPin = A0;
int button = 1;

int redPin = 2;          
int greenPin = 3;
int bluePin = 4;
int YellowPin = 5;


void setup() {
  // put your setup code here, to run once:
  pinMode(11, INPUT);

  pinMode(redPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
  pinMode(bluePin, OUTPUT);
  pinMode(YellowPin, OUTPUT);
  pinMode(MicPin, INPUT);

  digitalWrite(redPin, LOW);      
  digitalWrite(greenPin, LOW);
  digitalWrite(bluePin, LOW);
  digitalWrite(YellowPin, LOW);

  myOLED.begin();  
}

void loop() {
      button = digitalRead(11);   
   if(button == 1){         //вычисления режима работы
    mode++;
    delay(1000);
   }
   if(mode == 3 && button == 1){
    mode = 1;   
}


    
   while(mode == 1){  //режим 1
    button = digitalRead(11);   
   if(button == 1){         //вычисления режима работы
    mode++;
    delay(1000);
   }
   if(mode == 3 && button == 1){
    mode = 1;   
}

    myOLED.setFont(MegaNumbers);
    myOLED.print("  1  ", 0, 0);
    myOLED.print("     ", 0, 50);
    myOLED.update();

    
   correction = 499;                        //вычисление для режима 1
      MicValue = analogRead(MicPin)+correction;

  if (MicValue > 500) {   
    digitalWrite(bluePin,HIGH);
    delay(100);            
    }

  
  if (MicValue > 515) {      
    digitalWrite(greenPin, HIGH);
    delay(100);            
    }
  
  if (MicValue > 530) {     
    digitalWrite(redPin, HIGH);
    delay(100);              
    }
    
  if (MicValue > 545) {     
    digitalWrite(YellowPin, HIGH);
    delay(100);              
    }  

digitalWrite(greenPin, LOW);    //все гасим для стобо-эффекта
digitalWrite(redPin, LOW);
digitalWrite(bluePin,LOW);
digitalWrite(YellowPin,LOW);
delay(5);                  
    }
      while(mode == 2) {      // режим 2
    button = digitalRead(11);   
   if(button == 1){         //вычисления режима работы
    mode++;
    delay(1000);
   }
   if(mode == 3 && button == 1){
    mode = 1;   
}

        
    myOLED.setFont(MegaNumbers);
    myOLED.print("  2  ", 0, 0);
    myOLED.print("     ", 0, 50);
    myOLED.update();

    sped = analogRead(A2)/2;                 //вычисление для режима 2
                                           //скорость переключения зависит от патенциометра 
        
    digitalWrite(redPin, HIGH);
    delay(sped);
    digitalWrite(redPin, LOW); 
    digitalWrite(bluePin, HIGH);
    delay(sped);
    digitalWrite(bluePin, LOW);
    digitalWrite(YellowPin, HIGH);
    delay(sped);
    digitalWrite(YellowPin, LOW); 
    digitalWrite(greenPin, HIGH);
    delay(sped);
    digitalWrite(greenPin, LOW); 
      }
    }
    
    

#5 2017-12-03 17:24:20

vvr
Учасник
Зареєстрований: 2015-04-12
Повідомлень: 874

Re: Помогите разобраться с ардуино

и на фига там while ?????)))))

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму