Всем привет ребята:) нужна ваша помощь:) проблема с запуском через клавиатуру...

Праздник:)

✩✩✩✩✩✩✩
30 Июл 2020
5
0
привет всем:) В общем в общем у меня есть две колбы, на них 2 клапана. На клапаны код работает, т.е даешь питание на плату и все начинает работать как надо.Но понадобилось этим управлять, включать/выключать/ставить на таймер по работе/сбрасывать таймер. Но пока приступил к кнопке старта, но появилась проблема:) Кнопка работает, печатает на монитор, но клапаны не запускаются в нужном режиме, как прописано в коде. Включается все так...тыкаешь 1 раз на клавишу, вырубается 1 клапан, тыкаешь еще несколько раз врубается 1 вырубается 2. Т.е даже не запускается работа клапанов в автоматическом режиме:). Уже разные варианты пробовал...скину тот который кажется должен работать, но не работает. Используется обычная мембранная клавиатура 4х4.
Я в этом деле новичек(в ардуино), подскажите, как запустить кнопкой это все, тыкните носом в чем может быть проблема, что добавить, что убавить:)


kolby:
#include "Keypad.h"
#include <LiquidCrystal.h>
LiquidCrystal lcd(2, 3, 4, 5, 6, 7); // (RS, E, DB4, DB5, DB6, DB7)
//колбы и таймер
#define flask1 22 //задаем выход на плате
#define flask2 23
unsigned long timeArray[] = {2000, 5000, 7000, 10000}; //обьявляем массив (значение времени срабатывания)
unsigned long int timer = 0; //обьявляем переменную таймер и то что она равно 0
unsigned long int time1; //обьявляем переменную для миллис()

//клавиатура
const byte ROWS = 4;  //  количество рядов
const byte COLS = 4;  //  количество столбцов
char keys[ROWS][COLS] = { // определяем массив символов соответствующий распределению кнопок на клавиатуре:
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'#', '0', '*', 'D'}
};
  byte rowPins[ROWS] = {47, 46, 45, 44};
  byte colPins[COLS] = {43, 42, 41, 40};
  Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
  //клавиатура
void setup()
{
  Serial.begin(9600);
  //колбы
  pinMode(flask1, OUTPUT); //указываем что Pin 22 это выход
  pinMode(flask2, OUTPUT); //указываем что Pin 23 это выход
  digitalWrite(flask1, LOW);
  digitalWrite(flask2, LOW);
  //монитор
  lcd.begin(16, 2);              //иницилизируем(16 столбов, 2 строчки)
  lcd.setCursor(0, 0);
  lcd.print("start:");       // Набор текста на первой строке
  lcd.setCursor(0, 1);             // Установка курсора в начало первой строки
  lcd.print("time:");       // Набор текста на первой строке
  //монитор
}

void loop()
{
char key = keypad.getKey();//указываем что key хранит нажатие
  if (key == 'A') //нажата кнопка А
  {
     lcd.setCursor(0, 0);
     lcd.print("start:ON ");
     time1 = millis();
   if (time1 - timer >= timeArray[0]) // если больше или равно 2000 милисекунд
  {
    digitalWrite(flask2, HIGH); //отключает колбу 2 через 2 с. работы
  }

  if  (time1 - timer >= timeArray[1]) // если больше или равно 5000 милисекунд
  {
    digitalWrite(flask2, LOW); //включаем колбу2  на 5с работы
  }

if (time1 - timer >= timeArray[2]) // если больше или равно 7000 милисекунд
  {
    digitalWrite(flask1, HIGH); //отключаем колбу1  на 7с работы
  }

if (time1 - timer >= timeArray[3]) //включаем колбу1 на 10с работы(т.е через 3 секунды)
  {
    digitalWrite(flask1, LOW);
    timer = millis();
  }
  }
}
Через bool пробовал сохранять флаг при нажатии, тоже не получилось.
Заранее всем спасибо за ответы, какой бы он не был:)
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,188
1,280
Москва
Ты и рассказчик из новичков видимо :D Мало что понял.
1) Для начала хорошо бы схему показать как все подсоединено.
2) Опиши как должно работать и как реально работает. Для начала только с одним клапаном/колбой. Хотя при чем тут колбы непонятно.
Подсказки: У клапана есть 2 состояния. открыто и закрыта. у кнопки тоже есть 2 состояния нажата и отпущена. И еще есть изменения кнопки - кнопка нажалась и кнопка отпустилась. Типичная проблема неверная отработка нажатий и отпусканий, поэтому попробуй нажать нужную кнопку и держать ее нажатой. Что то изменилось в работе клапанов ?
Еще совет. Забудь пока основной скетч. возьми новый пустой, подключи библиотеки и напиши программу управления клапанами только в ручном режиме от кнопки. Проще сделать так: нажал отпустил "1" включил 1-ый клапан. нажал-отпустил "2" ВЫключил 1-ый клапан. На другие кнопки второй. Потом добавляй зависимости друг от друга и от автоматики
 
  • Лойс +1
