Доброго времени суток. Помогите поправить код. Суть в том, что мне нужно кнопку считывать в обратном состоянии, т.е не количество нажатий, а количество отпускания кнопки. Иначе говоря пока кнопка нажата светодиод не горит , отпущена зажегся светодиод. Вот собственно код: Код (C++): #define button 3 #define led 13 boolean bIsUp = true; // была ли кнопка нажата? // да void setup () { pinMode (led, OUTPUT); pinMode (button, INPUT_PULLUP); } void loop () { boolean bWsUp = digitalRead(button); // нажата ли кнопка сейчас? if (bIsUp && !bWsUp) { Serial.println ("OK"); delay(10); bWsUp = digitalRead(button); if (!bIsUp) { Serial.println ("Ne OK"); }} bIsUp=bWsUp; }
Сломал мозг. Код (C++): if (digitalRead(button) == LOW) { digitalWrite(led, HIGH) } Не? Или я чего-то не понимаю? И еще.. Как вот это понять? Что это вообще? Код (C++): if (bIsUp && !bWsUp)
Код (C++): #define BUTTON_PIN 3 #define LED_PIN 13 boolean prevButtonScan = false; enum States { UNPRESSED, PRESSED, RELEASE, HOLD}; // возможные состояния кнопки: не нажата / только что нажата / только что отпущена / долго нажата void setup () { pinMode (LED_PIN, OUTPUT); pinMode (BUTTON_PIN, INPUT_PULLUP); } void loop () { switch (buttonState(BUTTON_PIN)) // смотрим состояние кнопки { case UNPRESSED: Serial.println("Button unpressed"); // кнопка не нажата digitalWrite(LED_PIN, HIGH); break; case PRESSED: Serial.println("Button just pressed"); // кнопка только что была нажата digitalWrite(LED_PIN, LOW); break; case RELEASE: Serial.println("Button just release"); // кнопка только что была отпущена digitalWrite(LED_PIN, HIGH); break; case HOLD: Serial.println("Button is hold"); // кнопка нажата и удерживается digitalWrite(LED_PIN, LOW); break; } } byte buttonState(byte pin) // обработчик кнопок { byte result; // конечный результат выполнения функции boolean buttonScan = !digitalRead(BUTTON_PIN); // читаем состояние пина if(buttonScan == true) // если кнопка нажата... { if(prevButtonScan == false) // ...и до этого была не нажата result = PRESSED; else // ...и до этого тоже была нажата result = HOLD; } else // если кнопка не нажата... { if(prevButtonScan == false) // ...и до этого была не нажата result = UNPRESSED; else // ...и до этого тоже была нажата result = RELEASE; } delay(20); prevButtonScan = buttonScan; return result; }
Ощутил себя идиотом )) Код (C++): byte buttonState(byte pin) почему именно byte? Почему не void? Вот эту строку я вообще очень слабо понимаю, как это все работает
это функция, т.к. дальше идут скобки. Если функция что-то делает "молча", т.е не выдавая результат в виде какого-то числа, то пишем void, например: void setup () Если функция что-то должна "ответить", то надо явно указать тип ответа. В данном случае byte, т.к. это минимально возможная размерность числа: от 0 до 255. Если в функцию надо что-то передать для расчетов, то это число и его тип указываем в скобках после функции. В данном случае мы передаем ей номер пина BUTTON_PIN и его размерность byte. Про emun и switch написано в wiki.
Ребят забыл отписаться у меня получилось и работает без сбоев, мб что то не дописано, но работает, вся ошибка крылась в подключении самой кнопки в книжке от амперки есть 2 хороших схемы включения кнопки. вот код, работает: Код (C++): #define button 3 #define led 13 boolean bIsUp = true; // была ли кнопка нажата? // да void setup () { Serial.begin(9600); pinMode (led, OUTPUT); pinMode (button, INPUT_PULLUP); } void loop () { boolean bWsUp = digitalRead(button); // нажата ли кнопка сейчас? if (bIsUp && !bWsUp) { Serial.println ("DIM"); delay(10); bWsUp = digitalRead(button); } bIsUp=bWsUp;