Функция void setup не выполняется каждый раз, после каждой подачи питания или сброса платы Arduino.

ildaronii
Offline
Зарегистрирован: 30.09.2018

Сделал скетч для управления освещением прихожей с ардуино Нано. Хотел сделать так что бы каждый раз после подачи напряжения (после его пропадания) ардуино бы включало свет на 10 секунд и отключало его. Но почему этого не происходит, а ардуино после переподачи напряжения просто включает свет и не отключает самостоятельно! Если же сдеать так что бы при запуске ардуино отключал свет, то ардуино работате как положено - после переподачи напряжения свет не включается (как и прописано).

В связи с чем у меня вопрос. Вот здесь http://arduino.ru/Reference/Setup вроде бы сказано "Функция setup запускает ... после каждой подачи питания" почему же у меня не так?

Вот полностью скетч.

ildaronii
Offline
Зарегистрирован: 30.09.2018
#include <avr/wdt.h>
#define pin_sensor_light A0    // номер пина датчика освещения
#define pin_sensor_move  A1    // номер пина датчика движения
#define pin_power_night  12    // номер пина ночника
#define pin_key_1         4    // номер пина для кнопки у зеркала
#define pin_key_2         5    // номер пина для кнопки у двери
#define pin_key_3         6    // номер пина для геркона двери
#define pin_buzzer        7    // номер пина для пищалки
#define pin_LED_key1     10    // номер пина для подсветки кнопки №1 (надо выбрать ШИМовский) + можно врубить тикание
#define pin_LED_key2     11    // номер пина для подсветки кнопки №2 (надо выбрать ШИМовский) + можно врубить тикание
#define pin_power_day     3    // номер пина для реле включения лампы
#define pin_LED_sensor_move 13 // номер пина для LED сесора движения
#define time_filter 500        // время фильтрации дребезга кнопок
#define open_door 0            // состояние открытой двери. Для НЗ геркона - 0, НР геркона - 1
#define time_close_door 3000   // время отключения света после закрытия двери - 3 секунды
#define time_open_door 30000   // время отключения света после открытия двери - 30 секунд
#define time_night_light 30000 // время свечения ночника - 30 секунд
#define time_energy_saving 1800000 // время отключения если забыли выключить свет ("режим энергосбережения") - 30 минут

// считываем состояние кнопок при первом старте:
bool key_1 = digitalRead(pin_key_1), key_2 = digitalRead(pin_key_2), key_3 = digitalRead(pin_key_3);
bool start = 0, power = 0;      // последнее зафиксированное состояние питания лампы
bool vhod = 0;                 // логика ожидания закрытия двери после входа в дом с выключенным светом
unsigned long time_filter_key_1 = 0, time_filter_key_2 = 0, time_filter_key_3 = 0, timer_day_off = 0, timer_night_off = 0, timer_enegy_self = 0;

void setup() { wdt_disable(); // отключение ватчдога (в принципе нафиг не нужно)
               Serial.begin(9600); Serial.print("Запуск. Кнопки в состоянии: "); Serial.print(key_1);Serial.print("-");Serial.print(key_2);Serial.print("-");Serial.println(key_3);
               pinMode(pin_power_day,   OUTPUT);   // настраиваем пин включения лампы в режим выхода
               pinMode(pin_power_night, OUTPUT);   // настраиваем пин включения ночника в режим выхода
               pinMode(pin_LED_key1,    OUTPUT);   // настраиваем пин включения лампы подсветки кнопки №1 в режим выхода
               pinMode(pin_LED_key2,    OUTPUT);   // настраиваем пин включения лампы подсветки кнопки №2 в режим выхода
               pinMode(pin_buzzer,      OUTPUT);   // настраиваем пин звука в режим выхода
               digitalWrite(pin_power_day, power); // выключаем свет
               timer_day_off = 0; //millis() + 10000;       // на 10 секунд
               wdt_enable (WDTO_8S); Serial.println("Ватчдог включен на 8 сек.");
}

