Непонятное поведение Ардуино
- Войдите на сайт для отправки комментариев
Вс, 23/11/2014 - 15:20
Есть код:
#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*************************************
То всё работает и температуру показывает.
Как между собой конфликтует чтение компорта с получением температуры? Как исправить?
попробуйте без 47 и 154 строки
попробуйте без 47 и 154 строки
Да, заработало!
А чем грозит исключение этих строк? Как по другому их заменить? Просто код переделывал под себя, не всё понимаю.
эти строчки активируют таймер перезагрузки. 47я строчка активирует таймер перезагрузки для срабатывания через 1 секунду, а 154я его отключает. но поскольку вы навтыкали много обращений к Serial, до 154й строчки программа дойти за время меньше секунды не успевает и таймер срабатывает -устройство сбрасывается.
А зачем тебе watchdog timer?