неадекватное поведение 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...
а зачем мне сравнивать
Затем, что Вам сказали это сделать. Сравните и подумайте.
сравнил уже и поправил, теперь глюк другой))))
Мы рады.