Вытяжка в ванную.... помогите!!!

Monarch1986
Offline
Зарегистрирован: 18.12.2018

Всем првиет!!! 

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

Просмотрел много тем на форуме, и ничего не получилось... Помогите... 

Нарботок совсем нет. Знания в Си оч слабые.

Всем заранее спасибо!!!

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

Ничего не получилось или ничего не делал?

Monarch1986
Offline
Зарегистрирован: 18.12.2018
int BUTTON=0;
void setup ()
{
pinMode(13,OUTPUT);
pinMode(12,OUTPUT);
pinMode(9,INPUT);
pinMode(8,INPUT);
Serial.begin (9600);
}

void loop ()
{
  
Serial.println (BUTTON);

if(digitalRead(8)==HIGH&&BUTTON==0)//если кнопка нажата
// и перемення "BUTTON" равна 0 , то ...
{
delay(50);//защита от дребезга
BUTTON++;//пишем 1 в переменную кнопка
//это нужно для того что бы с каждым нажатием кнопки
//происходило только одно действие

digitalWrite(13, !digitalRead(13));//меняем значение порта на противоположное
}
  if(digitalRead(8)==LOW&&BUTTON==1)//если кнопка НЕ нажата
//и переменная knopka равна - 1 ,то ...
{

BUTTON=0;
}

} 

 

 

Monarch1986
Offline
Зарегистрирован: 18.12.2018

получалось както коряво все. вот сейчас сдела что одной кнопкой включает и выключается

Monarch1986
Offline
Зарегистрирован: 18.12.2018

вот надо сюда как то доабвить что б 10 минут работала

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

Monarch1986 пишет:
включалась на 15 минут
Monarch1986 пишет:
вот надо сюда как то доабвить что б 10 минут работала
Требования уже изменились? Что ещё поменялось?

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

5 минут разгоняется...

vdm
vdm аватар
Offline
Зарегистрирован: 29.08.2016

почему бы не поискать "Таймер Ноотехника для санузлов БЗТ-300-СУ"?

из минусов цена (530 руб) и вреря раьоты вытяжки (5 мин),

из плюсов - уже все готово.

vdm
vdm аватар
Offline
Зарегистрирован: 29.08.2016

Ну, если уж городить огород, то думаю, нужно сделать следующее:

1. Определение наличия напряжения в сети на лампу освещения:

http://arduino.ru/forum/apparatnye-voprosy/nuzhno-otslezhivat-nalichie-220-volt-na-linii#comment-237580

http://arduino.ru/forum/apparatnye-voprosy/nuzhno-otslezhivat-nalichie-220-volt-na-linii#comment-237805

2. для управления вентилятором можно использовать:

1. Механическое реле

Ссылку не даю, мне не интересно так как счелкает громко.

2. Твердотельное реле.

Можно такую:

https://ru.aliexpress.com/item/SSR-40AA-H-40A-Solid-State-Relay-Module-80-280V-AC-90-480V-Aluminum-Heat-Sink/32820082177.html?spm=a2g0v.search0604.3.16.4b5537cczFmWmp&ws_ab_test=searchweb0_0,searchweb201602_1_10065_10068_5730211_319_317_5729711_10696_453_10084_454_10083_10618_10307_10301_538_537_536_10059_10884_10889_10887_100031_321_322_10915_10103_10914_10911_10910-10889,searchweb201603_51,ppcSwitch_0&algo_expid=6964e733-674b-430d-8e3a-7f5cd7fb2fbe-2&algo_pvid=6964e733-674b-430d-8e3a-7f5cd7fb2fbe

Или вот такую. Эта мне больше нравится тем, что она меньше. Но стоит ли заморачиваться на размерах.

https://ru.aliexpress.com/item/5PCS-Relay-Module-G3MB-202P-G3MB-202P-DC-AC-PCB-SSR-In-5V-DC-Out-240V/32827372038.html?spm=a2g0v.search0604.3.2.4e8858caIeWKQg&ws_ab_test=searchweb0_0,searchweb201602_1_10065_10068_5730211_319_317_5729711_10696_453_10084_454_10083_10618_10307_10301_538_537_536_10059_10884_10889_10887_100031_321_322_10915_10103_10914_10911_10910-10889,searchweb201603_51,ppcSwitch_0&algo_expid=f2ff5be7-8b19-4119-a32d-96bcc763e03b-0&algo_pvid=f2ff5be7-8b19-4119-a32d-96bcc763e03b

