Непонятное поведение Ардуино

Sirocco
Offline
Зарегистрирован: 28.09.2013

Есть код:


#include <CyberLib.h>
//#########---OneWire---############
#include <OneWire.h>
byte i;
byte present = 0;
byte type_s;
byte data[12];
byte addr[8];
float celsius;
 byte  address_1[8] = {0x28, 0x57, 0x93, 0xD7, 0x02, 0x00, 0x00, 0x84}; //1  tw  Temperature window Температура трубы окна
 byte  address_2[8] = {0x28, 0x4D, 0xCB, 0xD7, 0x02, 0x00, 0x00, 0xBB}; //2  tb  Temperature balcony Температура трубы балкона
OneWire ds (9);  // Шина OneWire на Pin 9
float tw = 0;   //Temperature window Температура трубы окна
float tb = 0;   //Temperature balcony Температура трубы балкона
int p;         //переменная счётчика циклов получения данных от DS18B20
int m = 0;     // Переменная считающая циклы массива
//#########---OneWire---############
//#########---ARRAY---############
float thArray[10]={0,0,0,0,0,0,0,0,0,0};  // Массив ДОМ температура
float hhArray[10]={0,0,0,0,0,0,0,0,0,0};  // Массив ДОМ Влажность
float tsArray[10]={0,0,0,0,0,0,0,0,0,0};  // Массив УЛИЦА температура
float hsArray[10]={0,0,0,0,0,0,0,0,0,0};  // Массив УЛИЦА Влажность
float twArray[10]={0,0,0,0,0,0,0,0,0,0};  // Массив Temperature window Температуры трубы окна
float tbArray[10]={0,0,0,0,0,0,0,0,0,0};  // Массив Temperature balcony Температуры трубы балкона
long previousMillis = 0;        // храним время изменения 
long interval = 117000;           //интервал 20минут=1.200.000  19минут30сек=1.170.000 /10 = 117.000
//long interval = 117000; //почти 2 минуты
float th_s = 0;  //средние значения
float hh_s = 0;
float ts_s = 0;
float hs_s = 0;
float tw_s = 0;
float tb_s = 0;
//#########---ARRAY---############
//###############--DHT--##################
#include <dht.h>  
dht dthStreet;
dht dthHome;
#define DHT_Street_PIN 3
#define DHT_Home_PIN 5
//###############--DHT--##################


void setup() 
    {
      Serial.begin  (57600);
     wdt_enable (WDTO_1S);
    }
