Не получилось, посижу пару часов, может придумаю. #define BUTTON_PIN 2 #define LED_PIN 10 #define LEDD_PIN 13 #define BLINK_DELAY1 500 #define BLINK_DELAY2 50 bool Button, Button_old; bool mer = false; void setup() { pinMode(BUTTON_PIN, INPUT_PULLUP); pinMode(LED_PIN, OUTPUT); pinMode(LEDD_PIN, OUTPUT); Button = !digitalRead(BUTTON_PIN); if (Button){ while(Button==true){digitalWrite(LEDD_PIN, Button);// Где-то тут косяк. } } } void loop() { Button = !digitalRead(BUTTON_PIN); //считываем и нормализуем кнопку digitalWrite(LEDD_PIN, Button); //Если нажата кнопка, то светится светодиод LEDD // устанавливаем mer по изменению состояния клавиши if ((Button && !Button_old) || (!Button && Button_old)) mer = true; Button_old = Button; digitalWrite(LED_PIN, (((millis()/BLINK_DELAY1)%2) && mer && !Button) || (((millis()/BLINK_DELAY2)%2) && mer && Button)); }
Нашел ошибку Код (Text): #define BUTTON_PIN 2 #define LED_PIN 10 #define LEDD_PIN 13 #define BLINK_DELAY1 500 #define BLINK_DELAY2 50 bool Button, Button_old; bool mer = false; void setup() { pinMode(BUTTON_PIN, INPUT_PULLUP); pinMode(LED_PIN, OUTPUT); pinMode(LEDD_PIN, OUTPUT); Button = !digitalRead(BUTTON_PIN); if (Button){ while(Button==true){digitalWrite(LEDD_PIN, Button); Button = !digitalRead(BUTTON_PIN);// нужно повторно считать данные } } } void loop() { Button = !digitalRead(BUTTON_PIN); //считываем и нормализуем кнопку digitalWrite(LEDD_PIN, Button); //Если нажата кнопка, то светится светодиод LEDD // устанавливаем mer по изменению состояния клавиши if ((Button && !Button_old) || (!Button && Button_old)) mer = true; Button_old = Button; digitalWrite(LED_PIN, (((millis()/BLINK_DELAY1)%2) && mer && !Button) || (((millis()/BLINK_DELAY2)%2) && mer && Button)); }
Объясните пожалуйста какие значения присваиваются переменным в этом случаи bool Button, Button_old; Спасибо
Не понял вопрос. Button это состояние клавиши в цикле loop, Button_old это состояние в предыдущий цикл выполнения. Условие Button && !Button_old это фронт нажатия клавиши, переход с 1 в 0, !Button && Button_old это фронт отпускания клавиши, переход с 0 в 1. Попробуй такой setup(), он покороче, без лишних условий и с правильной инициализацией Button_old для loop. Код (Text): void setup() { pinMode(BUTTON_PIN, INPUT_PULLUP); pinMode(LED_PIN, OUTPUT); pinMode(LEDD_PIN, OUTPUT); while(!digitalRead(BUTTON_PIN)) digitalWrite(LEDD_PIN, HIGH); Button_old = !digitalRead(BUTTON_PIN); }
Всем спасибо, все получилось, тема закрыта. Код (Text): #define BUTTON_PIN 2 #define LED_PIN 8 #define LED1_PIN 13 #define LED2_PIN 9 #define BLINK_DELAY1 500 #define BLINK_DELAY2 50 #define BUZZER 7 bool Button, Button_old; bool mer = false; void setup() { pinMode(BUTTON_PIN, INPUT_PULLUP); pinMode(LED_PIN, OUTPUT); pinMode(LED1_PIN, OUTPUT); pinMode(LED2_PIN, OUTPUT); pinMode(BUZZER, OUTPUT); Button = !digitalRead(BUTTON_PIN); if (Button){ while(Button==true){ digitalWrite(LED2_PIN, Button); int t=1; for (int a=0;a>-1;a=a+t){ int f=a*400; tone (BUZZER,f,50); if (a==10)t=-1; delay (10); } Button = !digitalRead(BUTTON_PIN); } } digitalWrite(LED2_PIN, Button); noTone; delay (100); } void loop() { Button = !digitalRead(BUTTON_PIN); digitalWrite(LED1_PIN, Button); if ((Button && !Button_old) || (!Button && Button_old)) mer = true; Button_old = Button; digitalWrite(LED_PIN, (((millis()/BLINK_DELAY1)%2) && mer && !Button) || (((millis()/BLINK_DELAY2)%2) && mer && Button)); }