Функция void setup не выполняется каждый раз, после каждой подачи питания или сброса платы Arduino.
- Войдите на сайт для отправки комментариев
Вс, 31/03/2019 - 14:53
Сделал скетч для управления освещением прихожей с ардуино Нано. Хотел сделать так что бы каждый раз после подачи напряжения (после его пропадания) ардуино бы включало свет на 10 секунд и отключало его. Но почему этого не происходит, а ардуино после переподачи напряжения просто включает свет и не отключает самостоятельно! Если же сдеать так что бы при запуске ардуино отключал свет, то ардуино работате как положено - после переподачи напряжения свет не включается (как и прописано).
В связи с чем у меня вопрос. Вот здесь http://arduino.ru/Reference/Setup вроде бы сказано "Функция setup запускает ... после каждой подачи питания" почему же у меня не так?
Вот полностью скетч.
#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(); // сброс ватчдога }Странно... А что в сериал выдается после выключения и включения питания?
Хотя, на какое время Вы выключаете питание? Если очень короткое, то конденсаторы могут подпитывать...
Отключаю так что видно что ардуино выключился + 5-10 секнуд.
В сериал ничего не может выдаваться. Я же отключаю USB от ПК, питание сделал через пин "30" – плюс питания модуля 2-20 В. Тоесть полностью эмулирую работу ардуинки от сети.
Отключаю так что видно что ардуино выключился + 5-10 секнуд.
В сериал ничего не может выдаваться. Я же отключаю USB от ПК, питание сделал через пин "30" – плюс питания модуля 2-20 В. Тоесть полностью эмулирую работу ардуинки от сети.
Тогда светик повесьте и сделайте в сетапе мигнуть им, а проще, закомментируйте весь луп. Чудес не бывает.
Отключаю так что видно что ардуино выключился + 5-10 секнуд.
В сериал ничего не может выдаваться. Я же отключаю USB от ПК, питание сделал через пин "30" – плюс питания модуля 2-20 В. Тоесть полностью эмулирую работу ардуинки от сети.
Тогда светик повесьте и сделайте в сетапе мигнуть им, а проще, закомментируйте весь луп. Чудес не бывает.
В setup прописал вот это
и теперь работает. Но что неправильно в том что я до этого прописывал? Я просто хотел что бы 10 секунд свет горел и пищалка пикала 10 раз как положено.
А закоментировать вес луп это что имелось ввиду? Я просто не понял...
Я подозреваю, что что то в вашем ифолупомесиве не дает ему работать как ожидалось.
Я подозреваю, что что то в вашем ифолупомесиве не дает ему работать нормально.
Я бы с Вами согласился, но при загрузке скетча с ПК первый раз он работает как положено. Кстати говоря, ели отключит ардуино он ПК, а затем опять подключить то происходит перезагрузка ардуино и опять всё отрабатывает как следует!!!
Тогда, как сказали выше, ройте, что у вас с питанием и почему, возможно, не проходит сигнал сброса. Собачку отключите, на всякий случай.