Код (Text): #include <LiquidCrystal.h> LiquidCrystal lcd(13, 12, 11, 10, 9, 8); boolean a = true; int sv; float rv; void setup() { pinMode(2, INPUT_PULLUP); pinMode(3, INPUT_PULLUP); pinMode(4, INPUT_PULLUP); lcd.begin(16,2); lcd.clear(); lcd.print("B\xC3\xB2\xB8""p\xB8\xBF""e:"); lcd.setCursor(0,1); lcd.print("V \xBE\xB8\xBF.: 5,12,9 "); while(a){ if(digitalRead(2) || digitalRead(3) || digitalRead(4) == false){ a = false; } } if(digitalRead(2) == false){ sv = 5; } else if(digitalRead(3) == false){ sv = 12; } else if(digitalRead(4) == false){ sv = 9; } lcd.clear(); lcd.print("B\xC3\xB2""pa\xBD""o:"); lcd.setCursor(0,1); lcd.print(sv, 0); lcd.print("V"); delay(3000); lcd.clear(); } void loop() { rv = analogRead(A5) / 1024.0 * 10.0 * 4.0; if(sv == 5){ if(rv == 5.0){ lcd.clear(); lcd.print("\x9B"); } if(rv == 4.9){ lcd.clear(); lcd.print("\x9C"); } if(rv == 4.8){ lcd.clear(); lcd.print("\x9D"); } if(rv == 4.7){ lcd.clear(); lcd.print("\x9E"); } if(rv == 4.6){ lcd.clear(); lcd.print("\x9F"); } } if(sv == 9){ if(rv > 8.5 && rv < 9.0){ lcd.clear(); lcd.print("\x9B"); } if(rv > 8.0 && rv < 8.4){ lcd.clear(); lcd.print("\x9C"); } if(rv > 7.5 && rv < 7.9){ lcd.clear(); lcd.print("\x9D"); } if(rv > 7.0 && rv < 7.4){ lcd.clear(); lcd.print("\x9E"); } if(rv > 6.5 && rv < 6.9){ lcd.clear(); lcd.print("\x9F"); } } if(sv == 12){ if(rv > 11.0 && rv < 12.0){ lcd.clear(); lcd.print("\x9B"); } if(rv > 9.9 && rv < 10.9){ lcd.clear(); lcd.print("\x9C"); } if(rv > 8.8 && rv < 9.8){ lcd.clear(); lcd.print("\x9D"); } if(rv > 7.7 && rv < 8.7){ lcd.clear(); lcd.print("\x9E"); } if(rv > 6.6 && rv < 7.6){ lcd.clear(); lcd.print("\x9F"); } } } Должно быть так: 1. Пишет : Выбирите V пит.: 5, 12, 9 2. Нажимаю одну из кнопок каждая под каждым напряжением. 3. Пишет : Выбрано: (5, 12, 9)V 4. Сравнивает показания с различными напряжениями и высвечивает показания в виде заряженной/незаряженной батарейки (символы здесь: http://files.amperka.ru/datasheets/MT-16S2H.pdf ) Но получается так: 1. Не дает выбор, пишет: Выбрано: _V 2. Дальше ничего не делает так как вариант для выбранного нуля не прописан. Помогите ко чем сможет, пожалуйста!
Ну, видимо, вставить условие Код (Text): rv = analogRead(A5) / 1024.0 * 10.0 * 4.0; // после этой строки if(rv > 0) // --- УСЛОВИЕ КОГДА >0 { .... .... }
Вы наверное не так поняли. С кодом всё в порядке, но он почему то, выходит из команды while сразу же как только она проходит 1 раз. В коде написано: Код (Text): while(a){ if(digitalRead(2) || digitalRead(3) || digitalRead(4) == false){ a = false; } А ещё раньше: Код (Text): pinMode(2, INPUT_PULLUP); pinMode(3, INPUT_PULLUP); pinMode(4, INPUT_PULLUP); То есть каждый из 3 пинов на плюсе, а когда кнопка нажата пин этой кнопки замыкается на минус и цикл заканчивается. А из цикла, как я уже говорил, программа сразу от туда выходит.
Нужно сначала выложить на бесплатный фотохостинг, а потом уже ссылку вставить при ответе. Все нормально выкладывается.
Компилятор понимает это так: Код (Text): while(a){ if(digitalRead(2) == true || digitalRead(3) == true || digitalRead(4) == false){ a = false; } Исправьте условие.
можно проще Код (Text): while(a){ a= digitalRead(2) && digitalRead(3) && digitalRead(4); } Пока все в "1" - a=1 цикл крутится. Любая в "0" - a=0 выход из цикла. Вообще, если используются только булевые переменные есть смысл избавляться от условного оператора if. Исключением является организация триггера.
Только для моего кода надо почти также, но: Код (Text): while(digitalRead(2) || digitalRead(3) || digitalRead(4)) ; Поскольку надо выйти из цикла при нажатии любой кнопки.
Все, в этом месте всё заработало! Спасибо всем огромное! Но, проблема появилась другая. Как работает теперь: 1. Запуск. Пишет: Выбирите V пит. 5, 12, 9 2. Ждёт пока я нажму кнопку. Я нажимаю. 3. Пишет: либо полностью закрашенный квадрат, либо μ. 4. "Батарейка" не загорается.
Двойное считывание кнопки без фильтра антидребезга - плохое решение. При первом считывании можете поймать 0, при втором 1. Либо применяйте библиотеки антибребезга, либо организуйте программу так, чтобы считывать один раз. Например таким началом Код (Text): #include <LiquidCrystal.h> LiquidCrystal lcd(13, 12, 11, 10, 9, 8); int sv = 0; float rv; void setup() { pinMode(2, INPUT_PULLUP); pinMode(3, INPUT_PULLUP); pinMode(4, INPUT_PULLUP); lcd.begin(16,2); lcd.clear(); lcd.setCursor(0,0); lcd.print("B\xC3\xB2\xB8""p\xB8\xBF""e:"); lcd.setCursor(0,1); lcd.print("V \xBE\xB8\xBF.: 5,12,9 "); while(sv == 0){ if(!digitalRead(2)) sv = 5; if(!digitalRead(3)) sv = 12; if(!digitalRead(4)) sv = 9; } lcd.clear(); lcd.setCursor(0,0); lcd.print("B\xC3\xB2""pa\xBD""o:"); lcd.setCursor(0,1); lcd.print(sv, 0); lcd.print("V"); delay(3000); lcd.clear(); }