неадекватное поведение arduino и onebutton

Tagir
Offline
Зарегистрирован: 18.01.2018

В общем ситуация такая, обращался уже сюда 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 вообще не реагирует на нажатия.

Помогите пожалуйста.

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Сравните строку 37 и 119. Видите какие-либо отличия в форме записи?

Tagir
Offline
Зарегистрирован: 18.01.2018

sadman41 пишет:

Сравните строку 37 и 119. Видите какие-либо отличия в форме записи?

не понял, что сравнять?

sadman41
Offline
Зарегистрирован: 19.10.2016

Вы в своем первом сообщении левее кода видите цифры? Найдите 37 и 119. Сравните то, что написано справа от цифр.

 

Tagir
Offline
Зарегистрирован: 18.01.2018

а зачем мне сравнивать вот это P = vin * I; с вот этим Imax + 0.1; ?

kalapanga
Offline
Зарегистрирован: 23.10.2016

Tagir пишет:

а зачем мне сравнивать вот это P = vin * I; с вот этим Imax + 0.1; ?

Оператор присваивания

Tagir
Offline
Зарегистрирован: 18.01.2018

я понял, исправил, ошибка не исчезла, а появился другой глюк, аппарат уводит в защиту(а по нажатию longPressStop1 он должен из нее выходить) и защита разом отключается, с каждым выходом из защиты Imax увеличивается на 0,1...

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Tagir пишет:

а зачем мне сравнивать

Затем, что Вам сказали это сделать. Сравните и подумайте.

Tagir
Offline
Зарегистрирован: 18.01.2018

сравнил уже и поправил, теперь глюк другой))))

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Мы рады.