void loop() {

// контроль перезагрузки
// if (start == 0) {start = 1; timer_day_off = millis() + 10000; power = 1;  digitalWrite(pin_power_day, power); }

// контроль датчика движения
if (analogRead(pin_sensor_move) > 500) { digitalWrite(pin_LED_sensor_move,1);
   if (timer_day_off > 0) {timer_day_off = 0;}
   if ((power == 0) & (analogRead(pin_sensor_light) < 200)) { // включить ночную подсветку
      digitalWrite(pin_power_night, 1);timer_night_off = millis() + time_night_light;}
}   
else { digitalWrite(pin_LED_sensor_move,0); if (( 0 < timer_night_off) & (timer_night_off < millis())) {timer_night_off =0; digitalWrite(pin_power_night,0);}
}

// контроль кнопки №1
if ((time_filter_key_1 == 0) & (digitalRead(pin_key_1) != key_1)) { time_filter_key_1 = (unsigned long) millis() + time_filter; Serial.println("Отсчёт изменения кнопки 1");}
if ((time_filter_key_1 >  0) & (millis() > time_filter_key_1)) { time_filter_key_1 = 0;
   if (digitalRead(pin_key_1) != key_1) { key_1 = 1 ^ key_1; Serial.print("Кнопка №1 стала ");Serial.print(key_1);
       if (timer_day_off > 0) {timer_day_off = 0;digitalWrite(pin_LED_key1, 0);digitalWrite(pin_LED_key2, 0);}
       else { power = 1 ^ power; digitalWrite(pin_power_day, power); 
              if (power == 1) { Serial.println("Включение света"); digitalWrite(pin_LED_key1, 0);digitalWrite(pin_LED_key2, 0);digitalWrite(pin_power_night, 0);}
              else            { Serial.println("Отключение света");digitalWrite(pin_LED_key1, 1);digitalWrite(pin_LED_key2, 1);}
       }
   }
}
// контроль кнопки №2
if ((time_filter_key_2 == 0) & (digitalRead(pin_key_2) != key_2)) { time_filter_key_2 = (unsigned long) millis() + time_filter; Serial.println("Отсчёт изменения кнопки 2");}
if ((time_filter_key_2 >  0) & (millis() > time_filter_key_2)) { time_filter_key_2 = 0;
   if (digitalRead(pin_key_2) != key_2) { key_2 = 1 ^ key_2; Serial.print("Кнопка №2 стала ");Serial.print(key_2);
       if (timer_day_off > 0) {timer_day_off = 0;digitalWrite(pin_LED_key1, 0);digitalWrite(pin_LED_key2, 0);}
       else { power = 1 ^ power; digitalWrite(pin_power_day, power); 
              if (power == 1) { Serial.println("Включение света"); digitalWrite(pin_LED_key1, 0);digitalWrite(pin_LED_key2, 0);digitalWrite(pin_power_night, 0);}
              else            { Serial.println("Отключение света");digitalWrite(pin_LED_key1, 1);digitalWrite(pin_LED_key2, 1);}
       }
   }
}

// контроль геркона двери
if ((time_filter_key_3 == 0) & (digitalRead(pin_key_3) != key_3)) { time_filter_key_3 = millis() + time_filter; Serial.println("Отсчёт изменения кнопки 3");}
if ((time_filter_key_3 >  0) & (millis() > time_filter_key_3)) { time_filter_key_3 = 0;
   if (digitalRead(pin_key_3) != key_3) { key_3 = 1 ^ key_3; Serial.print("Кнопка №3 стала ");Serial.print(key_3);
       if (key_3 == open_door) 
       { Serial.println("Дверь открылась.");
           if (power == 0) // Если дверь открылась и свет не горит
           { Serial.println("В дом вошли! Включить свет!"); power = 1 ^ power; digitalWrite(pin_power_day, power);digitalWrite(pin_LED_key1, 0);digitalWrite(pin_LED_key2, 0);
             vhod = 1 ^ vhod; // включить ожидание закрытия двери!!!
           }
           else            // Если дверь открылась и свет уже горит (как определить что дверь открылась с наружи, что бы не отключать свет по закрытию двери?)
           {}
       }
       else 
       { Serial.println("Дверь закрылась."); 
           if (power == 1) 
           { if (vhod) // если был вход в "пустую" квартиру, то включить таймер отключения после входа
             { timer_day_off = (unsigned long) millis() + time_open_door; Serial.print("Отключение света после входа. Через ");Serial.println(timer_day_off); vhod = 1 ^ vhod; } 
             else      // если был вход в квартиру со включенным светом, то включить таймер отключения по закрытию двери
             { timer_day_off = (unsigned long) millis() + time_close_door; Serial.print("Отключение света по закрытию двери. Через ");Serial.println(timer_day_off);}
           }
       }
   }
}

if (power == 0) { /* подсветка LCD кнопок */ if ((millis() % 4000) < 2000) {analogWrite(pin_LED_key1, ((millis() % 2000)/8));analogWrite(pin_LED_key2, ((millis() % 2000)/8));}
                                             else                          {analogWrite(pin_LED_key1, (250-((millis() % 2000)/8)));analogWrite(pin_LED_key2, (250-((millis() % 2000)/8)));}}
if (timer_day_off > 0) { // если горит свет и есть отсчет выключения
        // блинкер светодиодов для посекундного обратного отсчета времени c интервалом вспышки и пищалки 0,4 секунды
           if (( (timer_day_off-millis()) % 1000) < 130) {digitalWrite(pin_LED_key1, 1);digitalWrite(pin_LED_key2, 1); tone(pin_buzzer, 1000, 1);}
           else                                      {digitalWrite(pin_LED_key1, 0);digitalWrite(pin_LED_key2, 0); noTone(pin_buzzer);        }
        // если таймер превышен то обнулить таймер, выключить пищалку, потушить свет, включить LED1,2           
           if (timer_day_off < millis()) {Serial.print(timer_day_off);Serial.print("-");Serial.println(millis());timer_day_off = 0; power = 1 ^ power;digitalWrite(pin_power_day, power);digitalWrite(pin_LED_key1, 1);digitalWrite(pin_LED_key2, 1); noTone(pin_buzzer);}
      }
if(!(millis()%1000)){Serial.print("Сенсор: "); Serial.println(analogRead(pin_sensor_light));}
wdt_reset(); // сброс ватчдога
}

 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Странно... А что в сериал выдается после выключения и включения  питания?

