Что не так с кодом кнопок?

moskovskiy82
Offline
Зарегистрирован: 16.08.2015


Друг распаял для меня плату кухонной вытяжки.
У нее 4 кнопки.
Необходимо чтобы d2 просто включало выключало свет через реле 2
 
А вот кнопки d3 и d4 рулят первым реле - включая его на 30 минут и час.
Код компилируется но увы ничего не происходит

#include <Arduino.h>
//для удобства обзываем выводы
#define rel1 11 //вывод на реле вытяжки
#define rel2 12 //вывод на реле света

void setup()
{
pinMode(2, INPUT_PULLUP); //сообщаем ардуине о том, что
pinMode(3, INPUT_PULLUP); //пины 2-4 используются как
pinMode(4, INPUT_PULLUP); //кнопки с внутренней подтяжкой
pinMode(13, OUTPUT); //тестовый вывод; будет зажигаться в режиме ожидания
pinMode(11, OUTPUT); //реле вытяжки
pinMode(12, OUTPUT); //реле света
}

void loop()
{
int btn2 = digitalRead(2); //кнопка2, вход D2
int btn3 = digitalRead(3); //кнопка3, вход D3
int btn4 = digitalRead(4); //кнопка4, вход D4
int btn4state = 0; //хранилище текущего стейта кнопки
int btn4state_old = 0; //хранилище прошлого состояния кнопки
int lightstate = 0; //переменная, в которую мы кладём статус света

begin:

if (btn2 == HIGH) //если кнопка 2 отпущена
{
digitalWrite(rel1, LOW); //то ничего не делаем
if (btn3 == HIGH) //если кнопка 3 отпущена
{
digitalWrite(rel1, LOW); //то ничего не делаем
btn4state = btn4;
if ((btn4state == LOW) && (btn4state_old == HIGH)) //если кнопка 4 нажата, а до этого была отпущена
{
lightstate = 1 - lightstate; //то делаем магию
delay(50); //защита от дребезга кнопки
}
btn4state_old = btn4state; //теперь значение btn4 старое, записываем
if (lightstate == 1) //если lightstate стал равен одному
{
digitalWrite(13, HIGH); //то включаем свет
}
else
{
digitalWrite(13, LOW); //если нет, выключаем
goto begin;
}
}
else
{
digitalWrite(rel1, HIGH); //врубаем вытяжку
delay(3600000); //ждем час
digitalWrite(rel1, LOW); //вырубаем
goto begin;
}
}
else
{
digitalWrite(rel1, HIGH); //врубаем вытяжку
delay(1800000); //ждем 30 минут
digitalWrite(rel1, LOW); //вырубаем
goto begin;
}
goto begin;
}

 

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

Команда goto не дает опрашивать состояния кнопок.

Куто вас вообще надоумил?

Да и с вложенными условиями у вас похоже что-то не то...

Misha87
Offline
Зарегистрирован: 10.06.2015

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

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

Misha87 пишет:

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

жмёшь кпопы и оно работает.

moskovskiy82
Offline
Зарегистрирован: 16.08.2015

Станднртаная кухонная вытяжка из котороый был выкинут вентилятор (стоит приточка).

По результатам переделки - есть 4 кнопки (используем пока 3) и два реле (220В)

Одно реле отвечает rel2 отвечает как на всех вытяжках за освещение. Т.е нажал кнопку btn4 - свет есть. Нажал - света нет.

Второе реле rel 1 подает 220В на клапан вентиляции (при подаче закрывается - отрубая другие ветки).

И вот по нажатию кнопки btn2 и btn3 подает напряжение на 1ое реле на полчаса и час соответсвенно.

Misha87
Offline
Зарегистрирован: 10.06.2015

то есть 4 кнопки....

первая - включает и выключает реле

вторая - включает и выключает клапан вытяжки

третья - включает клапан вытяжки на пол часа

четвертая - включает клапан вытяжки на час

 

я правильно все понял?????

moskovskiy82
Offline
Зарегистрирован: 16.08.2015

Да.

Но "вторая - включает и выключает клапан вытяжки" - сейчас в коде не прописана

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

а если вытяжка уже работает (по кнопкам 2-4, неважно кто инициатор), и повторно нажата кнопка 2 или 3, то что делать? Остановить или продлить еще на полчаса/час?

moskovskiy82
Offline
Зарегистрирован: 16.08.2015

На самом деле не так важно. Сейчас бы запустить базовый функционал.

В идеале думаю - продлить на полчаса.

Отменить все и вернутся в исходное состояние думаю как раз будет со временем 4я кнопка

moskovskiy82
Offline
Зарегистрирован: 16.08.2015

Получился вот такой код

 

enum { nkinds=2, debounced=5 }; // # of activity kinds;  debounce-criterion
const byte outPins[nkinds] = {11}; // Output pin numbers
const byte inPins[nkinds]  = {2, 3}; // Input pin numbers
const unsigned int actLens[nkinds] = {1800000, 3600000}; // Activity lengths, ms
byte states[nkinds] = {0, 0};
unsigned long actEnds[nkinds] = {0, 0};
int lightState = 0;
const int lightPin = 4;
const int lightrelePin =  13;


void setup() {
// Set input/output modes of pins
  for (byte i=0; i<nkinds; ++i) {
    pinMode(outPins[i], OUTPUT);
    pinMode(inPins[i], INPUT);
  }
  pinMode(lightrelePin, OUTPUT);
  pinMode(lightPin, INPUT);
}

// Once per millisecond, for each kind of activity
// check for new beginning or deal with ongoing action
void loop() {
  lightState = digitalRead(lightPin);
  if (lightState == HIGH) {
    digitalWrite(lightrelePin, HIGH);  
  } 
  else {
    // turn LED off:
    digitalWrite(lightrelePin, LOW); 
  }
  
  unsigned long now = millis();
  for (byte i=0; i<nkinds; ++i) {
    if (states[i] < debounced) {  // Is activity off?
      // It's off, look for a turnon
      if (digitalRead(inPins[i])) {
        ++states[i];        // Button is closed at the moment
        // See if button has been debounced
        if (states[i] >= debounced) { // If so, start its action
          digitalWrite(outPins[i], HIGH);
          actEnds[i] = now + actLens[i];
        }
      }
      else {
        states[i] = 0;      // Button is not closed at moment
      }
    }
    else { // It's on, see if end-time has arrived
      if (now >= actEnds[i]) {
        digitalWrite(outPins[i], LOW); // Clear output when done
        states[i] = 0;        // Return to button-seeking state
      }
    }
  }
  while (now == millis()) {};       // Finish current millisecond
}

 

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

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

for (byte i=0; i<nkinds; ++i) {
pinMode(outPins[i], OUTPUT);

При таком раскладе получаем обращение к outPins[1], т.е. второму элементу массива, а у тебя изначально задан только один элемент: {11}.

Аналогично обращаемся всегда ко второму элементу states[i] , но никогда не используем первый элемент. Зачем тогд тратить под него память? 

 

moskovskiy82
Offline
Зарегистрирован: 16.08.2015

В примере изначально был массив из 3х элекментов. 3 кнопки - 3события на выводе. У меня же элемент один.

Здесь проблемы только в чистоте кода - или все таки код получается рабчоим?