Что меняет переменную?
- Войдите на сайт для отправки комментариев
Ср, 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.
Да. Спасибо.