Активный вольтметр на Arduino

Lord_elf
Offline
Зарегистрирован: 06.05.2016

Приветствую всех.

Прошу помощи вот в таком вопросе, есть ардуина, есть код замера напряжения на выводе А7 и все работает прекрасно, выбрали в меню тест батарейки, посмотрели напряжение и вроде как все должно быть прекрасно, нажали кнопку, вышли в основное меню а экран взял и потух... Не учел я то, что аккумулятор даже разряженный из последних сил будет выдавать положенные 7,4 в (или около того) в первые секунды включения, а потом уже упокоится с миром...

Проблема в том, что я никак не могу заключить проверку в цикл, при том, чтобы программа проверяла нажатие клавиши, чтобы закончить цикл и выйти в основное меню. Понимаю что я нуб, и проблема наверное плевая, но я никак не смог ее решить, пол ночи парился... либо я проверяю напряжение без остановки, либо определенное колличество раз, но на кнопку никак не реагирую... Помогите пожалуйста))

void battery_test() {
  int sensorValue = analogRead(A7); //read the A7 pin value
  float voltage = (sensorValue * 5.0)/1023.0/0.1656299; //0.1656299 это 20кОм/(20кОм+100кОм)
  lcd.setCursor(0,0);
  lcd.print("Voltage = ");
  lcd.print(voltage); //print the voltage to LCD
  lcd.print(" V");
  if(voltage > 6.50)
    { tone(tonepin,2400,30);
      digitalWrite(GREENLED, HIGH);
      lcd.setCursor(0,1);
      lcd.print("Battery OK");     }  
  else
    { tone(tonepin,2600,3000);
      digitalWrite(REDLED, HIGH);
      lcd.setCursor(0,1);
      lcd.print("Low charge");     }
  keypad.waitForKey();
      tone(tonepin,2400,30);
      menuPrincipal();
}

 

DIVGENY
Offline
Зарегистрирован: 23.08.2016

читал пять раз, так и не понял, что вы хотите проверять ( напряжение батареи или нажатие клавиши ) и в каком цикле.?

вроде бы логично было бы  сделать задержку и по окончании ее автоматически перейти в основное меню.

также можно просто сделать в конце кода battery_test проверку нажата ли та же кнопка, что вы зашли  в подпрограму проверки, если да то крутим это меню, нет - идем в основное, как я понял - menuPrincipal

естественно кнопку придется удерживать.

if (кнопка нажата) battery_test();

else menuPrincipal();

и нужно видеть весь скетч, многие обходятся без кейпада или просто не используют библиотеку под него.

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

DIVGENY пишет:

читал пять раз, так и не понял, что вы хотите проверять

напряжение разряженой батареи - это же очевидно

Lord_elf
Offline
Зарегистрирован: 06.05.2016

DIVGENY пишет:

читал пять раз, так и не понял, что вы хотите проверять ( напряжение батареи или нажатие клавиши ) и в каком цикле.?

вроде бы логично было бы  сделать задержку и по окончании ее автоматически перейти в основное меню.

также можно просто сделать в конце кода battery_test проверку нажата ли та же кнопка, что вы зашли  в подпрограму проверки, если да то крутим это меню, нет - идем в основное, как я понял - menuPrincipal

естественно кнопку придется удерживать.

if (кнопка нажата) battery_test();

else menuPrincipal();

и нужно видеть весь скетч, многие обходятся без кейпада или просто не используют библиотеку под него.

Извиняюсь если не подробно расписал) Суть в следующем: в основном меню (menuPrincipal) есть несколько различных подменю. Один из них, это проверка напряжения батареи. Как это происходит сейчас - вы пролистываете основное меню, выбираете тест батареи, происходит опрос А7 и результаты выводятся на экран. Дальше при нажатии любой кнопки - вы выходите в основное меню. Проблема в том, что опрос А7 происходит один раз, а как я описывал даже разряженная батарейка первые несколько секунд очень даже не плохо работает, а потом напряжение падает. А что я хотел - вы заходите в тест батареи и пока не нажата кнопка (любая или определенная) должен происходить цикл опроса датчика и вывода результатов, то есть как в мультиметре, в режиме проверки напряжения. Вот как то так...

Сейчас подумал... возможно вы правы с If? Только сделать так?

if (keypad.waitForKey()menuPrincipal;

else battery_test();

Или не взлетит?) К сожалению пока нет возможности опробовать, пока не приду домой с работы.

