Прошу помочь в написание программы для управление сигнализации. есть PIR датчик ,кнопка(активация сигнализации), ардуино PIR датчик движения: 1)если кнопка не нажата включает освещение 2)если кнопка нажата(активируем режим сигнализации) включает пищалку, пищалка должна отключаться после отжатии кнопки int ledPin = 9; // инициализируем пин для светодиода int inputPin = 4; // инициализируем пин для получения сигнала от пироэлектрического датчика движения int pirState = LOW; // начинаем работу программы, предполагая, что движения нет int val = 0; // переменная для чтения состояния 4 пина int Sigpin = 11; // инициализируем пин для пищалки int button = 12; // пин для кнопки pinMode(button, INPUT); void loop() { val = digitalRead(inputPin); // считываем значение с датчика if (val == HIGH && button==0) { digitalWrite(ledPin, HIGH); // включаем светодиод if (pirState == LOW) pirState = HIGH; } else digitalWrite(ledPin, LOW); // выключаем светодиод if (pirState == HIGH) pirState = LOW; if (val == HIGH && button==1 ) { digitalWrite(Sigpin, HIGH); } else { digitalWrite(Sigpin, LOW); // выключаем светодиод } } не получается когда нажимаю на кнопку,если до этого датчик срабатывал то сразу включается пищалка. при отключение сигнализации датчик не обнуляется. Помогите с реализации
Ну наверное digitalRead(button). Тяжело в не оформленном коде разбираться. И кнопка, поди, без подтяжки подключена. Вот это прочитано? http://wiki.amperka.ru/конспект-arduino:кнопка
1)не получается когда нажимаю на кнопку(активирую сигнализацию),если до этого датчик срабатывал то сразу включается пищалка. не могу обнулить значение PIR датчика при включение сигнализации, как сделать это?
Спойлер: Вот написал код, в работе не проверял Код (C++): /* #1 PIR датчик -> 4(PIR_pin) 1 движение / 0 нет движения GND -> GND освещение -> 11 (Led_pin) 1 включено / 0 выключено GND -> GND тублер -> 12 (btn_pin) 0 свет / 1 сигнализация GND -> GND пищалка -> 9 (Sign_pin) GND -> GND */ //#1 const int PIR_pin = 4; // пин пирометра uint8_t PIR; // величина на пирометре const int btn_pin = 12; // пин тумблера 0 включаем свет / 1 включаем сигнализацию uint8_t btn; // величина на тумблере const int Led_pin = 11; // пин светодиода const int Sign_pin = 9; // пин пищалки const int frequency = 1000; // частота звука сигнализации Гц const int duration = 500; // длительность посылок миллисекундах void setup() { //#1 pinMode(PIR_pin, INPUT); pinMode(Led_pin, OUTPUT); digitalWrite(Led_pin, 0); pinMode(btn_pin, INPUT_PULLUP); } void loop() { static uint32_t MILLIS ; MILLIS = millis() ; //#1 static uint32_t future1 = 0 ; if (MILLIS >= future1) { future1 = MILLIS + 1000 ; PIR = digitalRead(PIR_pin); btn = digitalRead(btn_pin); digitalWrite(Led_pin, PIR && ! btn); if (PIR && btn) tone(Sign_pin, frequency, duration); } }
Код (C++): int ledPin = 9; // инициализируем пин для светодиода int inputPin = 4; // инициализируем пин для получения сигнала от пироэлектрического датчика движения int pirState = LOW; // начинаем работу программы, предполагая, что движения нет int sigState = LOW; int val = 0; // переменная для чтения состояния 4 пина int Sigpin = 11; // инициализируем пин для пищалки int button = 12; // пин для кнопки pinMode(button, INPUT); void loop() { val = digitalRead(inputPin); // считываем значение с датчика if (val == HIGH && button==0) { digitalWrite(ledPin, HIGH); // включаем светодиод if (pirState == LOW) pirState = HIGH; } else digitalWrite(ledPin, LOW); // выключаем светодиод if (pirState == HIGH) pirState = LOW; if (val == HIGH && button==1 ) { RemoteXY.led_1_r = 255; digitalWrite(Sigpin, HIGH); } else { digitalWrite(Sigpin, LOW); // выключаем светодиод } }
можете объяснить пожалуйста что делает данный код: staticuint32_t MILLIS ; MILLIS = millis(); //#1 staticuint32_t future1 =0; if(MILLIS >= future1)
Есть в ардуине четырехбайтный счетчик . Включается при включении ардуины или ресет. Значение получается millis(). static это переменные которые не уничтожаются при заканчивании функций. uint32_t это формат переменной в 4 байта. future1 это аналог будильника. Вот вам надо в определеное время выйти из дома. Вы пишете на бумаге время. А потом периодически смотрите на часы и на бумагу и сравниваете. Вот если они совпадают или время на часах больше, то выходите из дома. Прием нужен поддержка процессов или устройств значительно медленых, чем скорость процессора. Если процесс один , то можно замедлять delay(); Но если много медленных устройств ,которые должен облуживать быстрый процессор. ПС: для выше написаной программы я обращаюсь к тублеру и пирометру раз в 1 секунду. или точнее раз 1000 миллисекунд. И хотя там больше устройств нет, я все же сохраняю такой подход. Вдруг кому-то захочется что-то еще добавить. Так программы написаные в таком стиле спокойно вкладываются по нескольку в одину ардуину.