Arduino зависает...

Тема в разделе "Arduino & Shields", создана пользователем SlavikSul, 29 май 2017.

  1. SlavikSul

    SlavikSul Нуб

    Всем доброго времени суток!
    У меня есть: RobotDyn Mega (полный аналог Arduino Mega 2560); DHT11 (цифровой датчик температуры и влаги); TM1637 (дисплей часов); DS1307 (Часы реального времени).
    На часы я время залил.
    Код (C++):
    #include <dht.h>    //Библиотека для датчика температуры и влажности
    #include "TM1637.h"   //Библиотека для дисплея
    #include <Wire.h>   //
    #include "RTClib.h"   //Бибилтотека для часов реального времени

    #define CLK 48    //Синхросигнал для дисплея
    #define DIO 50    //данные для дисплея
    int vcc=52;       //питание 5в для дисплея (у меня не проводков со штекерами,
                      //поэтому я воткнул дисплей прямо в ардуинку =D)

    DHT sensor = DHT();
    TM1637 disp(CLK,DIO);
    RTC_DS1307 rtc;

    int8_t TimeDisp[] = {0x00,0x00,0x00,0x00};
    unsigned char ClockPoint = 1;

    int T=0;    //для температуры
    int H=0;    //для влажности
    int O=0;    //для записи секунд
    void setup()
    {
        rtc.begin();
        disp.init();
        Serial.begin(9600);  
        sensor.attach(40);    //вывод DATA датчика DHT11 подключен к пину 40
        pinMode(vcc, OUTPUT);   //
        digitalWrite(vcc, HIGH);
        delay(1000);
    }

    void loop()
    {
        DateTime now = rtc.now();   //Получаем время из часов
        sensor.update();    //
        disp.set(0);    //устанавливаем яркость дисплея
       
        //switch используется для выдачи данных с датчика
        //температуры и влаги на ком порт
        switch (sensor.getLastError())
        {
            case DHT_ERROR_OK:
                char msg[128];
                sprintf(msg, "Temperature = %dC, Humidity = %d%%",
                        sensor.getTemperatureInt(), sensor.getHumidityInt());                  
                Serial.println(msg);
                break;
            case DHT_ERROR_START_FAILED_1:
                Serial.println("Error: start failed (stage 1)");
                break;
            case DHT_ERROR_START_FAILED_2:
                Serial.println("Error: start failed (stage 2)");
                break;
            case DHT_ERROR_READ_TIMEOUT:
                Serial.println("Error: read timeout");
                break;
            case DHT_ERROR_CHECKSUM_FAILURE:
                Serial.println("Error: checksum error");
                break;
        }
        T=sensor.getTemperatureInt(); H=sensor.getHumidityInt();    //записываем температу и влажность в переменные,
        ClockPoint = (~ClockPoint) & 0x01;    //это чтобы на дисплее две точки мигали

        O=now.second();   //записываем секунду
        if (O>0 && O<=10 or O>20 && O<=30 or O>40 && O<=50)   //если секунда от 0 до 10, от 20 до 30, и от 40 до 50, то показываем время
        {
          if(ClockPoint)disp.point(POINT_ON);   //включам две точки на дисплее
          else disp.point(POINT_OFF);   //выключаем две точки на дисплее
          TimeDisp[0]=now.hour()/10;
          TimeDisp[1]=now.hour()%10;
          TimeDisp[2]=now.minute()/10;
          TimeDisp[3]=now.minute()%10;
        }
        if (O>10 && O<=15 or O>30 && O<=35 or O>50 && O<=55)    //если секунда от 10 до 15, от 30 до 35, и от 50 до 55, то показываем температуру
        {  
          disp.point(POINT_OFF);    //выключаем две точки на дисплее
          TimeDisp[0]=T/10;
          TimeDisp[1]=T%10;
          TimeDisp[2]='$';  //+
          TimeDisp[3]='$';  //$
        }
        if (O>15 && O<=20 or O>35 && O<=40 or O>55 && O<=59)    //если секунда от 15 до 20, от 35 до 40, и от 55 до 59, то показываем влажность
        {
          disp.point(POINT_OFF);    //выключаем две точки на дисплее
          TimeDisp[0]='$';
          TimeDisp[1]='$';
          TimeDisp[2]=H/10;
          TimeDisp[3]=H%10;    
        }
        disp.display(TimeDisp);   //
        delay(1000);  
    }

    Я не понимаю, что не так. Ардуинка через некоторое время просто зависает, но если отсоединить и снова присоединить дисплей, он продолжает работать, и через некоторое время опять зависает.
    Может быть какая-нибудь проблема с часами реального времени?
    Две ардуинки с двумя разными часами и разными кодами зависают, а третья ардуинка - работала без проблем. Правда третью ардуинку с февраля не использовал, поскольку на ней я сделал автоматическую гирлянду.
     
  2. Alex77

    Alex77 Нерд

    приветствую, у меня была такая же проблема с серво. Я подключил дополнительное питание через 220вольт на входе = 9В 3А на выходе, тогда она начала работать исправно
     
  3. DetSimen

    DetSimen Guest

    скорее всего, динамически распределяемая память наползает на стек. Из-за какой нибудь библиотеки. Пока спастить тебе можно только Вотчдогом. Решение временное, но сработает, пока опыта не наберешся.