Хотя, на какое время Вы выключаете питание? Если очень короткое, то конденсаторы могут подпитывать... 

ildaronii
Offline
Зарегистрирован: 30.09.2018

Отключаю так что видно что ардуино выключился + 5-10 секнуд.

В сериал ничего не может выдаваться. Я же отключаю USB от ПК, питание сделал через пин "30" – плюс питания модуля 2-20 В. Тоесть полностью эмулирую работу ардуинки от сети.

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

ildaronii пишет:

Отключаю так что видно что ардуино выключился + 5-10 секнуд.

В сериал ничего не может выдаваться. Я же отключаю USB от ПК, питание сделал через пин "30" – плюс питания модуля 2-20 В. Тоесть полностью эмулирую работу ардуинки от сети.

Тогда светик повесьте и сделайте в сетапе мигнуть им, а проще, закомментируйте весь луп. Чудес не бывает.

ildaronii
Offline
Зарегистрирован: 30.09.2018

bwn пишет:

ildaronii пишет:

Отключаю так что видно что ардуино выключился + 5-10 секнуд.

В сериал ничего не может выдаваться. Я же отключаю USB от ПК, питание сделал через пин "30" – плюс питания модуля 2-20 В. Тоесть полностью эмулирую работу ардуинки от сети.

Тогда светик повесьте и сделайте в сетапе мигнуть им, а проще, закомментируйте весь луп. Чудес не бывает.

В setup прописал вот это

digitalWrite(pin_power_day, 1); delay (3000); digitalWrite(pin_power_day, 0);

и теперь работает. Но что неправильно в том что я до этого прописывал? Я просто хотел что бы 10 секунд свет горел и пищалка пикала 10 раз как положено.

А закоментировать вес луп это что имелось ввиду? Я просто не понял...

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

Я подозреваю, что что то в вашем ифолупомесиве не дает ему работать как ожидалось.

ildaronii
Offline
Зарегистрирован: 30.09.2018

bwn пишет:

Я подозреваю, что что то в вашем ифолупомесиве не дает ему работать нормально.

Я бы с Вами согласился, но при загрузке скетча с ПК первый раз он работает как положено. Кстати говоря, ели отключит ардуино он ПК, а затем опять подключить то происходит перезагрузка ардуино и опять всё отрабатывает как следует!!!

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

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