Помогите разораться в serial

Тема в разделе "Arduino & Shields", создана пользователем Илья КОтяра, 23 фев 2022.

  1. Всем привет! У меня возникла проблем с serial(). Проблема заключается в том, что я могу один раз отправить одну из цифр (0, 1, 2) и всё. Дальше, если надо отправить какое-то из чисел ком порт не обрабатывает. Приходится перезагружать ардуино. Мне надо, что бы при значение 0 переменным датчиков присваивалось 1 и включалось реле, при 1 выключалось реле, при 2 выполнялась функция List() , а при 3 вся EEPROM память очищалась. Всё перепробовал, НИКАК НЕ РАБОТАЕТ.Помогите с данной проблемой! Заранее спасибо!
     

    Вложения:

  2. b707

    b707 Гуру

    сериал тут явно не причем,у вас просто программа виснетЮ там черти что наворочено
     
  3. Спасибо, что подскажите сделать?
     
  4. b707

    b707 Гуру

    разбираться пошагово. Оставьте обработку одного символа из Сериал и одну функцию, проверьте, устойчиво ли работает? Не виснет ли после первого раза? если нет - добавляйте дальше
     
  5. Хорошо, сейчас попробую
     
  6. Код (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 , теперь вообще ничего не происходит
     

    Вложения:

  7. b707

    b707 Гуру

    добавьте вывод значения val в Сериал сразу после
    val = Serial.parseInt(); //Считываем delayMin
    и посмотрите, что у вас реально приходит.