void loop()
{


//###############--DHT--##################
    int chkStreet = dthStreet.read22(DHT_Street_PIN);
    int chkHome = dthHome.read22(DHT_Home_PIN);
  delay(500);  
//###############--DHT--##################

   unsigned long currentMillis = millis();
   if(currentMillis - previousMillis > interval) //проверяем не прошел ли нужный интервал, если прошел то
     {
      previousMillis = currentMillis;      // сохраняем время последнего переключения
      thArray[m] = dthHome.temperature;       //пишем текушее значение температруры в массив "х" в ячейку с номером "m"
      hhArray[m] = dthHome.humidity;
      tsArray[m] = dthStreet.temperature;
      hsArray[m] = dthStreet.humidity;
      twArray[m] = tw;
      tbArray[m] = tb;
     m++;
      if(m>=10)
       {
         th_s = (thArray[0] + thArray[1] + thArray[2] + thArray[3] + thArray[4] + thArray[5] + thArray[6] + thArray[7] + thArray[8] + thArray[9])/ 10;
         hh_s = (hhArray[0] + hhArray[1] + hhArray[2] + hhArray[3] + hhArray[4] + hhArray[5] + hhArray[6] + hhArray[7] + hhArray[8] + hhArray[9])/ 10;
         ts_s = (tsArray[0] + tsArray[1] + tsArray[2] + tsArray[3] + tsArray[4] + tsArray[5] + tsArray[6] + tsArray[7] + tsArray[8] + tsArray[9])/ 10;
         hs_s = (hsArray[0] + hsArray[1] + hsArray[2] + hsArray[3] + hsArray[4] + hsArray[5] + hsArray[6] + hsArray[7] + hsArray[8] + hsArray[9])/ 10;
         tw_s = (twArray[0] + twArray[1] + twArray[2] + twArray[3] + twArray[4] + twArray[5] + twArray[6] + twArray[7] + twArray[8] + twArray[9])/ 10;
         tb_s = (tbArray[0] + tbArray[1] + tbArray[2] + tbArray[3] + tbArray[4] + tbArray[5] + tbArray[6] + tbArray[7] + tbArray[8] + tbArray[9])/ 10;
         m = 0;
       }     
     }

//****************READ*COM*PORT*************************************
    if (Serial.available()>1) 
    {   
       uint8_t inByte = Serial.read();   
        if(inByte=='#')
         { 
          inByte = Serial.read();
          if(inByte=='W')
          {
           delay_ms(100); 
            Serial.print("{\"sensor_data\":{");  //Открываем тег для API [мгновенные значения датчиков]
            delay_ms(1);
            //=====DTH=HOME=======
            Serial.print("\"th\":");
            delay_ms(1);
            Serial.print(dthHome.temperature, 1);
            Serial.print(",");
            delay_ms(1);
            Serial.print("\"hh\":");
            delay_ms(1);
            Serial.print(dthHome.humidity, 1);
            Serial.print(",");
            //=====DTH=STREET=====
            delay_ms(1);
            Serial.print("\"ts\":");
            delay_ms(1);
            Serial.print(dthStreet.temperature, 1);
            Serial.print(",");
            delay_ms(1);
            Serial.print("\"hs\":");
            delay_ms(1);
            Serial.print(dthStreet.humidity, 1);
            Serial.print(",");
            //=====t window=====  
            delay_ms(1);          
            Serial.print("\"tw\":");
            Serial.print(tw);
            Serial.print(",");
            //=====t balcon===== 
            delay_ms(1);           
            Serial.print("\"tb\":");
            Serial.print(tb);
            Serial.print("}}");        //Закрываем тег для API [мгновенные значения датчиков]
            } 
//========== Мгновенные значения ==========================

//========== Усреднённые значения для БД ==================
          if(inByte=='T')
          {
           delay_ms(100);
            Serial.print("th_s: ");       //
            Serial.print(th_s);          //ДОМ ТЕМПЕРАТУРА среднее
            delay_ms(1);
            Serial.print(" hh_s: ");      //
            Serial.print(hh_s);          //ДОМ ВЛАЖНОСТЬ среднее
            delay_ms(1);
            Serial.print(" ts_s: ");      //
            Serial.print(ts_s);          //УЛИЦА ТЕМПЕРАТУРА среднее
            delay_ms(1);
            Serial.print(" hs_s: ");      //
            Serial.print(hs_s);          //УЛИЦА ВЛАЖНОСТЬ среднее
            delay_ms(1);
            Serial.print(" tw_s: ");      //
            Serial.print(tw_s);          //Temperature window Температура трубы окна СРЕДНЕЕ
            delay_ms(1);
            Serial.print(" tb_s: ");        //
            Serial.print(tb_s);          //Temperature balcony Температуры трубы балкона СРЕДНЕЕ
          }
//========== Усреднённые значения для БД ==================
         
          }
     }
  wdt_reset(); 
//****************READ*COM*PORT*************************************

//############OneWire################
  p = 0;
  while(p<2)
    {
      if(ds.search(addr) != 1) 
        {
          ds.reset_search();
          delay(150);
          return;
        }
      for( i = 0; i < 8; i++) 
        {
        }
      ds.reset();
      ds.select(addr);
      ds.write(0x44, 1);
      delay(750); 
      present = ds.reset();
      ds.select(addr);
      ds.write(0xBE);
      for(i = 0; i < 9; i++)
         {
           data[i] = ds.read ();
         } 
      int16_t raw = (data[1] << 8) | data[0];
      if (type_s) 
        {
          raw = raw << 3;
          if (data[7] == 0x10) 
            {
              raw = (raw & 0xFFF0) + 12 - data[6];
            }
         } 
      else 
        {
          byte cfg = (data[4] & 0x60);
          if (cfg == 0x00) raw = raw & ~7;  // 9 bit resolution, 93.75 ms
          else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
          else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
        }
      celsius = (float)raw / 16.0;
      if (!memcmp(address_1, addr, 8)) 
        {
         tw = celsius;
        }
      if (!memcmp(address_2, addr, 8)) 
        {
         tb = celsius;
        }
  p++;
  }
//############OneWire################
    

}

Он может работать, если не подключать DS18B20. Стоит подключить его, как на ардуино начинает моргать с высокой частотой светодиод pin13. Причём помогает только отключение питания, сброс не помогает.

Если кусок кода

 //############OneWire################

поместить в самое начало программы, то такая беда происзодит сразу, даже без подключения DS18B20. Если убрать кусок кода

//****************READ*COM*PORT*************************************

То всё работает и температуру показывает.

Как между собой конфликтует чтение компорта с получением температуры? Как исправить?

avton
avton аватар
Offline
Зарегистрирован: 11.05.2014

  попробуйте без 47 и 154 строки

Sirocco
Offline
Зарегистрирован: 28.09.2013

avton пишет:

  попробуйте без 47 и 154 строки

Да, заработало!

А чем грозит исключение этих строк? Как по другому их заменить? Просто код переделывал под себя, не всё понимаю.

Maverik
Offline
Зарегистрирован: 12.09.2012

эти строчки активируют таймер перезагрузки. 47я строчка активирует таймер перезагрузки для срабатывания через 1 секунду, а 154я его отключает. но поскольку вы навтыкали много обращений к Serial, до 154й строчки программа дойти за время меньше секунды не успевает и таймер срабатывает -устройство сбрасывается.

 

Radjah
Offline
Зарегистрирован: 06.08.2014

А зачем тебе watchdog timer?