Добрый день, я новенький, программированием занимался только на паскале, поэтому имею определённые трудности. Написал код, но работает не корректно, подскажите, что я не так делаю? Условия: При нажатии кнопки загорается зелёный светодиод и через одну минуту активируется PIR датчик, в случае обнаружения движения - загорается красный светодиод. Синализация отключается кнопкой. Это один из вариантов кода: Код (C++): #define LED_PIN_RED 2 #define LED_PIN_GREEN 3 #define BTN_PIN 4 #define SENSOR_PIN 5 bool buttonWasUp = true; bool ledEnabled = false; void setup() { Serial.begin(9600); pinMode(LED_PIN_RED, OUTPUT); pinMode(LED_PIN_GREEN, OUTPUT); pinMode(BTN_PIN, INPUT_PULLUP); pinMode(SENSOR_PIN, INPUT); } void loop() { bool buttonIsUp = digitalRead (BTN_PIN); if (buttonWasUp && !buttonIsUp) { delay (10); buttonIsUp = digitalRead (BTN_PIN); if(!buttonIsUp) { ledEnabled = !ledEnabled; digitalWrite (LED_PIN_GREEN, ledEnabled); while (digitalRead(BTN_PIN) == LOW); { Serial.println("Motion detected"); int val = digitalRead (SENSOR_PIN); if (val == HIGH) { digitalWrite(LED_PIN_RED, HIGH); Serial.println("Motion detected"); } else digitalWrite(LED_PIN_RED, LOW);; } } } buttonWasUp = buttonIsUp; }
у вас датчик активируется не по времени, а по удержанию кнопки. это как то не увязывается с вашим заданием.
правильно, он должен активироваться спустя минуту после нажатия кнопки. Или Вы о том, что кусок кода, отвечающего за датчик нужно вынести из цикла кнопки и вставить после?
у вас есть состояние датчика - активный или нет. нажали кнопку - запустился таймер. оттикал минуту - датчик активен, таймер не работает.. играетесь с датчиком. нажали кнопку - датчик не активен, таймер не работает.
я ставил задержку через delay(60000) перед активацией датчика, но всё равно работает не правильно, поэтому его на время убрал. Я не понимаю как выйти из цикла проверки состояния кнопки и при этом продолжать влиять на состояние кнопки. Мне кажется, нужно ввести переменную bool которая будет отвечать за состояние датчика?
Я вам нацарапал алгоритм работы. Вот и пишите по нему программу. Сначала научитесь кнопкой запускать и останавливать таймер. В сериал выводите параметры чтобы представлять что происходит и отлавливать ошибки.
Не нашёл как устанавливать таймеры, нашёл только delay и milis. Сигнализация срабатывает только если через 6 сек. датчик улавливал движение Код (C++): #define LED_PIN_RED 2 #define LED_PIN_GREEN 3 #define BTN_PIN 4 #define SENSOR_PIN 5 bool buttonWasUp = true; bool ledEnabled = false; bool alarm = false; void setup() { Serial.begin(9600); pinMode(LED_PIN_RED, OUTPUT); pinMode(LED_PIN_GREEN, OUTPUT); pinMode(BTN_PIN, INPUT_PULLUP); pinMode(SENSOR_PIN, INPUT); } void loop() { bool buttonIsUp = digitalRead (BTN_PIN); if (buttonWasUp && !buttonIsUp) { delay (10); buttonIsUp = digitalRead (BTN_PIN); if(!buttonIsUp) { ledEnabled = !ledEnabled; alarm = !alarm; digitalWrite (LED_PIN_GREEN, ledEnabled); if (alarm == true) { delay (6000); int val = digitalRead (SENSOR_PIN); if (val == HIGH) { digitalWrite(LED_PIN_RED, HIGH); Serial.println("Motion detected"); } else digitalWrite(LED_PIN_RED, LOW); } } } buttonWasUp = buttonIsUp; }