После выбора железа займемся скетчем.
 
ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

Да, в 530 рубликов пожалуй не уложиться

Monarch1986
Offline
Зарегистрирован: 18.12.2018

ЕвгенийП пишет:

Monarch1986 пишет:
включалась на 15 минут
Monarch1986 пишет:
вот надо сюда как то доабвить что б 10 минут работала
Требования уже изменились? Что ещё поменялось?

время не столько критично. главно саму идею релизовать

Monarch1986
Offline
Зарегистрирован: 18.12.2018

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

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Monarch1986 пишет:

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

либо книшки читай из песочницы, если сам хочешь сделать, либо в "Ищу исполнителя" за деньги, либо забей. 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

либо ознакомиться 

http://lurkmore.to/%D0%A0%D0%B0%D0%B4%D0%B8%D0%BE%D0%BB%D1%8E%D0%B1%D0%B...

и идти...

Monarch1986
Offline
Зарегистрирован: 18.12.2018

DetSimen пишет:

либо ознакомиться 

http://lurkmore.to/%D0%A0%D0%B0%D0%B4%D0%B8%D0%BE%D0%BB%D1%8E%D0%B1%D0%B...

и идти...

ccылка не открывается.... 

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

Если даже эта ссылка не открывается, то у вас очень мало шансов дойти до финала.

Baks
Baks аватар
Offline
Зарегистрирован: 11.01.2016

ссылку банит реалком

вот вам другая ссылка http://arduino.ru/forum

в верху пишите в строке поика слово "вытяжка", выдаст кучу готовых проектов

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

Monarch1986 пишет:
Нарботок совсем нет. Знания в Си оч слабые.

На этапе постановки задачи - никаких знаний с++ не требуется. Надо просто, человеческими словами, описать шаг за шагом действия, которых Вы ожидаете от программы.

Что-то типа:

* нажали кнопку:

- проверяем, был ли включен вентилятор до этого:

    если был - то выключаем его

   если не был - включаем

 

Monarch1986
Offline
Зарегистрирован: 18.12.2018

спасибо. алгоритм я умею составлять

bwn
Offline
Зарегистрирован: 25.08.2014

Monarch1986 пишет:

спасибо. алгоритм я умею составлять

Странно, а в чем тогда проблема, перевести правильно составленный алгоритм в машинный язык? 
Правильный алгоритм - 80% написания программы. Осталось человеческие термины заменить на языковые конструкции понятные компилятору. ИМХО.

IgorR
Offline
Зарегистрирован: 03.04.2018

Ну вот приблизительно так. За основу взят Ваш код, внесены правки. Проверено - работает.

// Вытяжка в ванную.... помогите!!!

// Подразумевается, что нажатая кнопка - это HIGH

// на самом деле лучше использовать внутреннюю подтяжку пина:  pinMode(8, INPUT_PULLUP);
// в этом случае несколько проще схемотехническое решение получается. И логика в программе немножко изменится:
// нажатие кнопки будет LOW 

int BUTTON = 0;
boolean lPressed = false;     // флажок нажатия кнопки
boolean lON = false;          // включить/выключить механизьму

void setup ()
{
  pinMode(13, OUTPUT);
  pinMode(12, OUTPUT);    // Это где используем?
  pinMode(9, INPUT);      // Это где используем?
  pinMode(8, INPUT);
  Serial.begin (9600);
}

