Что меняет переменную?
- Войдите на сайт для отправки комментариев
Ср, 11/01/2017 - 22:32
Приветствую.
Столкнулся с проблеммой, удалил из программы всё и все равно не вижу в чем косяк.
Имеем дуино нано в3, Ide 1.6.17.
4 датчика ds18b20 подключенные к разным пинам.
Со старта читаю из EEPROM 5 чисел для подводки датчиков.
В лупе раз в секунду читаю по очереди 4 датчика ds18b20.
Далее вывожу на экран 128x64(библиотека u8glib) - 5 значений корректировки датчиков(полученных из ЕЕПРОМ), и 4 температуры с датчиков.
Пятое значение корректировки датчиков (значение переменной в tempcalib[5]) начинает принимать чужое значение(от переменной temp[1]).
Код ниже, где я буратино?
#include <OneWire.h> #include <EEPROM2.h> #include <EEPROM.h> #include "U8glib.h" U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0); OneWire ds1(2); OneWire ds2(3); OneWire ds3(4); OneWire ds4(5); String strtemp[4]=""; int tempcalib[4]; int temp[4]; void setup ( void ) { //EEPROM.write(10,107); //EEPROM.write(11,11); //EEPROM.write(12,12); //EEPROM.write(13,13); //EEPROM.write(14,14); for (byte i=0; i<5; i++){ //Читаем 5 значений калибровки из ячеек 10-14 tempcalib[i]=EEPROM.read(10+i); if(tempcalib[i]>100){ tempcalib[i]=100-tempcalib[i]; } } for (byte i=1; i<5; i++){ tempProcess(0,i);//конвентируем } } void loop ( void ) { //ТУТ ЛУУУУУУУУП!!!!!!!!!!!!!!! unsigned long previosmillis; byte oprosT=0; while (1){ if (millis()-previosmillis>1000){//Раз в секунду опрашиваем датчики по порядку previosmillis=millis(); temp[oprosT]= tempProcess(1,oprosT+1); tempProcess(0,oprosT+1); strtemp[oprosT]=String(temp[oprosT]/10.0,1); oprosT++; if(oprosT>3){ oprosT=0; } } u8g.firstPage(); //Рисуем экран do { draw(); } while( u8g.nextPage() ); } } void draw(void) { u8g.setFont(u8g_font_6x10r); u8g.setPrintPos(0,9); u8g.print(String(tempcalib[0])+" "+String(tempcalib[1])+" "+String(tempcalib[2])+" "); u8g.print(String(tempcalib[3])+" "+String(tempcalib[4])); u8g.setPrintPos(0,23); u8g.print("T1="+String(strtemp[0])); u8g.setPrintPos(0,34); u8g.print("T2="+String(strtemp[1])); u8g.setPrintPos(0,45); u8g.print("T3="+String(strtemp[2])); u8g.setPrintPos(0,56); u8g.print("T4="+String(strtemp[3])); } int tempProcess(boolean ch,int numberDS){ int t=0; if(!ch){ switch (numberDS){ case 1: ds1.reset(); ds1.write(0xCC); ds1.write(0x44); break; case 2: ds2.reset(); ds2.write(0xCC); ds2.write(0x44); break; case 3: ds3.reset(); ds3.write(0xCC); ds3.write(0x44); break; case 4: ds4.reset(); ds4.write(0xCC); ds4.write(0x44); break; } } else{ switch (numberDS){ case 1: ds1.reset(); ds1.write(0xCC); ds1.write(0xBE); t= ds1.read(); t = t | (ds1.read()<<8); break; case 2: ds2.reset(); ds2.write(0xCC); ds2.write(0xBE); t= ds2.read(); t = t | (ds2.read()<<8); break; case 3: ds3.reset(); ds3.write(0xCC); ds3.write(0xBE); t= ds3.read(); t = t | (ds3.read()<<8); break; case 4: ds4.reset(); ds4.write(0xCC); ds4.write(0xBE); t= ds4.read(); t = t | (ds4.read()<<8); break; } //return t>>4;//целые *C, десятые отброшены //return (t+8)>>4;//целые *С с округлением return (t*10)>>4;//целое в десятых *C (214=>21,4*C) } }
Значений 5, а массив - размер 4.
Ну так от нуля же. 0, 1, 2, 3, 4 - 5 значений
Нет. 4 -это количество - нулевой, первый, второй, третий - всего 4.
Да. Спасибо.