Привет подскажите как сделать так чтобы при нажатии на кнопку (int 2) светодиод включился на 2 секунды и погас НО при этом кнопка остается нажатой .
разделить ситуацию на два отдельных события (функции): анализ состояния кнопки и управление светодиодом. "перемычка" между ними - это переменная (в данном случае флаг - boolean). Первая функция записывает в эту переменную данные, а вторая функция читает из этой переменной данные.
Код (C++): int buuton = 2; int led= 13; //boolean buutonstatus= false; void setup() { pinMode (led,OUTPUT); pinMode (buuton, INPUT_PULLUP); } void loop() { boolean= digitalRead(buuton); boolean } оправдательное напровление
Код (C++): #define BUTTON_PIN 4 // кнопка подключается между пином и GND #define LED_PIN 13 // LED подключается через резистор 200-400 Ом между пином и GND const byte ledTimeout = 2; // время до отключения LED, сек (не более 255) boolean LEDstate; // переменная-флаг для обмена информацией между функциями unsigned long timestamp; // переменная для расчета времени отключения LED void setup() { pinMode(BUTTON_PIN, INPUT_PULLUP); pinMode(LED_PIN, OUTPUT); LEDstate = false; } void loop() { checkButton(); // вызываем функцию чтения состояния кнопки setLED(); // вызываем функцию управления LED } void checkButton() { static boolean btnState = false; // локальная переменная для хранения состояния кнопки if (!digitalRead(BUTTON_PIN)) // реакция на нажатие кнопки { if (btnState == false) // если до этого момента кнопка была НЕ нажата... { btnState = true; // то ставим флаг, что кнопка нажата, LEDstate = true; // разрешаем включение LED timestamp = millis() + ledTimeout * 1000; // и запоминаем время отключения } } else btnState = false; // реакция на отжатие кнопки: ставим флаг, что кнопка НЕ нажата } void setLED() { if (LEDstate == true) // если включение LED разрешено... { if (millis() < timestamp) digitalWrite(LED_PIN, HIGH); // и если с момента включения прошло меньше 2 сек, то подаем питание на LED else LEDstate = false; // если прошло больше 2 сек, то запрещаем включение LED } else digitalWrite(LED_PIN, LOW); // в любом другом случае гасим LED }
Вот мой вариант кода. Код (C++): /* одновибратор кнопка -> 6 (btm_pin) 0 нажата/ 1 нет GND -> GND светодиод -> 13 (Led_pin) 1 горит/ 0 нет GND -> GND */ const int btm_pin=6 ; // нога кнопки const int Led_pin=13 ; // нога светодиода const int interval=2000 ;// интервал после нажатия клавиши 2 сек uint32_t past=0 ; uint8_t Led=0 ; void setup() { pinMode(btm_pin, INPUT_PULLUP); pinMode(Led_pin, OUTPUT); digitalWrite(Led_pin,Led); } void loop() { if(!digitalRead(btm_pin)){ Led=1; digitalWrite(Led_pin,Led); past=millis(); } if (millis() >=past+interval) { Led=0; digitalWrite(Led_pin,Led); } }
Вот вместе с вашим кодом. Может он не оптимален, но думаю вам понятен. Код (C++): /* одновибратор кнопка -> 6 (btm_pin) 0 нажата/ 1 нет GND -> GND светодиод -> 13 (Led_pin) 1 горит/ 0 нет GND -> GND */ //#1 const int btm_pin = 6 ; // нога кнопки const int Led_pin = 13 ; // нога светодиода const int interval = 2000 ; // интервал после нажатия клавиши 2 сек uint32_t past = 0 ; uint8_t Led = 0 ; //#2 #include <SoftwareSerial.h> SoftwareSerial gsm(7, 8); // RX, TX void setup() { //#1 pinMode(btm_pin, INPUT_PULLUP); pinMode(Led_pin, OUTPUT); digitalWrite(Led_pin, Led); //#2 Serial.begin(9600); gsm.begin(9600); } void loop() { //#1 if (!digitalRead(btm_pin)) { Led = 1; digitalWrite(Led_pin, Led); past = millis(); } if (millis() >= past + interval) { Led = 0; digitalWrite(Led_pin, Led); } //#2 if (Led) { // если горит светодиод while (1) { // проверяем готовность модема gsm.println("AT+CPAS"); if (gsm.find("0")) break; delay(100); } gsm.println("ATD+79990000000;"); // звоним по указаному номеру delay(100); if (gsm.find("OK")) Serial.println("OK!"); else Serial.println("error"); } }
Во первых хочу поблагодарить за помощь Реально СПАСИБО всем по поводу вашего примера светодиод получается с задержкой а я хотел чтобы светодиод погас пусть 2 сек после нажатия(и удержания кнопки) и оставался в таком же состоянии до следующего нажатия Пример Tomasina как раз работает так только там есть тоже глюк когда отжимаем кнопку срабатывает пин 13 как будто мы нажали кнопку
Код (C++): /* одновибратор кнопка -> 6 (btm_pin) 0 нажата/ 1 нет GND -> GND светодиод -> 13 (Led_pin) 1 горит/ 0 нет GND -> GND */ //#1 const int btm_pin = 6 ; // нога кнопки const int Led_pin = 13 ; // нога светодиода const int interval = 2000 ; // интервал после нажатия клавиши 2 сек uint32_t past = 0 ; uint8_t Led ; //#2 #include <SoftwareSerial.h> SoftwareSerial gsm(7, 8); // RX, TX void setup() { //#1 pinMode(btm_pin, INPUT_PULLUP); pinMode(Led_pin, OUTPUT); digitalWrite(Led_pin, Led = 0); //#2 Serial.begin(9600); gsm.begin(9600); } void loop() { //#1 if (Led && millis() >= past + interval) { digitalWrite(Led_pin, Led = 0); } if ( !digitalRead(btm_pin)) { digitalWrite(Led_pin, Led = 1); past = millis(); } //#2 if (Led) { // если горит светодиод gsm.println("AT+CPAS"); // проверяем готовность модема if (gsm.find("0")) { gsm.println("ATD+79990000000;"); // звоним по указаному номеру delay(100); if (gsm.find("OK")) Serial.println("OK!"); else Serial.println("error"); } } }