void loop ()
{

  Serial.println (BUTTON);  // Выводим в порт количество обработанных нажатий кнопки - чисто для информации


  //if (digitalRead(8) == HIGH && BUTTON == 0) //если кнопка нажата

  if (digitalRead(8) == HIGH && !lPressed)
  { //если кнопка нажата и нажатие еще не обрабатывалось ( !lPressed)
    // и переменная "BUTTON" равна 0 , то ...
    delay(50);    //защита от дребезга
    if (digitalRead(8) == HIGH)       // снова проверяем состояние кнопки и если она все еще нажата - считаем, что нажатие состоялось успешно
    {
      lPressed = true;    // запомним, что кнопка нажата
      lON = !lON;         // изменим выполняемое действие

      BUTTON++;                   //пишем 1 в переменную кнопка - УВЕЛИЧИВАЕМ НА ЕДИНИЦУ!!!

      //digitalWrite(13, !digitalRead(13)); // меняем значение порта на противоположное
      digitalWrite(13, lON);                // Выполняем нужное действо
    }
  }
  // Теперь ловим, когда кнопка отожмется
  // Поскольку мы договорились, что нажатая кнопка - это HIGH, то удобно делать это, просто считывая состояние порта

  lPressed = digitalRead(8);

  /*
    if (digitalRead(8) == LOW && BUTTON == 1) //если кнопка НЕ нажата
    //и переменная knopka равна - 1 ,то ...
    {

    BUTTON = 0;
    }
  */
}

 

Monarch1986
Offline
Зарегистрирован: 18.12.2018

IgorR пишет:

Ну вот приблизительно так. За основу взят Ваш код, внесены правки. Проверено - работает.

// Вытяжка в ванную.... помогите!!!

// Подразумевается, что нажатая кнопка - это HIGH

// на самом деле лучше использовать внутреннюю подтяжку пина:  pinMode(8, INPUT_PULLUP);
// в этом случае несколько проще схемотехническое решение получается. И логика в программе немножко изменится:
// нажатие кнопки будет LOW 

int BUTTON = 0;
boolean lPressed = false;     // флажок нажатия кнопки
boolean lON = false;          // включить/выключить механизьму

void setup ()
{
  pinMode(13, OUTPUT);
  pinMode(12, OUTPUT);    // Это где используем?
  pinMode(9, INPUT);      // Это где используем?
  pinMode(8, INPUT);
  Serial.begin (9600);
}

void loop ()
{

  Serial.println (BUTTON);  // Выводим в порт количество обработанных нажатий кнопки - чисто для информации


  //if (digitalRead(8) == HIGH && BUTTON == 0) //если кнопка нажата

  if (digitalRead(8) == HIGH && !lPressed)
  { //если кнопка нажата и нажатие еще не обрабатывалось ( !lPressed)
    // и переменная "BUTTON" равна 0 , то ...
    delay(50);    //защита от дребезга
    if (digitalRead(8) == HIGH)       // снова проверяем состояние кнопки и если она все еще нажата - считаем, что нажатие состоялось успешно
    {
      lPressed = true;    // запомним, что кнопка нажата
      lON = !lON;         // изменим выполняемое действие

      BUTTON++;                   //пишем 1 в переменную кнопка - УВЕЛИЧИВАЕМ НА ЕДИНИЦУ!!!

      //digitalWrite(13, !digitalRead(13)); // меняем значение порта на противоположное
      digitalWrite(13, lON);                // Выполняем нужное действо
    }
  }
  // Теперь ловим, когда кнопка отожмется
  // Поскольку мы договорились, что нажатая кнопка - это HIGH, то удобно делать это, просто считывая состояние порта

  lPressed = digitalRead(8);

  /*
    if (digitalRead(8) == LOW && BUTTON == 1) //если кнопка НЕ нажата
    //и переменная knopka равна - 1 ,то ...
    {

    BUTTON = 0;
    }
  */
}

 

а как сделать что бы определенное время работала?

IgorR
Offline
Зарегистрирован: 03.04.2018

А, точно, забыл, что нужно делать выдержку. Ща соображу, погоди.

IgorR
Offline
Зарегистрирован: 03.04.2018

Вот с контролем времени. Лишнее подчистил.

// Вытяжка в ванную.... помогите!!!

// Подразумевается, что нажатая кнопка - это HIGH

// на самом деле лучше использовать внутреннюю подтяжку пина:  pinMode(8, INPUT_PULLUP);
// в этом случае несколько проще схемотехническое решение получается. И логика в программе немножко изменится:
// нажатие кнопки будет LOW 


#define LIGHT_TIME 900000L  // 15 * 60 * 1000 миллисекунд 

int BUTTON = 0;
boolean lPressed = false;     // флажок нажатия кнопки
boolean lON = false;          // включить/выключить механизьму
long start_ON_Time = 0;       // время включения (мсек)