DIVGENY
Offline
Зарегистрирован: 23.08.2016

Клапауций 232 пишет:

напряжение разряженой батареи - это же очевидно

  тоже подумал про это, но смысл проверять уже разряженную на кизяк батарею...

может ТС хотел вставить  цикл проверки батареи в скетч в автомате и при предельно низком напряжении выводить на экран результат.

так же можно  было постояно писать результат замера в переменную и при входе по нажатию видеть уже готовый результат. возможно контроллер работает постоянно, а при нажатии кейпада зажигается экран.

Lord_elf
Offline
Зарегистрирован: 06.05.2016

DIVGENY пишет:

Клапауций 232 пишет:

напряжение разряженой батареи - это же очевидно

  тоже подумал про это, но смысл проверять уже разряженную на кизяк батарею...

может ТС хотел вставить  цикл проверки батареи в скетч в автомате и при предельно низком напряжении выводить на экран результат.

так же можно  было постояно писать результат замера в переменную и при входе по нажатию видеть уже готовый результат. возможно контроллер работает постоянно, а при нажатии кейпада зажигается экран.

Эх... не получается у меня объяснить правильно... 

В общем суть в следующем: Включаем питание - в основном меню выбираем тест батареи - входим в него - у нас должно быть показано напряжение батареи, значение которого должно обновлятся раз в 100мс - нажали любую кнопку - вышли в основное меню.

Вот как то так. То есть мне нужен цикл опроса датчика с выводом результата на экран, который будет завершатся при нажатии на любую кнопку. Если в тело цикла вставить команду keypad.waitForKey() то цикл замирает и ждет когда я нажму на клавишу. А мне надо чтобы он проверил нажата ли клавиша и если нет то продолжил цикл...

Извиняюсь что объясняюсь каким то быдловским языком)

nik182
Offline
Зарегистрирован: 04.05.2015

А функции KeyPad.KeyPressed нет случайно в используемой вами библиотеке? Ну или какойто подобной, которая не wait, а только check ?

Lord_elf
Offline
Зарегистрирован: 06.05.2016

nik182 пишет:

А функции KeyPad.KeyPressed нет случайно в используемой вами библиотеке? Ну или какойто подобной, которая не wait, а только check ?

Воооооот!!!! Вот что мне надо!!) Сейчас сижу читаю библиотеку, используется стандартная Keypad.h правда пока ничего не нашел...

DIVGENY
Offline
Зарегистрирован: 23.08.2016

Examples



#include <Keypad.h>

const byte ROWS = 4; //four rows
const byte COLS = 3; //three columns
char keys[ROWS][COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'#','0','*'}
};
byte rowPins[ROWS] = {5, 4, 3, 2}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {8, 7, 6}; //connect to the column pinouts of the keypad

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

void setup(){
  Serial.begin(9600);
}
  
void loop(){
  char key = keypad.getKey();
  
  if (key != NO_KEY){  //если переменная key не равна ( не нажата) проверяем дальше 
    Serial.println(key);  // если нажата пишем в сериал
  }
}

Serial.println(key); меняем на
menuPrincipal();

Lord_elf
Offline
Зарегистрирован: 06.05.2016

Урааааааааааааааааааааааа!!!! Заработалоооо!!!! Огромнейшее спасибо!!!!

Теперь это нормально действующий тестер напряжения!!! Сейчас проверил регулируемым блоком питания!

При падении ниже 6,5 вольт начинает противно пищать. Все шикарно!)

void battery_test() {
  int sensorValue = analogRead(A7); //read the A7 pin value
  float voltage = (sensorValue * 5.0)/1023.0/0.1656299; //0.1656299 это 20кОм/(20кОм+100кОм)
  lcd.setCursor(0,0);
  lcd.print("Voltage = ");
  lcd.print(voltage); //print the voltage to LCD
  lcd.print(" V");
  digitalWrite(GREENLED, LOW);
  digitalWrite(REDLED, LOW);
  lcd.setCursor(0,1);
  if(voltage > 6.50)
    { digitalWrite(GREENLED, HIGH);
      lcd.print("Battery OK");     }  
  else
    { tone(tonepin,2600,30);
      digitalWrite(REDLED, HIGH);
      lcd.print("Low charge");     }
  delay(100);  
  var = keypad.getKey();
  if(var != NO_KEY)   {
     menuPrincipal();}
   else {battery_test();}
}