Что меняет переменную?

madtosh
Offline
Зарегистрирован: 11.04.2016

Приветствую.

Столкнулся с проблеммой, удалил из программы всё и все равно не вижу в чем косяк.

Имеем дуино нано в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)
  }
}

 

nik182
Offline
Зарегистрирован: 04.05.2015

Значений 5, а массив - размер 4. 

madtosh
Offline
Зарегистрирован: 11.04.2016

Ну так от нуля же. 0, 1, 2, 3, 4 - 5 значений

nik182
Offline
Зарегистрирован: 04.05.2015

Нет. 4 -это количество - нулевой, первый, второй, третий - всего 4. 

madtosh
Offline
Зарегистрирован: 11.04.2016

Да. Спасибо.