Всем привет! У меня возникла проблем с serial(). Проблема заключается в том, что я могу один раз отправить одну из цифр (0, 1, 2) и всё. Дальше, если надо отправить какое-то из чисел ком порт не обрабатывает. Приходится перезагружать ардуино. Мне надо, что бы при значение 0 переменным датчиков присваивалось 1 и включалось реле, при 1 выключалось реле, при 2 выполнялась функция List() , а при 3 вся EEPROM память очищалась. Всё перепробовал, НИКАК НЕ РАБОТАЕТ.Помогите с данной проблемой! Заранее спасибо!
разбираться пошагово. Оставьте обработку одного символа из Сериал и одну функцию, проверьте, устойчиво ли работает? Не виснет ли после первого раза? если нет - добавляйте дальше
Код (C++): #include "GyverTimer.h" // подключаем библиотеку для таймеров #include <EEPROM.h> //подключаем библиотеку энергонезависимой памяти GTimer Timer1(MS);// создать миллисекундный таймер GTimer Timer2(MS);// создать миллисекундный таймер GTimer Timer3(MS);// создать миллисекундный таймер GTimer Timer4(MS);// создать миллисекундный таймер #define startKey 5 // ключ первого запуска. 0-254, на выбор //Объявляем дерективы пинов #define tiltSensor2 12 #define tiltSensor1 11 #define LightM1 10 #define LightM2 9 #define Power0 6 #define Power1 5 #define Power2 4 #define Power3 3 #define PowerB 2 #define pinZum 7 #define relay 8 //Задаём переменные int LightM1Status = 0; int LightM2Status = 0; int tiltSensor1Status = 0; int tiltSensor2Status = 0; int V; int val = 1; //Ставим задержку 2 мин (дальше переведём в миллисекунды) long delayMillis = 60000; //в 1 мин 60000 мс long delayMillis1; //Для полученного результата умножения long eepromRead; //Задержка в эн. независимой памяти void(* resetFunc) (void) = 0; void setup() { //Задаём риимы пинов pinMode(LightM1, INPUT); pinMode(LightM2, INPUT); pinMode(Power0, OUTPUT); pinMode(Power1, OUTPUT); pinMode(Power2, OUTPUT); pinMode(Power3, OUTPUT); pinMode(tiltSensor1, INPUT); pinMode(tiltSensor2, INPUT); pinMode(pinZum, OUTPUT); pinMode(PowerB, OUTPUT); pinMode(relay, OUTPUT); //устанавливаем соеденение по serial в 9600 бод Serial.begin(9600); digitalWrite(Power0, HIGH); digitalWrite(Power1, HIGH); digitalWrite(Power2, HIGH); digitalWrite(Power3, HIGH); digitalWrite(PowerB, LOW); Timer1.setTimeout(5000); //ставим таймаут 5 сек на 1 таймер digitalWrite(relay, LOW); tone(pinZum, 3000); Timer2.setTimeout(1000); //ставим таймаут 1 сек на 2 таймер } void loop() { eepromRead = EEPROM.get(0, delayMillis1); //Считываем 0 ячейку с переменной delayMillis1 V = EEPROM.get(3, val); if (Timer1.isReady()) digitalWrite(PowerB, HIGH); //если прошло 5 сек. после выключения блютуз - включаем if (Timer2.isReady()) noTone(pinZum); //если прошло 1 сек. после включения зумера - выключаем if (Timer3.isReady()) //Если прошло время == delayMillis1, выключаем зумер и ставим статусы 1 { noTone(pinZum); tiltSensor2Status = 1; tiltSensor1Status = 1; LightM2Status = 1; LightM1Status = 1; } LightM1Status = digitalRead(LightM1); //Считываем значния с датчиков LightM2Status = digitalRead(LightM2); tiltSensor1Status = digitalRead(tiltSensor1); tiltSensor2Status = digitalRead(tiltSensor2); if (Serial.available()) //Если что-то пришло в сериал { val = Serial.parseInt(); //Считываем delayMin /* if (val == 0) { noTone(pinZum); Serial.println('0'); digitalWrite(Power0, LOW); digitalWrite(Power1, LOW); digitalWrite(Power2, LOW); digitalWrite(Power3, LOW); digitalWrite(relay, HIGH); LightM1Status = 1; LightM2Status = 1; tiltSensor1Status = 1; tiltSensor2Status = 1; delay(30000); val = 1; EEPROM.put(3, val); delay(10); resetFunc(); if (val == 1) { digitalWrite(Power0, HIGH); digitalWrite(Power1, HIGH); digitalWrite(Power2, HIGH); digitalWrite(Power3, HIGH); digitalWrite(relay, LOW); EEPROM.put(3, val); delay(100); */ if (val == 2) { Serial.println("Задержка:"); Serial.println(delayMillis1); Serial.println("Датчик света 1:"); Serial.println(LightM1Status); Serial.println("Датчик света 2:"); Serial.println(LightM2Status); Serial.println("Датчик наклона 1:"); Serial.println(tiltSensor1Status); Serial.println("Датчик наклона 2:"); Serial.println(tiltSensor2Status); Serial.println("END"); } /* if (val == 3) { for (int i = 0; i < EEPROM.length(); i++) EEPROM.update(i, 0); delay(1000); EEPROM.write(0, 3 * 60000); delay(100); resetFunc(); */ if(val >3){ //Если задержка больше 2 (3 и более) delayMillis1 = val * delayMillis; //delayMillis1 равен значению из сериал умноженное на 60000 Serial.println(delayMillis1); //Выводим полученый результат EEPROM.put(0, delayMillis1); resetFunc(); } } } //Если какой-то из датчиков сработал - вызываем функцию alarm /* if(LightM1Status == 0) { alarm(); } if(LightM2Status == 0) { alarm(); } if(tiltSensor1Status == 0) { alarm(); } if(tiltSensor2Status == 0) { alarm(); } */ void alarm() //Функция alarm { tone(pinZum, 3000); Timer3.setTimeout(delayMillis1); Serial.println(eepromRead); } Закомментировал несколько условий и убрал функцию List , теперь вообще ничего не происходит
добавьте вывод значения val в Сериал сразу после val = Serial.parseInt(); //Считываем delayMin и посмотрите, что у вас реально приходит.
https://yadi.sk/i/rtkTztTE20y_iQ - добавил, затем отправил и нет ничего https://yadi.sk/i/FY4RMiuppFLIfg