Реакции: Праздник:)

Праздник:)

✩✩✩✩✩✩✩
30 Июл 2020
5
0
Ты и рассказчик из новичков видимо :D Мало что понял.
1) Для начала хорошо бы схему показать как все подсоединено.
2) Опиши как должно работать и как реально работает. Для начала только с одним клапаном/колбой. Хотя при чем тут колбы непонятно.
Подсказки: У клапана есть 2 состояния. открыто и закрыта. у кнопки тоже есть 2 состояния нажата и отпущена. И еще есть изменения кнопки - кнопка нажалась и кнопка отпустилась. Типичная проблема неверная отработка нажатий и отпусканий, поэтому попробуй нажать нужную кнопку и держать ее нажатой. Что то изменилось в работе клапанов ?
Еще совет. Забудь пока основной скетч. возьми новый пустой, подключи библиотеки и напиши программу управления клапанами только в ручном режиме от кнопки. Проще сделать так: нажал отпустил "1" включил 1-ый клапан. нажал-отпустил "2" ВЫключил 1-ый клапан. На другие кнопки второй. Потом добавляй зависимости друг от друга и от автоматики
Так...в общем опишу с запуск работы без клавиатуры. Как подаем питание на плату включаются 2 клапана(первый и второй назовем так), потом через 2 секунды отключается 2й клапан, первый продолжает работать, еще через 3 сек включается обратно второй, а еще через 2 сек отключается 1 клапан(т.е он проработал 7 сек), еще через 3сек(на 10сек) включается обратно первый клапан:) и мы возвращаемся в начало...опять 2сек вместе работают и через 2 сек отключается 2й клапан, т.е пошли по кругу.
Без управления клавиатуры и т.д работает прекрасно, как пытаюсь управлять с клавиатуры - не работает прекрасно:)
Клавишу нажимал и держал-ноль реакции, а когда начинаешь многократно тыкать(тыкнул 2 раза отключилась вторая колба, еще 4 раза включилась обратно) т.е клики по клавиатуре начинают работать, как миллисекунды без клавиатуры:) как то странно:(
а теперь то что требуется от клавиатуры на данный момент - хотя бы запустить это по нажатию кнопки А, и стоп по кнопке В.
Видео не загружает:(
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,188
1,280
Москва
Твой код будет работать только если нажата кнопка А. если кнопка А не нажата , то вообще ничего не будет работать. У тебя вся работа внутри условия. Так пустой цикл может выполняться 200 000 раз в секунду. Т.е. кнопку нажал , отпустил, А в буфере, считал А, 1 раз выполнил цикл и все, буфер чист, ничего не работает. Ты читаешь клавиатуру - забываешь то, что было нажата ранее. не 200 тысяч раз, а тысяч 100 в секунду ты затираешь key
 
  • Лойс +1
Реакции: Праздник:)

Праздник:)

✩✩✩✩✩✩✩
30 Июл 2020
5
0
Твой код будет работать только если нажата кнопка А. если кнопка А не нажата , то вообще ничего не будет работать. У тебя вся работа внутри условия. Так пустой цикл может выполняться 200 000 раз в секунду. Т.е. кнопку нажал , отпустил, А в буфере, считал А, 1 раз выполнил цикл и все, буфер чист, ничего не работает. Ты читаешь клавиатуру - забываешь то, что было нажата ранее. не 200 тысяч раз, а тысяч 100 в секунду ты затираешь key
в том то и дело( когда нажата тоже не работает. а для запоминания bool flag использовать? Использовал( не помогло. Или другое решение есть?
Спастбо за ответы:)
 

Праздник:)

✩✩✩✩✩✩✩
30 Июл 2020
5
0
Ну покажи рабочий код сюда, который без клавиатуры.
вот, он сразу начинает работать, без кнопок и т.д. при подаче питания на плату
без клавиатуры:
#define flask1 22 //задаем выход на плате
#define flask2 23
int timeArray[]={2000,5000,7000,10000};//обьявляем массив (значение времени срабатывания)
unsigned long int timer=0; //обьявляем переменную таймер и то что она равно 0
unsigned long int time1; //обьявляем переменную для миллис()

