ARDUINO Нет опроса аналогового входа в реальном времени

md5u

✩✩✩✩✩✩✩
20 Окт 2018
2
0
Всем привет!
Занимаюсь Ардуино всего 2ой день т.к. нужно написать программку для одного устройства.

Схема: 4 тактовые кнопки, которые отвечают за каждый режим.Проблема в том, что у меня не обновляется в реальном времени данные с пинов А0 и А1. Если нажать кнопку BUTTON_PIN_3, то значения обновляются.

Получается что программа тормозится после нажатия кнопки.

Как сделать чтобы данные с пинов А0 и А1 опрашивались постоянно и выводились на экран сразу же?


C++:
#include <LiquidCrystal.h> /* подключаем встроенную в Arduino IDE
библиотеку для дисплея LCD 16x2 */
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

#define BUTTON_PIN_1 6
#define BUTTON_PIN_2 7
#define BUTTON_PIN_3 8
#define BUTTON_PIN_4 9
#define LED_PIN_1 10
#define LED_PIN_2 13
boolean buttonWasUp_1 = true;
boolean buttonWasUp_2 = true;
boolean buttonWasUp_3 = true;
boolean buttonWasUp_4 = true;
boolean ledEnabled_1 = false;
boolean ledEnabled_2 = false;
//Здесь у нас практически тоже самое, вот только кнопок у нас теперь две и два светодиода
void setup()
{
lcd.begin(16, 2);// указываем тип дисплея LCD 16X2
Serial.begin(9600);

pinMode (LED_PIN_1, OUTPUT);
pinMode (LED_PIN_2, OUTPUT);
pinMode (BUTTON_PIN_1, INPUT_PULLUP);
pinMode (BUTTON_PIN_2, INPUT_PULLUP);
pinMode (BUTTON_PIN_3, INPUT_PULLUP);
pinMode (BUTTON_PIN_4, INPUT_PULLUP);
}
void loop()
{



boolean buttonIsUp_1 = digitalRead(BUTTON_PIN_1);  // режим MUTE, зажигает LED_PIN D10 кнопкой BUTTON_PIN_1_D6
if (buttonWasUp_1 && !buttonIsUp_1) {
delay(10);
buttonIsUp_1 = digitalRead (BUTTON_PIN_1);
if (!buttonIsUp_1) {
ledEnabled_1 = !ledEnabled_1;
digitalWrite(LED_PIN_1, ledEnabled_1);
  lcd.clear();
  lcd.print("MUTE+LED");
}
}
buttonWasUp_1 = buttonIsUp_1;




boolean buttonIsUp_2 = digitalRead(BUTTON_PIN_2); // режим NIGHT, зажигает LED_PIN D13 кнопкой BUTTON_PIN_2_D7
if (buttonWasUp_2 && !buttonIsUp_2) {
delay(10);
buttonIsUp_2 = digitalRead (BUTTON_PIN_2);
if (!buttonIsUp_2) {
ledEnabled_2 = !ledEnabled_2;
digitalWrite(LED_PIN_2, ledEnabled_2);
  lcd.clear();
  lcd.print("NIGHT+LED");
}
}
buttonWasUp_2 = buttonIsUp_2;





boolean buttonIsUp_3 = digitalRead(BUTTON_PIN_3); // режим вид 1, включается кнопкой BUTTON_PIN_3_D8
if (buttonWasUp_3  && !buttonIsUp_3) {
delay(10);
buttonIsUp_3 = digitalRead (BUTTON_PIN_3);
  if (!buttonIsUp_3) {
  lcd.setCursor(11, 0);      
  lcd.print("VOLUM");          
  int perV = map(analogRead(0), 0, 1023, 0, 100);
  fillBar1(0, 0, 11, perV);
  delay(10);
  int perB = map(analogRead(1), 0, 1023, 0, 100);
  fillBar1(0, 1, 11, perB);
  delay(10);
}
}
buttonWasUp_3 = buttonIsUp_3 ;





boolean buttonIsUp_4 = digitalRead(BUTTON_PIN_4); // режим вид 2, включается кнопкой BUTTON_PIN_4_D9
if (buttonWasUp_4 && !buttonIsUp_4) {
delay(10);
buttonIsUp_4 = digitalRead (BUTTON_PIN_4);
if (!buttonIsUp_4) {
     lcd.clear();
  lcd.print("VID2");
}
}
buttonWasUp_4 = buttonIsUp_4;
}

void fillBar1(byte start_pos, byte row, byte bar_length, byte fill_percent) {
  byte infill = round((float)bar_length * fill_percent / 100);
  lcd.setCursor(start_pos, row);
  for (int n = 1; n < bar_length; n++) {
    if (n < infill) lcd.write(255);
    if (n >= infill) lcd.write(16);
  }
  int sensorValue = analogRead(A1);
lcd.setCursor(11, 1);
  if (sensorValue < 100)   lcd.print("20 Hz");
  else if (sensorValue < 200)  lcd.print("30 Hz");
  else if (sensorValue < 300)   lcd.print("40 Hz");
  else if (sensorValue < 400)  lcd.print("50 Hz");
  else if (sensorValue < 500)  lcd.print("60 Hz");
  else if (sensorValue < 600)   lcd.print("70 Hz");
  else if (sensorValue < 700)   lcd.print("80 Hz");
  else if (sensorValue < 800)   lcd.print("90 Hz");
  else if (sensorValue < 900)   lcd.print("100Hz");
  else   lcd.print("120Hz");
}
 

Bruzzer

★★★✩✩✩✩
23 Май 2020
464
134
@md5u,
Чтение analogRead занимает примерно 0,1 мс. (для частоты 16 МГц) Это точно проблема для вашего алгоритма?
 

poty

★★★★★★✩
19 Фев 2020
3,228
939
Так Вы и опрашиваете аналоговые пины только для кнопки 3, причём только два из них.
Delay - зло в интерактивных системах. Сам алгоритм - странен, если не сказать больше.