void setup ()
{
  pinMode(13, OUTPUT);
  pinMode(12, OUTPUT);    // Это где используем?
  pinMode(9, INPUT);      // Это где используем?
  pinMode(8, INPUT);
  Serial.begin (9600);
}

void loop ()
{

  Serial.println (BUTTON);  // Выводим в порт количество обработанных нажатий кнопки - чисто для информации

  if (digitalRead(8) == HIGH && !lPressed)
  { //если кнопка нажата и нажатие еще не обрабатывалось ( !lPressed)
    delay(50);    //защита от дребезга
    if (digitalRead(8) == HIGH)       // снова проверяем состояние кнопки и если она все еще нажата - 
                                      // считаем, что нажатие состоялось успешно
    {
      lPressed = true;    // запомним, что кнопка нажата
      lON = !lON;         // изменим выполняемое действие

      BUTTON++;                               // УВЕЛИЧИВАЕМ НА ЕДИНИЦУ!!!

      digitalWrite(13, lON);                  // Выполняем нужное действо
      if (lON) start_ON_Time = millis();      // Засекаем время включения
    }
  }
  
  // Теперь ловим, когда кнопка отожмется
  // Поскольку мы договорились, что нажатая кнопка - это HIGH, 
  // то удобно делать это, просто считывая состояние порта

  lPressed = digitalRead(8);

  // Проверяем, а не пора ли сушить весла

  if (lON && (millis() - start_ON_Time > LIGHT_TIME))
  {
    // условие выполняется только если свет включен и прошло много времени.
    // на самом деле, тут нужна немного более сложная проверка, потому что раз в ~2 суток счетчик миллисекунд 
    // переполняется и начинает отсчет с нуля. Поэтому, если включение произошло менее, чем за 15 минут до этого
    // переполнения - есть риск, что свет сам не выключится никогда :)
    
    lON = false;
    digitalWrite(13, lON);                // Выполняем нужное действо
  }

}

 

Monarch1986
Offline
Зарегистрирован: 18.12.2018

IgorR пишет:

Вот с контролем времени. Лишнее подчистил.

// Вытяжка в ванную.... помогите!!!

// Подразумевается, что нажатая кнопка - это HIGH

// на самом деле лучше использовать внутреннюю подтяжку пина:  pinMode(8, INPUT_PULLUP);
// в этом случае несколько проще схемотехническое решение получается. И логика в программе немножко изменится:
// нажатие кнопки будет LOW 


#define LIGHT_TIME 900000L  // 15 * 60 * 1000 миллисекунд 

int BUTTON = 0;
boolean lPressed = false;     // флажок нажатия кнопки
boolean lON = false;          // включить/выключить механизьму
long start_ON_Time = 0;       // время включения (мсек)

void setup ()
{
  pinMode(13, OUTPUT);
  pinMode(12, OUTPUT);    // Это где используем?
  pinMode(9, INPUT);      // Это где используем?
  pinMode(8, INPUT);
  Serial.begin (9600);
}

void loop ()
{

  Serial.println (BUTTON);  // Выводим в порт количество обработанных нажатий кнопки - чисто для информации

  if (digitalRead(8) == HIGH && !lPressed)
  { //если кнопка нажата и нажатие еще не обрабатывалось ( !lPressed)
    delay(50);    //защита от дребезга
    if (digitalRead(8) == HIGH)       // снова проверяем состояние кнопки и если она все еще нажата - 
                                      // считаем, что нажатие состоялось успешно
    {
      lPressed = true;    // запомним, что кнопка нажата
      lON = !lON;         // изменим выполняемое действие

      BUTTON++;                               // УВЕЛИЧИВАЕМ НА ЕДИНИЦУ!!!

      digitalWrite(13, lON);                  // Выполняем нужное действо
      if (lON) start_ON_Time = millis();      // Засекаем время включения
    }
  }
  
  // Теперь ловим, когда кнопка отожмется
  // Поскольку мы договорились, что нажатая кнопка - это HIGH, 
  // то удобно делать это, просто считывая состояние порта

  lPressed = digitalRead(8);

  // Проверяем, а не пора ли сушить весла

  if (lON && (millis() - start_ON_Time > LIGHT_TIME))
  {
    // условие выполняется только если свет включен и прошло много времени.
    // на самом деле, тут нужна немного более сложная проверка, потому что раз в ~2 суток счетчик миллисекунд 
    // переполняется и начинает отсчет с нуля. Поэтому, если включение произошло менее, чем за 15 минут до этого
    // переполнения - есть риск, что свет сам не выключится никогда :)
    
    lON = false;
    digitalWrite(13, lON);                // Выполняем нужное действо
  }

}

 

 

