Народ ! Есть такая задача, управлять платой релюшек с помощью комповой клавиатуры, а точнее 4мя кнопками, но вот в чем проблема... Есть код, который управляет релюшками, но только как включатель или выключатель, а проблема в том, что нужно что-бы реле было замкнуто только пока зажата клавиша на компе, а при отпускании реле должно выключаться ! К сожалению я полный нуб в программировании и буду очень признателен за простой ответ, а если бы кто-то код дал, то я вааще расцелую !))) Вот код для простого вкл., выкл оной кнопкой .... #define ledPin 13 bool state = 0; void setup() { Serial.begin(9600); pinMode (ledPin, OUTPUT); } void loop() { while(Serial.available()) { char val = Serial.read(); if (val == 'd') state = !state; if(state) { Serial.println("ON"); digitalWrite(ledPin, HIGH); } else { Serial.println("OFF"); digitalWrite(ledPin, LOW); } } }
не, такое нужно решать написанием программы на компьютере, которая будет отправлять команду при нажатии и отпускании кнопки
а , простите какую команду ? в виде (если мол отпустил кнопку "d") отвечающую за вкл., то автоматически нажимается любая другая отвечающая за выкл. ?
На компе постоянно крутится программа и следить за клавой. Когда нажимается нужная кнопка - ардуине посылается команда включить соответствующее реле, когда кнопка отпускается - посылается команда выключить реле. Команды - просто буквы, как у вас в примере, просто каждой команде на включение должна соответствовать еще одна на отключение. Пример для ардуины: реагирует на команды "+<номер_реле>" (вкл), "-<номер_реле>" (выкл). Код (Text): #define N_RELAYS 4 const uint8_t PIN_RELAY[N_RELAYS] = {10,11,12,13}; void setup() { Serial.begin(9600); for (uint8_t i = 0; i < N_RELAYS; i++) pinMode (PIN_RELAY[i], OUTPUT); } void loop() { if (Serial.available()>=2) { char cmd = Serial.read(); if ('+'=cmd) { char n = Serial.read()-'0'; if ((n>=0) && (n<N_RELAYS)) { digitalWrite(PIN_RELAY[n], HIGH); } } else if ('-'=cmd) { char n = Serial.read()-'0'; if ((n>=0) && (n<N_RELAYS)) { digitalWrite(PIN_RELAY[n], LOW); } } } }
Вот ... добрые люди кое что дали , но все-равно не работает ! #define ledPin 13 unsigned long time; char val; int flag = 1; void setup(){ Serial.begin(9600); } void loop(){ val=0; if (Serial.available() > 0) { val = Serial.read(); if (val == 'd' && flag == 1) { digitalWrite(ledPin, HIGH); // включаем, если пришло 'd' time = millis(); // старт отсчета flag = 0; // разрешаем проверку } } if(flag == 0){ if(time+1000 < millis()){ // ждем 1 сек flag = 1; // если по истечении 1 сек переменная val пустая, значит ничего не приходит if (val == 0) digitalWrite(ledPin, LOW); } } }
Ура код найден всё работает, кому интересно вот ... срабатывает на кнопку "d" , отпускаешь выключается. Код (Text): #define ledPin 13 unsigned long times; char val; int flag = 1; void setup(){ Serial.begin(9600); Serial.setTimeout(25); pinMode (ledPin, OUTPUT); } void loop(){ val=0; if (Serial.available() > 0) { val = Serial.read(); if (val == 'd') { times = millis(); // старт отсчета if (flag == 1) { digitalWrite(ledPin, HIGH); // включаем, если пришло 'd' flag = 0; // разрешаем проверку } } } if(flag == 0){ if(times+1000 < millis()){ // ждем 1 сек flag = 1; // если по истечении 1 сек переменная val пустая, значит ничего не приходит if (val == 0) digitalWrite(ledPin, LOW); } } }