Здравствуйте . Я подключил IR приёмник к ардуино и всё было хорошо,пока я не захотел сделать программу, в которой ,если кнопка на пульте зажата то двигатель крутится,когда она не зажата он останавливается.Ведь пуль при передачи сигнала если кнопка зажата сначала один раз передаёт код кнопки а потом стандартный код о её залипании.Помогите пожалуйста реализовать такую программу. Вот всё что смог сделать я ,но в данном случае двигатель работает небольшими рывками ,они не заметны но на движение повлиять могут.Двигатель включаю через транзистор. #include <IRremote.h> int RECV_PIN = 3;//Контакт IR приёмника int motor = 5; unsigned long n; // переменная запоминающая предыдущий сигнал с пульта IRrecv irrecv(RECV_PIN); decode_results results; void setup() { pinMode(motor,OUTPUT); irrecv.enableIRIn(); // Включаем ресивер } void loop() { if (irrecv.decode(&results)) { if (results.value != 4294967295)//1641415931 - сигнал кнопки;4294967295-сигнал о залипании кнопки; {n =results.value; if (results.value == 1641415931) {digitalWrite(motor,HIGH);} else {digitalWrite(motor,LOW);} } else {if (n == 1641415931){digitalWrite(motor,HIGH);}} delay(50); irrecv.resume(); delay(50); } else{digitalWrite(motor,LOW); }//Если сигнала небыло выключаю мотор; }
Ну начнем с того, что код лучше отформатировать, в самом скетче нажмите кнопки ctr+T. Так код будет более читабельным и понятным. Во вторых вы не везде прописали переменную n, в которой хранится правильный код кнопки пульта при зажатии. В третьих зачем столько else? И зачем нужна задержка, которая два раза повторяется? В целом правильно. Должно получится, что-то вроде такого: Код (Text): #include <IRremote.h> int RECV_PIN = 3; // Контакт IR приёмника #define MOTOR 5 // motor IRrecv irrecv(RECV_PIN); uint32_t n; void setup() { pinMode(MOTOR, OUTPUT); digitalWrite(MOTOR, LOW); // начальное состояние мотора irrecv.enableIRIn(); // Включаем ресивер } void loop() { decode_results results; if (irrecv.decode(&results)) { // 1641415931 - сигнал кнопки; 4294967295-сигнал о залипании кнопки if (results.value != 4294967295) // если код не "залипания" { { n = results.value; // то сохраняем его в переменную n } if (n == 1641415931) // если кнопка зажата { digitalWrite(MOTOR, HIGH); // крутим мотор } else { digitalWrite(MOTOR, LOW); // иначе, выключаем } } } irrecv.resume(); // delay(50); // зачем задержка? } Проверьте.
В вашем коде ,если кнопка не зажата и на неё не поступает сигнал мотор продолжает работать.Если же мы поставим в последней строчке else { digitalWrite(MOTOR, LOW); } то когда кнопка не зажата мотор должен останавливаться,но вот загвоздка он вообще не реагирует,не включается и не выключается.Если же мы поставим задержку,как в моём коде, мотор будет работать ,но небольшие погрешности в рывках будут.Я думаю это связано с тем что сигналы с пульта идут не мгновенно, а через короткий промежуток времени.Я хотел спросить можно ли принципиально по иному реализовать это?
Возможны вы правы. Попробуйте поставить конденсатор на базу транзистора, он сгладит эти скачки и мотор должен крутится равномерно. Как в этой схеме, например: http://digitrode.ru/computing-devices/mcu_cpu/139-upravlyaem-ventilyatorom-s-pomoschyu-arduino.html В любом случае одного else должно быть достаточно Код (Text): #include <IRremote.h> int RECV_PIN = 3; // Контакт IR приёмника #define MOTOR 5 // motor IRrecv irrecv(RECV_PIN); uint32_t n; void setup() { pinMode(MOTOR, OUTPUT); digitalWrite(MOTOR, LOW); // начальное состояние мотора irrecv.enableIRIn(); // Включаем ресивер } void loop() { decode_results results; if (irrecv.decode(&results)) { // 1641415931 - сигнал кнопки; 4294967295-сигнал о залипании кнопки if (results.value != 4294967295) // если код не "залипания" { { n = results.value; // то сохраняем его в переменную n } if (n == 1641415931) // если кнопка зажата { digitalWrite(MOTOR, HIGH); // крутим мотор } } else { digitalWrite(MOTOR, LOW); } } irrecv.resume(); delay(50); }