залил... чет по времени не отключается:(((

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Может так

bool BUTTON = 0;
uint32_t time;
bool f_run=0;

void setup ()
{
  pinMode(13,OUTPUT);
  pinMode(12,OUTPUT);
  pinMode(9,INPUT);
  pinMode(8,INPUT);
  Serial.begin (9600);
}

void loop ()
{
  Serial.println (BUTTON);

  if(digitalRead(8)==HIGH && !f_run)//если кнопка нажата
    // и перемення "BUTTON" равна 0 , то ...
  {
    delay(50);//защита от дребезга
    if(digitalRead(8)){
      f_run=1;
      time = millis();
      BUTTON=1;
    }
  } 

  if(BUTTON && millis()-time >= 10000)//Стоит 10 секунд - 
  {
    digitalWrite(13, LOW);
    BUTTON = 0;
    f_run = 0;
  }

  if (digitalRead(8) && f_run)
  {
    delay(50);
    if(digitalRead(8)){
      f_run=0;
      BUTTON=0;
    }
  }
 
  digitalWrite(13, BUTTON);//

 

IgorR
Offline
Зарегистрирован: 03.04.2018

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

#define LIGHT_TIME 5000L  // 5 секунд 
 
qwone
qwone аватар
Онлайн
Зарегистрирован: 03.07.2016

Monarch1986 пишет:
Решил сделать вытяжку в ванной, но что б при нажатии кнопки (возвратная) вытяжка включалась на 15 минут,  но когда она работает нажимаешь кнопку и вытяжку принудительно можно было отключить...
Решается задача влет ипользуя принцип автомата. Устройство может быть в двух состояниях откл и вкл. Воспользуемся автоматом Пуха

/**/
enum state_t {sOFF = 0, sON} state;
void stand (state_t s) {
  state = s;
  switch (state) {
    case sOFF:
      break;
    case sON:
      break;
  }
}
//-----------------------------
void setup() {


}

void loop() {
  switch (state) {
    case sOFF:
      break;
    case sON:
      break;
  }
}

 

qwone
qwone аватар
Онлайн
Зарегистрирован: 03.07.2016

Автомат не только меняет состояние но и вкл(выкл) лампу

/**/
const byte LedPin =/*пин лампы*/13;
enum state_t {sOFF = 0, sON} state;
void stand (state_t s) {
  state = s;
  switch (state) {
    case sOFF:
      break;
      digitalWrite(LedPin, LOW);
    case sON:
      break;
      digitalWrite(LedPin, HIGH);
  }
}
//-----------------------------
void setup() {
  pinMode(LedPin, OUTPUT);
  stand(sOFF);
}

void loop() {
  switch (state) {
    case sOFF:
      break;
    case sON:
      break;
  }
}

 

qwone
qwone аватар
Онлайн
Зарегистрирован: 03.07.2016

Теперь подлючим кнопку, что бы вкл и выключало.

/**/
const byte LedPin =/*пин лампы*/13;
const byte btnPin =/*пин кнопки*/2;
bool btn;/**/

enum state_t {sOFF = 0, sON};
state_t state;
void stand(state_t s) {
  state = s;
  switch (state) {
    case sOFF:
      digitalWrite(LedPin, LOW);
      break;
    case sON:
      digitalWrite(LedPin, HIGH);
      break;
  }
}

//-----------------------------
void setup() {
  pinMode(LedPin, OUTPUT);
  stand(sOFF);
  pinMode(btnPin, INPUT_PULLUP);
  btn=digitalRead(btnPin);
}

void loop() {
  switch (state) {
    case sOFF:
      break;
    case sON:
      break;
  }
  switch (digitalRead(btnPin)) {
    case 0:
      if (btn) {
        btn = 0;
        delay(50);
        if (state == sOFF) stand(sON);/*если темно вкл*/
        else stand(sOFF);/*если темно отключить*/
      }
      break;
    case 1:
      if (!btn) {
        btn = 1;
        delay(50);
      }
      break;
  }
}

 

qwone
qwone аватар
Онлайн
Зарегистрирован: 03.07.2016

Ну и наконец добавим время отключения при горящем свете.

/**/
const byte LedPin =/*пин лампы*/13;
const byte btnPin =/*пин кнопки*/2;
const unsigned long time5s = 5000; /*время 5 секунд*/
unsigned long past;
enum state_t {sOFF = 0, sON};
state_t state;
void stand(state_t s) {
  state = s;
  past = millis();
  switch (state) {
    case sOFF:
      digitalWrite(LedPin, LOW);
      break;
    case sON:
      digitalWrite(LedPin, HIGH);
      break;
  }
}
bool btn;/*состояние кнопки*/
bool readBtn() {
  return digitalRead(btnPin);
}

//-----------------------------
void setup() {
  pinMode(LedPin, OUTPUT);
  stand(sOFF);
  pinMode(btnPin, INPUT_PULLUP);
  btn = readBtn();
}
void loop() {
  switch (state) {
    case sOFF:
      break;
    case sON:/*если включно*/
      if (millis() - past >= time5s)/*и горит больше 5 секунд*/
        stand(sOFF);/*то выключить*/
      break;
  }
  bool tmp =  readBtn();
  if (!tmp && btn) {/*если кнопка нажата*/
    delay(50);
    btn = tmp;
    if (state == sOFF) stand(sON);/*если темно вкл*/
    else stand(sOFF);/*если темно отключить*/
  }
  if (tmp && !btn) {/*если кнопка отжата*/
    delay(50);
    btn = tmp;
  }
}

ПС: Убрал ошибки , какие сказаны в посте снизу.

IgorR
Offline
Зарегистрирован: 03.04.2018

Можно и так. Пару комментариев к коду:

а) состояние нажатой кнопки - LOW, вроде бы

б) и, походу, строки 13 и 14 местами поменять.

И еще: я бы ввсе-таки добавил проверку состояния кнопки после delay(). А то мало ли - муха пролетала, кнопочку нажала. 

Monarch1986
Offline
Зарегистрирован: 18.12.2018

qwone пишет:

Ну и наконец добавим время отключения при горящем свете.

/**/
const byte LedPin =/*пин лампы*/13;
const byte btnPin =/*пин кнопки*/2;
const unsigned long time5s = 5000; /*время 5 секунд*/
unsigned long past;
enum state_t {sOFF = 0, sON};
state_t state;
void stand(state_t s) {
  state = s;
  past = millis();
  switch (state) {
    case sOFF:
      digitalWrite(LedPin, LOW);
      break;
    case sON:
      digitalWrite(LedPin, HIGH);
      break;
  }
}
bool btn;/*состояние кнопки*/
bool readBtn() {
  return digitalRead(btnPin);
}

//-----------------------------
void setup() {
  pinMode(LedPin, OUTPUT);
  stand(sOFF);
  pinMode(btnPin, INPUT_PULLUP);
  btn = readBtn();
}
void loop() {
  switch (state) {
    case sOFF:
      break;
    case sON:/*если включно*/
      if (millis() - past >= time5s)/*и горит больше 5 секунд*/
        stand(sOFF);/*то выключить*/
      break;
  }
  bool tmp =  readBtn();
  if (!tmp && btn) {/*если кнопка нажата*/
    delay(50);
    btn = tmp;
    if (state == sOFF) stand(sON);/*если темно вкл*/
    else stand(sOFF);/*если темно отключить*/
  }
  if (tmp && !btn) {/*если кнопка отжата*/
    delay(50);
    btn = tmp;
  }
}

ПС: Убрал ошибки , какие сказаны в посте снизу.

 

ВОООООО!!!! работает как надо!!! То что хотел..... Огромное спасибо!!!!!!!!!

Monarch1986
Offline
Зарегистрирован: 18.12.2018

Игорь и тебе спасибо за помощь!!! 

Monarch1986
Offline
Зарегистрирован: 18.12.2018

Monarch1986
Offline
Зарегистрирован: 18.12.2018

Monarch1986
Offline
Зарегистрирован: 18.12.2018

Вот как все получилось:) Всем спасибо