Несколько кнопок на ардуино
- Войдите на сайт для отправки комментариев
Чт, 14/12/2017 - 23:27
Помогите!
Нужно сделать 5 режимов работы устройства. Для этого использую 5 кнопок + 1 для изменения значения переменной.
Что не так с кодом?? Я подключил кнопки с подтягивающим резистором на 10кОм.
В любом случае выбирается один режим и больше не меняется! С 1 кнопкой все работало!
Помогите, пожалуйста!
#include <HX711.h> // Подключаем библиотеку HX711 для работы с АЦП hx711 #include <LiquidCrystal_I2C.h> #include <Wire.h> #include <LiquidCrystal.h> LiquidCrystal_I2C lcd(0x27,16,2); // Устанавливаем дисплей HX711 scale(A1, A0); // Указываем в какие пины подключен АЦП hx711 (DT(DOUT) - pin A1, SCK - pin A0) //===============Mode ============= int choice = 0; //========================================= //=============== BUTTONS ================= int tara = 2; int cMode = 3; int normalB = 4; int khB = 5; int rxB = 6; int assembleCase = 7; int receiveCase = 8; //========================================= float myScale; // Инициализируем переменную в которой будем хранить текущий вес float myScale2; float count_KH; float count_RX; void setup() { int choice = 0; Serial.begin(9600); // Инициализируем монитор порта, как устройство вывода Serial.println("Calibration..."); // Выводим надпись scale.set_scale(-90.59); // Устанавливаем калибровочный коэффициент scale.tare(); // Сбрасываем весы на 0 myScale = round(scale.get_units(10)); // Запоминаем среднее значение без груза, но с учетом тары Serial.println(0.00); // Обнуляем значение веса на мониторе порта (-1) //================ Кнопки с прерываниями ================= pinMode(tara, INPUT); attachInterrupt(1, whenTare, RISING); pinMode(cMode, INPUT); attachInterrupt(2, changeMode, RISING); //======================================================== //================ Подулючение кнопок ==================== pinMode(normalB, INPUT); pinMode(khB, INPUT); pinMode(rxB, INPUT); pinMode(assembleCase, INPUT); pinMode(receiveCase, INPUT); //======================================================== } void loop() { Serial.println(choice); while (choice == 0) { if (digitalRead(normalB) == 1) { choice = 2; Serial.println("Normal mode!"); } else if (digitalRead(khB) == 1) { choice = 3; Serial.println("KH mode!"); } else if (digitalRead(rxB) == 1) { choice = 4; Serial.println("RX mode!"); } else if (digitalRead(assembleCase) == 1) { choice = 5; Serial.println("Case assembly mode!"); } else if (digitalRead(receiveCase) == 1) { choice = 6; Serial.println("Receiving Case mode!"); } } scale.power_up(); // Отключаем энергосберегающий режим hx711 if (round(scale.get_units(10)) != myScale) { // Условие выполняется, если округленный до граммов вес отличается от последнего } scale.power_down(); // Включаем энергосберегающий режим hx711 delay(500); // Пауза на половину сек. } void normal() { myScale = scale.get_units(20); // Запоминаем текущий вес //Serial.println(myScale); myScale = round(myScale); // Запоминаем округленный текущий вес (для сравнения) myScale2 = myScale; } void whenTare() { scale.tare(); Serial.println(myScale); } void kh() { count_KH = round(myScale / 18); Serial.println(int(count_KH)); } void rx() { count_RX = round(myScale / 100); Serial.println(int(count_RX)); } void changeMode() { choice = 0; }
Что не так?
Как вы понимаете эту строку:
while
(choice == 0) ?
А, там у вас на external interrupt подвешено зануление choice... Стабильно ли вызывается ли обработчик данного прерывания?
Еще раз допишу... https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/ ->
attachInterrupt(digitalPinToInterrupt(pin), ISR, mode);
(recommended)пропробуй
volatile int
choice = 0;
Всем большое спасибо!!!
про vоlatile в прерываниях не знал, спасибо за наводку)
спасибо за ссылку на официальный сайт. Как-то забыл там посмотреть. Проблему обнаружил. Дело в кнопках((
После нажатия на них остается положительный сигнал. Типа они выключатели...
Всем СПАСИБО !!!