неадекватное поведение arduino и onebutton
- Войдите на сайт для отправки комментариев
Сб, 20/01/2018 - 20:52
В общем ситуация такая, обращался уже сюда http://arduino.ru/forum/programmirovanie/zavisanie-arduino-vo-vremya-raboty
переделал код с нуля используя Onebutton, получилось нечто подобное:
[code] #include <OneButton.h> #include <ACS712.h> #include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27,16,4);// задаем адрес устройства,к-во символов,к-во строк ACS712 sensor(ACS712_20A, A1); int analogInput = 0; // переменная для удобства инициализации и работы с аналог. портом 0 float vout = 0.0; // переменная с значением выходного напряжения float vin = 0.0; // переменная с результатом измерений float R1 = 100000.0; // сопротивление R1 float R2 = 10000.0; // сопротивление R2 int value = 0; // переменная хранения данных float Imax = 0.1; float P = 0.0; float I; OneButton button1(A6, true); OneButton button2(A7, true); void click1() { Imax + 0.1; } // click1 // This function will be called when the button1 was pressed 2 times in a short timeframe. void doubleclick1() { Imax++; } // doubleclick1 // This function will be called once, when the button1 is pressed for a long time. // This function will be called often, while the button1 is pressed for a long time. void longPress1() { Imax + 0.1; } // longPress1 // This function will be called once, when the button1 is released after beeing pressed for a long time. // ... and the same for button 2: void click2() { Imax - 0.1; } // click2 void doubleclick2() { Imax--; } // doubleclick2 void longPress2() { Imax - 0.1; } // longPress2 void longPressStop1() { } // longPressStop1 void setup() { pinMode(analogInput, INPUT); // инициализируем аналоговый порт 0, как вход pinMode(2, OUTPUT); pinMode(6, INPUT); //++ pinMode(7, INPUT); //-- lcd.init(); // производим инициализацию LCD lcd.clear(); // очищаем экран lcd.backlight(); int zero = sensor.calibrate(); Serial.begin(9600); // link the myClickFunction function to be called on a click event. button1.attachClick(click1); button1.attachDoubleClick(doubleclick1); button1.attachDuringLongPress(longPress1); // link the button 2 functions. button2.attachClick(click2); button2.attachDoubleClick(doubleclick2); button2.attachDuringLongPress(longPress2); button1.attachLongPressStop(longPressStop1); } void loop() // производим чтение аналогового сигнала и выводим на дисплей { button1.tick(); button2.tick(); I = sensor.getCurrentDC(); value = analogRead(analogInput);// читаем аналоговый сигнал, с аналог. порта - 0 vout = (value * 5.0) / 1024.0; // не забываем про внесение поправки (5.0 - это идеальный вариант,хотя все возможно) vin = vout / (R2/(R1+R2)); // в переменной будет значение входного напряжения if (vin<0.09) // проверка, для получ. 0 { vin=0.0; // обнуляем нежелательное значение } if (I >= Imax) { while(true) { digitalWrite(2, 1); button1.tick(); lcd.clear(); lcd.setCursor(3,0); lcd.print("currect excedeed "); delay(350); if(longPressStop1){ break; } } } } digitalWrite(2, 0); P = vin * I; lcd.clear(); lcd.setCursor(3,0); lcd.print(vin); // выводим значение напряжения, что на входе lcd.print("V "); // выводим надпись "volt" на lCD lcd.print(I); Serial.println(I); lcd.print("A"); lcd.setCursor(3,1); lcd.print(Imax); Serial.println(Imax); lcd.print("A "); lcd.print(P); lcd.print("W"); delay(500); // задержка 500 мс. } [/code]
однако, когда я не нажимаю на кнопку(да ее, собственно, и нет), ардуино выходит из цикла как будто я нажимаю на кнопку, а переменная Imax вообще не реагирует на нажатия.
Помогите пожалуйста.
Сравните строку 37 и 119. Видите какие-либо отличия в форме записи?
Сравните строку 37 и 119. Видите какие-либо отличия в форме записи?
не понял, что сравнять?
Вы в своем первом сообщении левее кода видите цифры? Найдите 37 и 119. Сравните то, что написано справа от цифр.
а зачем мне сравнивать вот это P = vin * I; с вот этим Imax + 0.1; ?
а зачем мне сравнивать вот это P = vin * I; с вот этим Imax + 0.1; ?
Оператор присваивания
я понял, исправил, ошибка не исчезла, а появился другой глюк, аппарат уводит в защиту(а по нажатию longPressStop1 он должен из нее выходить) и защита разом отключается, с каждым выходом из защиты Imax увеличивается на 0,1...
а зачем мне сравнивать
Затем, что Вам сказали это сделать. Сравните и подумайте.
сравнил уже и поправил, теперь глюк другой))))
Мы рады.