Зависания Arduino Nano

Тема в разделе "Arduino & Shields", создана пользователем cordis, 16 апр 2018.

  1. cordis

    cordis Нуб

    Доброго времени суток. Собрал проект на базе Arduino Nano для умного освещения и включения/выключения вентилятора в ванной. Все подключил. Система работает отлично, но..Спустя несколько часов (Рандомно вообще, может и 2 часа а может и 15-17) вся система начинает зависать и уже то ли датчики не реагируют, то ли сама плата уходит или в режим ожидания или что вообще(Я в этой области абсолютно новичек). После перезагрузки ардуины все снова работает отлажено.

    Система состоит из:
    Arduino Nano V3.0 AVR ATmega328P
    ИК датчик движения HC-SR501
    Датчик освещения
    Датчик влажности DHT11
    Двухканальное реле 5В 10А

    Питание ардуины происходит от сети 220В через адаптер (1А, 5В, по типу телефонной зарядки, брал на сайте интернет магазина Ардуино). Далее через реле происходит управление подсветкой(220В) и вентилятором(220В).

    Код (C++):
    #include <Adafruit_Sensor.h>


    #include <DHT.h>
    #include <DHT_U.h>

    #define RESTART_TIME 120000
    #define relayout1 6
    #define relayout2 7
    #define ledPin 13
    #define movPin 8
    #define lPin 5
    #define alPin A3
    #define DHTPIN A2

    DHT dht(DHTPIN, DHT11);

    void setup() {

     
      Serial.begin(9600);

     
      pinMode(relayout1, OUTPUT);
      pinMode(relayout2, OUTPUT);
      pinMode(movPin, INPUT);
      pinMode(lPin, INPUT);
      pinMode(alPin, INPUT);
      pinMode(DHTPIN, INPUT);
     
      dht.begin();
     
      digitalWrite(relayout1, HIGH);
      digitalWrite(relayout2, HIGH);
    }


    void loop() {

      float h = dht.readHumidity();
     
      // Считываем температуру
     
      float t = dht.readTemperature();
     
      // Проверка удачно прошло ли считывание.
     
      if (isnan(h) || isnan(t)) {
        digitalWrite(ledPin, HIGH);
        delay(500);
        digitalWrite(ledPin, LOW);
        delay(500);
        digitalWrite(ledPin, HIGH);
        delay(500);
        digitalWrite(ledPin, LOW);
        delay(500);
        digitalWrite(ledPin, HIGH);
        delay(500);
        digitalWrite(ledPin, LOW);
        delay(2000);
     
    // Serial.println("Не удается считать показания\n");
     
      return;
     
      }
     
      /*Serial.print(h);
      Serial.print("   \n");
      Serial.print(t);
      Serial.print("   \n");
      Serial.print(analogRead(alPin));
      Serial.print("   \n");
      Serial.print(digitalRead(movPin));
      Serial.print("   \n");*/

     

      while(h > 60.0){
        digitalWrite(relayout1, LOW);
        delay(60000);
        break;
      }
      while(digitalRead(movPin) == 1)
      {
        digitalWrite(relayout1, LOW);

        if(analogRead(alPin) > 700)
        {
          digitalWrite(relayout2, LOW);
          delay(60000);
        }
        else
        {
          digitalWrite(relayout2, HIGH);
          delay(60000);
        }
      }
      digitalWrite(relayout2, HIGH);
      digitalWrite(relayout1, HIGH);
    }


     
     
  2. parovoZZ

    parovoZZ Гуру

    Юзай вачдог.
     
  3. fogary

    fogary Гик

    Здесь логичнее использовать IF вместо WHILE, или я что-то не понимаю?
     
  4. cordis

    cordis Нуб

    Nano вроде не поддерживает, не?
     
  5. parovoZZ

    parovoZZ Гуру

    Вачдог есть. Его не может не быть.
     
  6. ostrov

    ostrov Гуру

    Нано это Атмега328, все там есть. Но delay(60000) все равно шедевр!
     
  7. Gomez

    Gomez Гик

    Вот, например, про watchdog https://geektimes.ru/post/255800/
    У меня в одном проекте "коктейль "Жадность", там много плат I2C со своими подтягивающими резисторами, а выпаивать пока лень. Тоже виснет раз в день, но watchdog спасает.