void setup()
{
  pinMode(flask1, OUTPUT); //указываем что Pin 22 это выход
  pinMode(flask2, OUTPUT); //указываем что Pin 23 это выход
  digitalWrite(flask1, LOW); //указываем что что колба с начала работы включена
  digitalWrite(flask2, LOW); //указываем что что колба с начала работы включена
}

void loop()
{


      time1 = millis();  // указываем что переменная хранит время
      if (time1 - timer >= timeArray[0]) // если больше или равно 2000 милисекунд 
      {
        digitalWrite(flask2, HIGH); //отключает колбу 2 через 2 с. работы
      }
      if (time1 - timer >= timeArray[1])  // если больше или равно 5000 милисекунд 
      {
        digitalWrite(flask2, LOW); //включаем колбу2  на 5с работы
      }
      if (time1 - timer >= timeArray[2]) // если больше или равно 7000 милисекунд
      {
        digitalWrite(flask1, HIGH); //отключаем колбу1  на 7с работы
      }
      if (time1 - timer >= timeArray[3]) //включаем колбу1 на 10с работы(т.е через 3 секунды)
      {
        digitalWrite(flask1, LOW);
        timer=millis();
      }
  
  

}
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,188
1,280
Москва
На 1-ый взгляд разница только в использовании клавиатуры, значит ошибка и есть там
что можно по быстрому попробовать:
C++:
void loop()
{
static bool f=false;
char key = keypad.getKey();//указываем что key хранит нажатие
if (key == 'A') f=true;
if (key == 'B') f=false;
if (f)
{
      time1 = millis();  // указываем что переменная хранит время
      if (time1 - timer >= timeArray[0]) // если больше или равно 2000 милисекунд
      {
        digitalWrite(flask2, HIGH); //отключает колбу 2 через 2 с. работы
      }
      if (time1 - timer >= timeArray[1])  // если больше или равно 5000 милисекунд
      {
        digitalWrite(flask2, LOW); //включаем колбу2  на 5с работы
      }
      if (time1 - timer >= timeArray[2]) // если больше или равно 7000 милисекунд
      {
        digitalWrite(flask1, HIGH); //отключаем колбу1  на 7с работы
      }
      if (time1 - timer >= timeArray[3]) //включаем колбу1 на 10с работы(т.е через 3 секунды)
      {
        digitalWrite(flask1, LOW);
        timer=millis();
      }
}   
}
 
  • Лойс +1
Реакции: Праздник:)

Праздник:)

✩✩✩✩✩✩✩
30 Июл 2020
5
0
На 1-ый взгляд разница только в использовании клавиатуры, значит ошибка и есть там
что можно по быстрому попробовать:
C++:
void loop()
{
static bool f=false;
char key = keypad.getKey();//указываем что key хранит нажатие
if (key == 'A') f=true;
if (key == 'B') f=false;
if (f)
{
      time1 = millis();  // указываем что переменная хранит время
      if (time1 - timer >= timeArray[0]) // если больше или равно 2000 милисекунд
      {
        digitalWrite(flask2, HIGH); //отключает колбу 2 через 2 с. работы
      }
      if (time1 - timer >= timeArray[1])  // если больше или равно 5000 милисекунд
      {
        digitalWrite(flask2, LOW); //включаем колбу2  на 5с работы
      }
      if (time1 - timer >= timeArray[2]) // если больше или равно 7000 милисекунд
      {
        digitalWrite(flask1, HIGH); //отключаем колбу1  на 7с работы
      }
      if (time1 - timer >= timeArray[3]) //включаем колбу1 на 10с работы(т.е через 3 секунды)
      {
        digitalWrite(flask1, LOW);
        timer=millis();
      }
} 
}
ОГРОМНОЕ СПАСИБО Добрый человек:) все заработало...все оказалось так просто:) А я флаги по другому писал, а теперь знаю, что и так можно:) СПАСИБО!)
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,188
1,280
Москва
Ну раз столько спасибо, то вот тебе еще одна схема, должна работать так же, но с одной кнопкой. Вот эти 2 строки:
C++:
if (key == 'A') f=true;
if (key == 'B') f=false;
замени на одну такую:
C++:
if (key == 'A') f=!f;