Помогите решить проблему SD18B20
- Войдите на сайт для отправки комментариев
Чт, 07/05/2015 - 22:16
Здравствуйте. Помогите решить проблему, есть скетч в котором на матрицы 8X8 выводится бегущей
строкой температура с датчика SD18B20 каждые 60 секунд, есть кнопки которые вызывают программу.
Во время обновления температуры раз 60 секунд примерно на 5 секунд перестают работать кнопки.
Помогите решить возможно материальное вознаграждение.
// монетоприемник на одну монету (жетон) - HI-N07CS
const int moneyPin2=3;
int pulse2=0;
unsigned long timeAllPulse2=500; // макс. время приема монеты
unsigned long timeCount2=0;
unsigned int sum=0;
// EEPROM для хранения настроек
//0-1 - номинал
// интервалы
//2-
#include <EEPROM.h>
#include <OneWire.h>
OneWire ds(19); // on pin A5
unsigned long millistemp=0;
int t_temp=0;
int heating=0;
#define TEMP1 20
#define TEMP2 20
int z1,z2;
byte my_addr[8]={0x28,0xD9,0xF6,0x26,6,0,0,0xDE};
//28 D9 F6 26 6 0 0 DE
//#include <SPI.h>
//#define spiRelay 8
//#define spiDisplay 10
//#define keyPin1 14
//#define keyPin2 15
#define MPAUSE1 5000
unsigned long time_millis1=0;
int pause1=0;
int valbutton=0;
unsigned long millisbutton1[9]={0,0,0,0,0,0,0,0,0};
unsigned long tekinterval1[9]={1500,80,60,3,9,10,70,50,9};
unsigned long mininterval1[9]={10,1,1,1,1,1,1,10,1};
unsigned long maxinterval1[9]={10000,100,100,100,100,100,100,10000,20};
unsigned long stepinterval1[9]={10,1,1,1,1,1,1,10,10};
int tekprg=0;
int tekprgpr=0;
unsigned long millisinterval=0;
unsigned long millispause1=0;
// дисплей WH1602
//#include <LiquidCrystal.h>
//LiquidCrystal lcd(10,9,7,6,5,4);
#include <MaxMatrix.h>
MaxMatrix m(7,6,5,5);
byte comma[] = {
1, 8, B11000000};
byte figure[40][10]={
{8,8, //0
B00000000,
B11111111,
B11111111,
B11000011,
B11000011,
B11000011,
B11111111,
B11111111},
{8,8, //1
B00000000,
B00000000,
B00000000,
B00000000,
B00000100,
B00000110,
B11111111,
B11111111},
{8,8, //2
B00000000,
B11000110,
B11100111,
B11110011,
B11111011,
B11011111,
B11001111,
B11000110},
{8,8, //3
B00000000,
B11000011,
B11011011,
B11011011,
B11011011,
B11011011,
B11111111,
B11111111},
{8,8, //4
B00000000,
B00011111,
B00011111,
B00011000,
B00011000,
B00011000,
B11111111,
B11111111},
{8,8, //5
B00000000,
B11011111,
B11011111,
B11011011,
B11011011,
B11011011,
B11111011,
B11111011},
{8,8, //6
B00000000,
B11111111,
B11111111,
B11011011,
B11011011,
B11011011,
B11111011,
B11111011},
{8,8, //7
B00000000,
B00000011,
B00000011,
B11110011,
B11111011,
B00001111,
B00000111,
B00000011},
{8,8, //8
B00000000,
B11111111,
B11111111,
B11011011,
B11011011,
B11011011,
B11111111,
B11111111},
{8,8, //9
B00000000,
B11011111,
B11011111,
B11011011,
B11011011,
B11011011,
B11111111,
B11111111},
{8,8, //пустота
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000000},
{8,8, //для мигания
B01100111,
B11100011,
B01110001,
B01101000,
B01101000,
B01101001,
B11110011,
B01100111},
{8,8, //прогр. номинал
B00011111,
B00000100,
B00011111,
B00000000,
B00100000,
B00010000,
B11111000,
B00000000},
{8,8, //прогр. задержка 1
B00000001,
B00011111,
B00000001,
B00000000,
B00100000,
B00010000,
B11111000,
B00000000},
{8,8, //прогр. задержка 2
B00000001,
B00011111,
B00000001,
B00000000,
B10001000,
B11001000,
B10111000,
B00000000},
{8,8, //прогр. задержка 3
B00000001,
B00011111,
B00000001,
B00000000,
B10101000,
B10101000,
B11111000,
B00000000},
{8,8, //прогр. задержка 4
B00000001,
B00011111,
B00000001,
B00000000,
B00111000,
B00100000,
B11111000,
B00000000},
{8,8, //прогр. задержка 5
B00000001,
B00011111,
B00000001,
B00000000,
B10111000,
B10101000,
B11101000,
B00000000},
{8,8, //прогр. задержка 6
B00000001,
B00011111,
B00000001,
B00000000,
B11100000,
B10110000,
B11101000,
B00000000},
{8,8, //прогр. пауза
B00011111,
B00000101,
B00000111,
B00000000,
B00100000,
B00010000,
B11111000,
B00000000},
{8,8, //скорость бегущей строки и выполнение программы 0
B01100111,
B11100011,
B01110001,
B01101000,
B01101000,
B01101001,
B11110011,
B01100111},
{8,8, //выполнение программы 1
B00011111,
B00000001,
B00011111,
B00000000,
B00100000,
B00010000,
B11111000,
B00000000},
{8,8, //выполнение программы 2
B00011111,
B00000001,
B00011111,
B00000000,
B10001000,
B11001000,
B10111000,
B00000000},
{8,8, //выполнение программы 3
B00011111,
B00000001,
B00011111,
B00000000,
B10101000,
B10101000,
B11111000,
B00000000},
{8,8, //выполнение программы 4
B00011111,
B00000001,
B00011111,
B00000000,
B00111000,
B00100000,
B11111000,
B00000000},
{8,8, //выполнение программы 5
B00011111,
B00000001,
B00011111,
B00000000,
B10111000,
B10101000,
B11101000,
B00000000},
{8,8, //выполнение программы 6
B00011111,
B00000001,
B00011111,
B00000000,
B11100000,
B10110000,
B11101000,
B00000000},
{8,8, //выполнение программы пауза
B00011111,
B00000001,
B00011111,
B00000000,
B11111000,
B00001000,
B11111000,
B00000000},
{8,8, //пустота
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000000},
{8,8, //буква П
B00000000,
B11111111,
B11111111,
B00000011,
B00000011,
B00000011,
B11111111,
B11111111},
{8,8, //буква У
B00000000,
B00000000,
B00000001,
B10000011,
B11000110,
B01101100,
B00111111,
B00011111},
{8,8, //буква С
B00000000,
B01111110,
B11111111,
B11000011,
B11000011,
B11000011,
B11000011,
B01000010},
{8,8, //буква Т
B00000000,
B00000000,
B00000011,
B00000011,
B11111111,
B11111111,
B00000011,
B00000011},
{8,8, //буква И
B00000000,
B11111111,
B11111111,
B00110000,
B00011000,
B00001100,
B11111111,
B11111111},
{8,8, //буква Е
B00000000,
B11111111,
B11111111,
B11011011,
B11011011,
B11011011,
B11000011,
B11000011},
{8,8, //буква Ж
B00000000,
B11000011,
B01100110,
B00111100,
B11111111,
B00111100,
B01100110,
B11000011},
{8,8, //буква Н
B00000000,
B11111111,
B11111111,
B00011000,
B00011000,
B00011000,
B11111111,
B11111111},
{8,8, //знак=
B00000000,
B00000000,
B00010100,
B00010100,
B00010100,
B00010100,
B00010100,
B00000000},
{8,8, //знак градус
B00000000,
B00000000,
B00000000,
B00000000,
B00000111,
B00000101,
B00000111,
B00000000},
{8,8, //знак -
B00000000,
B00000000,
B00001000,
B00001000,
B00001000,
B00001000,
B00000000,
B00000000},
};
int per1=0;
#include <Keypad.h>
const byte ROWS = 4; //four rows
const byte COLS = 4; //four columns
char keys[ROWS][COLS] = {
{'1','2','3','a'},
{'4','5','6','b'},
{'7','8','9','c'},
{'*','0','#','d'}
};
byte rowPins[ROWS] = {14, 15, 16, 17}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {18, 19,9,4}; //connect to the column pinouts of the keypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
char key=' ';
// *********************************
int prg=0;
int pos_options=0;
//char* str_options[7]={"nominal","delay1 ","delay2 ","delay3 ","delay4 ","delay5 ","delay6 "};
int kstep=1;
unsigned long millisblink=0;
int blink1=0;int blink0=0;
byte arrblink[]={10,10,10,0,29,30,31,32,33,32,34,10,35,34,32,0,36,10,32,37,10,10,10,38,31};
//** выводы реле
int arrrelay[6]={2,8,10,11,12,13};
//byte arrdorelay[8][6]={{1,1,1,0,1,0},{0,1,1,0,1,0},{0,0,1,0,1,0},
// {0,0,1,1,1,0},{0,0,0,0,1,0},{0,0,0,0,0,1},
// {0,0,0,0,0,0},{0,0,0,0,0,0}};
byte arrdorelay[8][6]={{0,0,0,1,0,1},{1,0,0,1,0,1},{1,1,0,1,0,1},
{1,1,0,0,0,1},{1,1,1,1,0,1},{1,1,1,1,1,0},
{1,1,1,1,1,1},{1,1,1,1,1,1}};
#include <MsTimer2.h>
void flash()
{
if(sum>0)
return;
MsTimer2::stop();
blink0=(blink0+1)%8;
if(blink0==0)
blink1=(blink1+1)%sizeof(arrblink);
for(int i=0;i<6;i++)
{
m.writeSprite(i*8-blink0,0,figure[arrblink[(blink1+i)%sizeof(arrblink)]]);
}
MsTimer2::set(tekinterval1[8]*10, flash); // period
MsTimer2::start();
}
unsigned long millisendprg=0;
void setup()
{
Serial.begin(9600);
pinMode(moneyPin2,INPUT);
//attachInterrupt(0,count_pulse,FALLING);
//attachInterrupt(1,count_pulse2,FALLING);
m.init();
m.setIntensity(15);
Serial.println("setup ok!!");
//*****************************************
//for(int i=0;i<8;i++)
// {EEPROM.write(i*2,highByte(tekinterval1[i]));
// EEPROM.write(i*2+1,lowByte(tekinterval1[i]));}
//*****************************************
for(int i=0;i<9;i++)
{
tekinterval1[i]=(EEPROM.read(i*2)<<8)+EEPROM.read(i*2+1);
Serial.println(tekinterval1[i]);
}
//** выводы реле 2,8,10,11,12,13
for(int i=0;i<6;i++)
{pinMode(arrrelay[i],OUTPUT);delay(20);digitalWrite(arrrelay[i],HIGH);}
Serial.println("spiok!!");
m.writeSprite(0, 0, figure[11]);
m.writeSprite(8, 0, figure[0]);
m.writeSprite(16,0, figure[0]);
m.writeSprite(24, 0, figure[0]);
m.writeSprite(32, 0, figure[0]);
delay(2000);
attachInterrupt(1,count_pulse2,FALLING);
t_temp=get_temp();
if(t_temp<999)
{
//t_temp=t_temp;
z1=abs(t_temp)/10;
z2=byte(abs(t_temp)%10);
//arrblink[22]=byte(z2);
if(t_temp<0)
arrblink[20]=39;
else
arrblink[20]=10;
if(z1<1)
{arrblink[21]=byte(z2);arrblink[22]=38;arrblink[23]=31;arrblink[24]=10;}
else
{arrblink[21]=byte(z1);arrblink[22]=byte(z2);arrblink[23]=38;arrblink[24]=31;}
}
}
void loop()
{
if(prg==1)
{
key = keypad.getKey();
if(key)
{doForKey(key);heating=0;}
}
else
{
//
if(millis()-millisblink>tekinterval1[8]*10 && sum==0)
{
millisblink=millis();
blink0=(blink0+1)%8;
if(blink0==0)
blink1=(blink1+1)%sizeof(arrblink);
for(int i=0;i<6;i++)
{
m.writeSprite(i*8-blink0,0,figure[arrblink[(blink1+i)%sizeof(arrblink)]]);
}
}
//
if(millis()-millistemp>60000 && sum==0)
{
MsTimer2::set(tekinterval1[8]*10, flash); // period
MsTimer2::start();
t_temp=get_temp();
if(t_temp<999)
{
//t_temp=t_temp;
z1=abs(t_temp)/10;
z2=byte(abs(t_temp)%10);
//arrblink[22]=byte(z2);
if(t_temp<0)
arrblink[20]=39;
else
arrblink[20]=10;
if(z1<1)
{arrblink[21]=byte(z2);arrblink[22]=38;arrblink[23]=31;arrblink[24]=10;}
else
{arrblink[21]=byte(z1);arrblink[22]=byte(z2);arrblink[23]=38;arrblink[24]=31;}
String t1=" t="+String(t_temp);
Serial.print("temp=");Serial.println(int(t_temp));
//Serial.println(z1);Serial.print(' ');Serial.print(z2);Serial.println();
//Serial.println(t1);
for(int j=20;j<25;j++)
{Serial.print(arrblink[j],DEC);Serial.print(' ');
}
//Serial.println();
millistemp=millis();
}
else
Serial.println("no temp");
MsTimer2::stop();
}
// прошло максимальное время приема монеты?
if(pulse2>0 && (millis()-timeCount2)>timeAllPulse2)
{
//Serial.println("moneta - ok");
//Serial.println(EEPROM.read(0));
//Serial.println(EEPROM.read(1));
//sum=sum+(EEPROM.read(0)<<8)+EEPROM.read(1);
sum=sum+tekinterval1[0];
//Serial.print("sum=");Serial.println(sum);
view_figure(sum,1);
pulse2=0;
}
key = keypad.getKey();
if(key)
{doForKey(key);heating=0;}
if((millis()-millisinterval)>tekinterval1[tekprg]*100 && pause1==0 && tekprg>0 && tekprg<7 && sum>0)
{
millisinterval=millis();
sum=sum-10;
//show_sum(sum);
view_figure(sum,1);
if(sum==0)
{tekprg=0;send_led(8);send_relay(8);blink1=0;blink0=0;
heating=0;millisendprg=millis();
}
}
//
if(pause1==1)
{
if((millis()-millispause1)>tekinterval1[7]*100)
{pause1=0;
tekprg=5;//tekprg=tekprgpr;
send_led(tekprg);
send_relay(tekprg);
//Serial.print("pause1=");Serial.println(pause1);
//Serial.print("tekprg=");Serial.println(tekprg);
}
}
//Serial.print("A0=");Serial.println(analogRead(A0));
}
if(t_temp<TEMP1 && heating==0 && millis()-millispause1>10000 && millis()-millisendprg>20000)
{heating=1;//Serial.println("ON");
digitalWrite(arrrelay[0],0);digitalWrite(arrrelay[4],0);
}
if(t_temp>TEMP2 && heating==1)
{heating=0;//Serial.println("OFF");
digitalWrite(arrrelay[0],1);digitalWrite(arrrelay[4],1);
}
}
// обработка нажатия кнопки
void doForKey(char key) {
//Serial.print("key="); Serial.println(key);
switch(key)
{
case '1': if(prg<1 && sum>0)
{tekprg=1;pause1=0;send_relay(1);view_figure(sum,1);}
break;
case '2': if(prg<1 && sum>0)
{tekprg=2;pause1=0;send_relay(2);view_figure(sum,1);}
break;
case '3': if(prg<1 && sum>0)
{tekprg=3;pause1=0;send_relay(3);view_figure(sum,1);}
break;
case '4': if(prg<1 && sum>0)
{tekprg=4;pause1=0;send_relay(4);view_figure(sum,1);}
break;
case '5': if(prg<1 && sum>0)
{tekprg=5;pause1=0;send_relay(5);view_figure(sum,1);}
break;
case '6': if(prg<1 && sum>0)
{tekprg=6;pause1=0;send_relay(6);view_figure(sum,1);}
break;
case '7': if(prg<1 && sum>0 && tekprg>0)
{tekprgpr=tekprg;pause1=1;millispause1=millis();
send_relay(7);tekprg=7;view_figure(sum,1);
}
break;
case '*': prg=1-prg;
if(prg==1)
{show_prg(pos_options);send_relay(8);
send_led(8);tekprg=0;
}
else {
//show_sum(sum);
sum=0;
//view_figure(sum,1);
blink1=0;blink0=0;
pos_options=0;tekprg=0;}
break;
case '9': if(prg==1) // следующий параметр
{
pos_options=(pos_options+1)%9;
Serial.print("pos_options="); Serial.println(pos_options);
show_prg(pos_options);
}
break;
case 'a': // +монета
sum=sum+tekinterval1[0];
view_figure(sum,1);
pulse2=0;
break;
case 'b': sum=10;
// обнуление (было предыдущий параметр)
/*if(prg==1)
{
pos_options=pos_options-1;
if(pos_options<0)
pos_options=8;
show_prg(pos_options);
}*/
break;
case '0': if(prg==1) // уменьшение значения
{
if(stepinterval1[pos_options]*kstep<tekinterval1[pos_options])
tekinterval1[pos_options]=tekinterval1[pos_options]-stepinterval1[pos_options]*kstep;
else
tekinterval1[pos_options]=0;
tekinterval1[pos_options]=max(tekinterval1[pos_options],mininterval1[pos_options]);
show_prg(pos_options);
}
break;
case '8': if(prg==1) // увеличение значения
{
tekinterval1[pos_options]=tekinterval1[pos_options]+stepinterval1[pos_options]*kstep;
tekinterval1[pos_options]=min(tekinterval1[pos_options],maxinterval1[pos_options]);
show_prg(pos_options);
}
break;
case '#': if(prg==1) // коэффициент*10
{
kstep=10/kstep;
}
break;
case 'd': if(prg==1) // сохранить настройки
{;
for(int i=0;i<9;i++)
{EEPROM.write(i*2,highByte(tekinterval1[i]));
EEPROM.write(i*2+1,lowByte(tekinterval1[i]));}
}
break;
case 'с': if(prg==1) // не сохранять настройки
{;
for(int i=0;i<9;i++)
{
tekinterval1[i]=(EEPROM.read(i*2)<<8)+EEPROM.read(i*2+1);
Serial.println(tekinterval1[i]);
}
}
break;
default:
break;
}
}
// обработка прерывания монетоприемника - получить кол-во импульсов
//
void count_pulse2()
{
//detachInterrupt(0);
detachInterrupt(1);
pulse2++;
if(pulse2==1)
timeCount2=millis();
//attachInterrupt(0,count_pulse,FALLING);
attachInterrupt(1,count_pulse2,FALLING);
}
// индикация отсчета
void show_sum(int val)
{
float sum1;
//lcd.setCursor(2,0);lcd.print("working ");
//lcd.setCursor(2,1);lcd.print(" ");
sum1=float(val)/10;
//lcd.setCursor(2,1);
//lcd.print(sum1);
}
// индикация настройки
void show_prg(int val)
{
float interval1;
//lcd.setCursor(2,0);
//lcd.print(str_options[val]);
//lcd.setCursor(2,1);
//lcd.print(" ");
//interval1=float(tekinterval1[val])/10;
//lcd.setCursor(2,1);
//lcd.print(interval1);
view_figure(tekinterval1[val],2);
}
// запуск/останов реле
void send_relay(int val)
{
//Serial.print("sendrelay=");Serial.println(val);
for(int i=0;i<6;i++)
digitalWrite(arrrelay[i],HIGH);
if(val<5)
{digitalWrite(arrrelay[4],LOW);
delay(1000);}
for(int i=0;i<6;i++)
digitalWrite(arrrelay[i],arrdorelay[val-1][i]);
}
// запуск/останов реле+светодиодов
void send_led(byte val)
{
//digitalWrite(spiRelay,LOW);
//SPI.transfer(B00000001<<(tekprg-1));
//SPI.transfer(B00000001<<(val-1));
//SPI.transfer(B00000001<<(val-1));
//digitalWrite(spiRelay,HIGH);
}
// показать цифры
void view_figure(unsigned int num,int mode)
{
int num1,num2,num3,num4,num5;
num1=num/10000;
num2=(num-num1*10000)/1000;
num3=(num-num1*10000-num2*1000)/100;
num4=(num-num1*10000-num2*1000-num3*100)/10;
num5=num-num1*10000-num2*1000-num3*100-num4*10;
//Serial.print("num1="); Serial.print(num1);
//Serial.print(" num2="); Serial.print(num2);
//Serial.print(" num3="); Serial.print(num3);
//Serial.print(" num4="); Serial.print(num4);
if(num5>0)
{
m.writeSprite(32, 0, figure[num5]);
m.writeSprite(24, 0, figure[num4]);
m.writeSprite(16,0, figure[num3]);
m.writeSprite(8, 0, figure[num2]);
m.writeSprite(32,0, comma);
}
else
{
m.writeSprite(32, 0, figure[num4]);
m.writeSprite(24, 0, figure[num3]);
m.writeSprite(16,0, figure[num2]);
m.writeSprite(8, 0, figure[num1]);
}
if(mode>1)
{
m.writeSprite(0, 0, figure[pos_options+12]);
}
else
m.writeSprite(0, 0, figure[tekprg+20]);
}
// получение тмпературы датчика
int get_temp()
{
byte i;
byte present = 0;
byte data[12];
byte addr[8];
int Temp,SignBit;
/*if ( !ds.search(addr)) {
//Serial.print("No more addresses.\n");
ds.reset_search();
return 999;
}
Serial.print("R="); //R=28 Not sure what this is
for( i = 0; i < 8; i++) {
Serial.print(addr[i], HEX);
Serial.print(" ");
}
if ( OneWire::crc8( addr, 7) != addr[7]) {
Serial.print("CRC is not valid!\n");
return 0;
}
if ( addr[0] != 0x28) {
Serial.print("Device is not a DS18S20 family device.\n");
return 0;
}*/
ds.reset();
ds.select(my_addr);
ds.write(0x44,1); // start conversion, with parasite power on at the end
delay(1000); // maybe 750ms is enough, maybe not
// we might do a ds.depower() here, but the reset will take care of it.
present = ds.reset();
ds.select(my_addr);
ds.write(0xBE); // Read Scratchpad
for ( i = 0; i < 9; i++) { // we need 9 bytes
data[i] = ds.read();
}
Temp=(data[1]<<8)+data[0];//take the two bytes from the response relating to temperature
// Проверяем - или нет
Temp = Temp/16;
return Temp;
}
ШТО ЭТО ? Что такое sd18B20 ? И что это за завораживающее форматирование текста !?
нуу для начала Вы бы привели публикуемый код в удобовоспринимаемый вид. прогрните через текстовый редактор и замените на пробел.
между 570 и 594 строками подвешивает, пока происходит, подробнее некогда разбираться. возможно библиотека MaxMatrix бегущую строку пока выводит все подвешивает.
Еще там раз в минуту опрашивается датчик температуры вызовом get_temp(); с задержкой в одну секунду внутри, что вызывает безусловное висение в это время всего остального. в принципе delay(1000) в 885 строке можно заменить на delay(800), если загрубить точность температуры можно это время еще уменьшить.
Можете решить проблему я оплачу.
Вы сначала оплатите, а после решим проблему.
Я не против, лиж бы проблему помогли решить.
Я не против, лиж бы проблему помогли решить.
высылайте 100$ на наш колективный акаунт. (блин, нужно подумать куда их потратим)
Грамотно опишите задачу, какая ардуина, какие матрици и сколько, зачем нужны кнопки.
А пока соедените как на картинке.
После залиь скеч
#include <OneWire.h> OneWire ds(2); // on pin 2 (a 4.7K resistor is necessary) byte deviceType; void setup(void) { Serial.begin(9600); } void loop(void) { byte i; byte type_s; byte data[12]; byte addr[8]; float celsius; if ( !ds.search(addr)) { ds.reset_search(); delay(250); return; } if (OneWire::crc8(addr, 7) != addr[7]) { return; } switch (addr[0]) { case 0x10: type_s = 1; deviceType=1; //Chip = DS18S20 or old DS1820 break; case 0x28: type_s = 0; deviceType=2;//Chip = DS18B20 break; case 0x22: type_s = 0; deviceType=3;// Chip = DS1822 break; default: deviceType=0;//������ ���������� return; } ds.reset(); ds.select(addr); ds.write(0x44, 1); delay(1000); 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; else if (cfg == 0x20) raw = raw & ~3; else if (cfg == 0x40) raw = raw & ~1; } celsius = (float)raw / 16.0; Serial.write (1); Serial.write (2); Serial.print (deviceType); Serial.write (3); for( i = 0; i < 8; i++) { Serial.write (2); Serial.print(addr[i], HEX); Serial.write (3); } Serial.write (2); Serial.print(celsius); Serial.write (3); Serial.write (4); }Посмотреть что выдаст порт выделить и при помощи Ctrl+C скопировать.
В программе 16 кнопок 6 основных при включении которых, срабатывают различные комбинации реле по таймеру, естькнопка зачисления баланса таймера и программные кнопки для редактирования настроек баланса и интервала отсчёа разных программ. Термометр нужен для изменения алгоритма включения реле, если температура упадёт ниже заданной. Всё работает нормально, только провалы в 5 секунд , не получатся зачислить баланс времени.
Матрицы для бегущей строки 5 штук MAX7219
Вот что выдаёт монитор порта с вашим скетчем: 228F5B4BC5006130.56 228F5B4BC5006130.56 228F5B4BC5006130.56 228F5B4BC5006130.56 228F5B4BC5006130.56 228F5B4BC5006130.56 228F5B4BC5006130.56 228F5B4BC5006130.56 228F5B4BC5006130.56 228F5B4BC5006130.56 228F5B4BC5006130.56 228F5B4BC5006130.56
// монетоприемник на одну монету (жетон) - HI-N07CS const int moneyPin2=3; int pulse2=0; unsigned long timeAllPulse2=500; // макс. время приема монеты unsigned long timeCount2=0; unsigned int sum=0; // EEPROM для хранения настроек //0-1 - номинал // интервалы //2- #include <EEPROM.h> #include <OneWire.h> OneWire ds(19); // on pin A5 unsigned long millistemp=0; int t_temp=0; int heating=0; #define TEMP1 20 #define TEMP2 20 int z1,z2; byte my_addr[8]={0x28,0xD9,0xF6,0x26,6,0,0,0xDE}; //28 D9 F6 26 6 0 0 DE //#include <SPI.h> //#define spiRelay 8 //#define spiDisplay 10 //#define keyPin1 14 //#define keyPin2 15 #define MPAUSE1 5000 unsigned long time_millis1=0; int pause1=0; int valbutton=0; unsigned long millisbutton1[9]={0,0,0,0,0,0,0,0,0}; unsigned long tekinterval1[9]={1500,80,60,3,9,10,70,50,9}; unsigned long mininterval1[9]={10,1,1,1,1,1,1,10,1}; unsigned long maxinterval1[9]={10000,100,100,100,100,100,100,10000,20}; unsigned long stepinterval1[9]={10,1,1,1,1,1,1,10,10}; int tekprg=0; int tekprgpr=0; unsigned long millisinterval=0; unsigned long millispause1=0; // дисплей WH1602 //#include <LiquidCrystal.h> //LiquidCrystal lcd(10,9,7,6,5,4); #include <MaxMatrix.h> MaxMatrix m(7,6,5,5); byte comma[] = { 1, 8, B11000000}; byte figure[40][10]={ {8,8, //0 B00000000, B01111110, B11111111, B11000011, B11000011, B11000011, B11111111, B01111110}, {8,8, //1 B00000000, B00000000, B00000000, B00000000, B00000100, B00000110, B11111111, B11111111}, {8,8, //2 B00000000, B11000110, B11100111, B11110011, B11111011, B11011111, B11001111, B11000110}, {8,8, //3 B00000000, B01100110, B11100111, B11000011, B11011011, B11011011, B11111111, B01100110}, {8,8, //4 B00000000, B00011111, B00011111, B00011000, B00011000, B00011000, B11111111, B11111111}, {8,8, //5 B00000000, B01011111, B11011111, B11011011, B11011011, B11011011, B11111011, B01110011}, {8,8, //6 B00000000, B01111110, B11111111, B11011011, B11011011, B11011011, B11111011, B01110010}, {8,8, //7 B00000000, B00000011, B00000011, B11110011, B11111011, B00001111, B00000111, B00000011}, {8,8, //8 B00000000, B01100110, B11111111, B11011011, B11011011, B11011011, B11111111, B01100110}, {8,8, //9 B00000000, B01001110, B11011111, B11011011, B11011011, B11011011, B11111111, B01111110}, {8,8, //пустота B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000}, {8,8, //для мигания B01100111, B11100011, B01110001, B01101000, B01101000, B01101001, B11110011, B01100111}, {8,8, //прогр. номинал B00011111, B00000100, B00011111, B00000000, B00100000, B00010000, B11111000, B00000000}, {8,8, //прогр. задержка 1 B00000001, B00011111, B00000001, B00000000, B00100000, B00010000, B11111000, B00000000}, {8,8, //прогр. задержка 2 B00000001, B00011111, B00000001, B00000000, B10001000, B11001000, B10111000, B00000000}, {8,8, //прогр. задержка 3 B00000001, B00011111, B00000001, B00000000, B10101000, B10101000, B11111000, B00000000}, {8,8, //прогр. задержка 4 B00000001, B00011111, B00000001, B00000000, B00111000, B00100000, B11111000, B00000000}, {8,8, //прогр. задержка 5 B00000001, B00011111, B00000001, B00000000, B10111000, B10101000, B11101000, B00000000}, {8,8, //прогр. задержка 6 B00000001, B00011111, B00000001, B00000000, B11100000, B10110000, B11101000, B00000000}, {8,8, //прогр. пауза B00011111, B00000101, B00000111, B00000000, B00100000, B00010000, B11111000, B00000000}, {8,8, //скорость бегущей строки и выполнение программы 0 B01100111, B11100011, B01110001, B01101000, B01101000, B01101001, B11110011, B01100111}, {8,8, //выполнение программы 1 B00000000, B00000000, B00001000, B00000100, B11111110, B00000000, B00000000, B11111111}, {8,8, //выполнение программы 2 B11000100, B10100010, B10010010, B10010010, B10010010, B10001100, B00000000, B11111111}, {8,8, //выполнение программы 3 B01000100, B10000010, B10000010, B10010010, B10010010, B01101100, B00000000, B11111111}, {8,8, //выполнение программы 4 B00011110, B00010000, B00010000, B00010000, B00010000, B11111110, B00000000, B11111111}, {8,8, //выполнение программы 5 B01001110, B10001010, B10001010, B10001010, B10001010, B01110010, B00000000, B11111111}, {8,8, //выполнение программы 6 B01111100, B10010010, B10010010, B10010010, B10010010, B01100100, B00000000, B11111111}, {8,8, //выполнение программы пауза B01001100, B10010010, B10010010, B10010010, B10010010, B01100100, B00000000, B11111111}, {8,8, //пустота B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000}, {8,8, //буква П B00000000, B11111111, B11111111, B00000011, B00000011, B00000011, B11111111, B11111111}, {8,8, //буква У B00000000, B01001111, B11011111, B11011000, B11011000, B11011000, B11111111, B01111111}, {8,8, //буква С B00000000, B01111110, B11111111, B11000011, B11000011, B11000011, B11000011, B01000010}, {8,8, //буква Т B00000000, B00000000, B00000011, B00000011, B11111111, B11111111, B00000011, B00000011}, {8,8, //буква И B00000000, B11111111, B11111111, B00110000, B00011000, B00001100, B11111111, B11111111}, {8,8, //буква Е B00000000, B11111111, B11111111, B11011011, B11011011, B11011011, B11000011, B11000011}, {8,8, //буква Ж B00000000, B11000011, B01100110, B00111100, B11111111, B00111100, B01100110, B11000011}, {8,8, //буква Н B00000000, B11111111, B11111111, B00011000, B00011000, B00011000, B11111111, B11111111}, {8,8, //знак= B00000000, B00000000, B00010100, B00010100, B00010100, B00010100, B00010100, B00000000}, {8,8, //знак градус B00000000, B00000000, B00000000, B00000000, B00000111, B00000101, B00000111, B00000000}, {8,8, //знак - B00000000, B00000000, B00001000, B00001000, B00001000, B00001000, B00000000, B00000000}, }; int per1=0; #include <Keypad.h> const byte ROWS = 4; //four rows const byte COLS = 4; //four columns char keys[ROWS][COLS] = { {'1','2','3','a'}, {'4','5','6','b'}, {'7','8','9','c'}, {'*','0','#','d'} }; byte rowPins[ROWS] = {14, 15, 16, 17}; //connect to the row pinouts of the keypad byte colPins[COLS] = {18, 19,9,4}; //connect to the column pinouts of the keypad Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); char key=' '; // ********************************* int prg=0; int pos_options=0; //char* str_options[7]={"nominal","delay1 ","delay2 ","delay3 ","delay4 ","delay5 ","delay6 "}; int kstep=1; unsigned long millisblink=0; int blink1=0;int blink0=0; byte arrblink[]={10,10,10,0,29,30,31,32,33,32,34,10,35,34,32,0,36,10,32,37,10,10,10,38,31}; //** выводы реле int arrrelay[6]={2,8,10,11,12,13}; //byte arrdorelay[8][6]={{1,1,1,0,1,0},{0,1,1,0,1,0},{0,0,1,0,1,0}, // {0,0,1,1,1,0},{0,0,0,0,1,0},{0,0,0,0,0,1}, // {0,0,0,0,0,0},{0,0,0,0,0,0}}; byte arrdorelay[8][6]={{0,0,0,1,0,1},{1,0,0,1,0,1},{1,1,0,1,0,1}, {1,1,0,0,0,1},{1,1,1,1,0,1},{1,1,1,1,1,0}, {1,1,1,1,1,1},{1,1,1,1,1,1}}; #include <MsTimer2.h> void flash() { if(sum>0) return; MsTimer2::stop(); blink0=(blink0+1)%8; if(blink0==0) blink1=(blink1+1)%sizeof(arrblink); for(int i=0;i<6;i++) { m.writeSprite(i*8-blink0,0,figure[arrblink[(blink1+i)%sizeof(arrblink)]]); } MsTimer2::set(tekinterval1[8]*10, flash); // period MsTimer2::start(); } unsigned long millisendprg=0; void setup() { Serial.begin(9600); pinMode(moneyPin2,INPUT); //attachInterrupt(0,count_pulse,FALLING); //attachInterrupt(1,count_pulse2,FALLING); m.init(); m.setIntensity(15); Serial.println("setup ok!!"); //***************************************** //for(int i=0;i<8;i++) // {EEPROM.write(i*2,highByte(tekinterval1[i])); // EEPROM.write(i*2+1,lowByte(tekinterval1[i]));} //***************************************** for(int i=0;i<9;i++) { tekinterval1[i]=(EEPROM.read(i*2)<<8)+EEPROM.read(i*2+1); Serial.println(tekinterval1[i]); } //** выводы реле 2,8,10,11,12,13 for(int i=0;i<6;i++) {pinMode(arrrelay[i],OUTPUT);delay(20);digitalWrite(arrrelay[i],HIGH);} Serial.println("spiok!!"); m.writeSprite(0, 0, figure[11]); m.writeSprite(8, 0, figure[0]); m.writeSprite(16,0, figure[0]); m.writeSprite(24, 0, figure[0]); m.writeSprite(32, 0, figure[0]); delay(2000); attachInterrupt(1,count_pulse2,FALLING); t_temp=get_temp(); if(t_temp<999) { //t_temp=t_temp; z1=abs(t_temp)/10; z2=byte(abs(t_temp)%10); //arrblink[22]=byte(z2); if(t_temp<0) arrblink[20]=39; else arrblink[20]=10; if(z1<1) {arrblink[21]=byte(z2);arrblink[22]=38;arrblink[23]=31;arrblink[24]=10;} else {arrblink[21]=byte(z1);arrblink[22]=byte(z2);arrblink[23]=38;arrblink[24]=31;} } } void loop() { if(prg==1) { key = keypad.getKey(); if(key) {doForKey(key);heating=0;} } else { // if(millis()-millisblink>tekinterval1[8]*10 && sum==0) { millisblink=millis(); blink0=(blink0+1)%8; if(blink0==0) blink1=(blink1+1)%sizeof(arrblink); for(int i=0;i<6;i++) { m.writeSprite(i*8-blink0,0,figure[arrblink[(blink1+i)%sizeof(arrblink)]]); } } // if(millis()-millistemp>600000 && sum==0) { MsTimer2::set(tekinterval1[8]*10, flash); // period MsTimer2::start(); t_temp=get_temp(); if(t_temp<999) { //t_temp=t_temp; z1=abs(t_temp)/10; z2=byte(abs(t_temp)%10); //arrblink[22]=byte(z2); if(t_temp<0) arrblink[20]=39; else arrblink[20]=10; if(z1<1) {arrblink[21]=byte(z2);arrblink[22]=38;arrblink[23]=31;arrblink[24]=10;} else {arrblink[21]=byte(z1);arrblink[22]=byte(z2);arrblink[23]=38;arrblink[24]=31;} String t1=" t="+String(t_temp); Serial.print("temp=");Serial.println(int(t_temp)); //Serial.println(z1);Serial.print(' ');Serial.print(z2);Serial.println(); //Serial.println(t1); for(int j=20;j<25;j++) {Serial.print(arrblink[j],DEC);Serial.print(' '); } //Serial.println(); millistemp=millis(); } else Serial.println("no temp"); MsTimer2::stop(); } // прошло максимальное время приема монеты? if(pulse2>0 && (millis()-timeCount2)>timeAllPulse2) { //Serial.println("moneta - ok"); //Serial.println(EEPROM.read(0)); //Serial.println(EEPROM.read(1)); //sum=sum+(EEPROM.read(0)<<8)+EEPROM.read(1); sum=sum+tekinterval1[0]; //Serial.print("sum=");Serial.println(sum); view_figure(sum,1); pulse2=0; } key = keypad.getKey(); if(key) {doForKey(key);heating=0;} if((millis()-millisinterval)>tekinterval1[tekprg]*100 && pause1==0 && tekprg>0 && tekprg<7 && sum>0) { millisinterval=millis(); sum=sum-10; //show_sum(sum); view_figure(sum,1); if(sum==0) {tekprg=0;send_led(8);send_relay(8);blink1=0;blink0=0; heating=0;millisendprg=millis(); } } // if(pause1==1) { if((millis()-millispause1)>tekinterval1[7]*100) {pause1=0; tekprg=5;//tekprg=tekprgpr; send_led(tekprg); send_relay(tekprg); //Serial.print("pause1=");Serial.println(pause1); //Serial.print("tekprg=");Serial.println(tekprg); } } //Serial.print("A0=");Serial.println(analogRead(A0)); } if(t_temp<TEMP1 && heating==0 && millis()-millispause1>10000 && millis()-millisendprg>20000) {heating=1;//Serial.println("ON"); digitalWrite(arrrelay[0],0);digitalWrite(arrrelay[4],0); } if(t_temp>TEMP2 && heating==1) {heating=0;//Serial.println("OFF"); digitalWrite(arrrelay[0],1);digitalWrite(arrrelay[4],1); } } // обработка нажатия кнопки void doForKey(char key) { //Serial.print("key="); Serial.println(key); switch(key) { case '1': if(prg<1 && sum>0) {tekprg=1;pause1=0;send_relay(1);view_figure(sum,1);} break; case '2': if(prg<1 && sum>0) {tekprg=2;pause1=0;send_relay(2);view_figure(sum,1);} break; case '3': if(prg<1 && sum>0) {tekprg=3;pause1=0;send_relay(3);view_figure(sum,1);} break; case '4': if(prg<1 && sum>0) {tekprg=4;pause1=0;send_relay(4);view_figure(sum,1);} break; case '5': if(prg<1 && sum>0) {tekprg=5;pause1=0;send_relay(5);view_figure(sum,1);} break; case '6': if(prg<1 && sum>0) {tekprg=6;pause1=0;send_relay(6);view_figure(sum,1);} break; case '7': if(prg<1 && sum>0 && tekprg>0) {tekprgpr=tekprg;pause1=1;millispause1=millis(); send_relay(7);tekprg=7;view_figure(sum,1); } break; case '*': prg=1-prg; if(prg==1) {show_prg(pos_options);send_relay(8); send_led(8);tekprg=0; } else { //show_sum(sum); sum=0; //view_figure(sum,1); blink1=0;blink0=0; pos_options=0;tekprg=0;} break; case '9': if(prg==1) // следующий параметр { pos_options=(pos_options+1)%9; Serial.print("pos_options="); Serial.println(pos_options); show_prg(pos_options); } break; case 'a': // +монета sum=sum+tekinterval1[0]; view_figure(sum,1); pulse2=0; break; case 'b': sum=10; // обнуление (было предыдущий параметр) /*if(prg==1) { pos_options=pos_options-1; if(pos_options<0) pos_options=8; show_prg(pos_options); }*/ break; case '0': if(prg==1) // уменьшение значения { if(stepinterval1[pos_options]*kstep<tekinterval1[pos_options]) tekinterval1[pos_options]=tekinterval1[pos_options]-stepinterval1[pos_options]*kstep; else tekinterval1[pos_options]=0; tekinterval1[pos_options]=max(tekinterval1[pos_options],mininterval1[pos_options]); show_prg(pos_options); } break; case '8': if(prg==1) // увеличение значения { tekinterval1[pos_options]=tekinterval1[pos_options]+stepinterval1[pos_options]*kstep; tekinterval1[pos_options]=min(tekinterval1[pos_options],maxinterval1[pos_options]); show_prg(pos_options); } break; case '#': if(prg==1) // коэффициент*10 { kstep=10/kstep; } break; case 'd': if(prg==1) // сохранить настройки {; for(int i=0;i<9;i++) {EEPROM.write(i*2,highByte(tekinterval1[i])); EEPROM.write(i*2+1,lowByte(tekinterval1[i]));} } break; case 'с': if(prg==1) // не сохранять настройки {; for(int i=0;i<9;i++) { tekinterval1[i]=(EEPROM.read(i*2)<<8)+EEPROM.read(i*2+1); Serial.println(tekinterval1[i]); } } break; default: break; } } // обработка прерывания монетоприемника - получить кол-во импульсов // void count_pulse2() { //detachInterrupt(0); detachInterrupt(1); pulse2++; if(pulse2==1) timeCount2=millis(); //attachInterrupt(0,count_pulse,FALLING); attachInterrupt(1,count_pulse2,FALLING); } // индикация отсчета void show_sum(int val) { float sum1; //lcd.setCursor(2,0);lcd.print("working "); //lcd.setCursor(2,1);lcd.print(" "); sum1=float(val)/10; //lcd.setCursor(2,1); //lcd.print(sum1); } // индикация настройки void show_prg(int val) { float interval1; //lcd.setCursor(2,0); //lcd.print(str_options[val]); //lcd.setCursor(2,1); //lcd.print(" "); //interval1=float(tekinterval1[val])/10; //lcd.setCursor(2,1); //lcd.print(interval1); view_figure(tekinterval1[val],2); } // запуск/останов реле void send_relay(int val) { //Serial.print("sendrelay=");Serial.println(val); for(int i=0;i<6;i++) digitalWrite(arrrelay[i],HIGH); if(val<5) {digitalWrite(arrrelay[4],LOW); delay(1000);} for(int i=0;i<6;i++) digitalWrite(arrrelay[i],arrdorelay[val-1][i]); } // запуск/останов реле+светодиодов void send_led(byte val) { //digitalWrite(spiRelay,LOW); //SPI.transfer(B00000001<<(tekprg-1)); //SPI.transfer(B00000001<<(val-1)); //SPI.transfer(B00000001<<(val-1)); //digitalWrite(spiRelay,HIGH); } // показать цифры void view_figure(unsigned int num,int mode) { int num1,num2,num3,num4,num5; num1=num/10000; num2=(num-num1*10000)/1000; num3=(num-num1*10000-num2*1000)/100; num4=(num-num1*10000-num2*1000-num3*100)/10; num5=num-num1*10000-num2*1000-num3*100-num4*10; //Serial.print("num1="); Serial.print(num1); //Serial.print(" num2="); Serial.print(num2); //Serial.print(" num3="); Serial.print(num3); //Serial.print(" num4="); Serial.print(num4); if(num5>0) { m.writeSprite(32, 0, figure[num5]); m.writeSprite(24, 0, figure[num4]); m.writeSprite(16,0, figure[num3]); m.writeSprite(8, 0, figure[num2]); m.writeSprite(32,0, comma); } else { m.writeSprite(32, 0, figure[num4]); m.writeSprite(24, 0, figure[num3]); m.writeSprite(16,0, figure[num2]); m.writeSprite(8, 0, figure[num1]); } if(mode>1) { m.writeSprite(0, 0, figure[pos_options+12]); } else m.writeSprite(0, 0, figure[tekprg+20]); } // получение тмпературы датчика int get_temp() { byte i; byte present = 0; byte data[12]; byte addr[8]; int Temp,SignBit; /*if ( !ds.search(addr)) { //Serial.print("No more addresses.\n"); ds.reset_search(); return 999; } Serial.print("R="); //R=28 Not sure what this is for( i = 0; i < 8; i++) { Serial.print(addr[i], HEX); Serial.print(" "); } if ( OneWire::crc8( addr, 7) != addr[7]) { Serial.print("CRC is not valid!\n"); return 0; } if ( addr[0] != 0x28) { Serial.print("Device is not a DS18S20 family device.\n"); return 0; }*/ ds.reset(); ds.select(my_addr); ds.write(0x44,1); // start conversion, with parasite power on at the end delay(1000); // maybe 750ms is enough, maybe not // we might do a ds.depower() here, but the reset will take care of it. present = ds.reset(); ds.select(my_addr); ds.write(0xBE); // Read Scratchpad for ( i = 0; i < 9; i++) { // we need 9 bytes data[i] = ds.read(); } Temp=(data[1]<<8)+data[0];//take the two bytes from the response relating to temperature // Проверяем - или нет Temp = Temp/16; return Temp; }Попробуйте привезать к своей мазайке, код чтение датчика один раз в минуту.
#include <OneWire.h> byte SD18B20_address[8]={0x22, 0x8F, 0x5B, 0x4B, 0xC5, 0x0, 0x0, 0x61}; OneWire SD18B20_pin_2(2); unsigned long SD18B20_millis = 0UL; float SD18B20_temperature = 0.00; void setup() { } void loop() { if(SD18B20_Timer(SD18B20_millis, 60000)) {SD18B20_millis = millis(); SD18B20_temperature = reading_SD18B20(SD18B20_address, 0);} } bool SD18B20_Timer(unsigned long startTime, unsigned long period ) {unsigned long currentTime; currentTime = millis(); if (currentTime>= startTime) {return (currentTime>=(startTime + period));} else {return (currentTime >=(4294967295-startTime+period));} } float convert_SD18B20_Data(byte type_s, byte data[12]) {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; else if (cfg == 0x20) raw = raw & ~3; else if (cfg == 0x40) raw = raw & ~1; } return (float)raw / 16.0; } float reading_SD18B20(byte addr[8], byte type_s) { byte data[12]; byte id; SD18B20_pin_2.reset(); SD18B20_pin_2.select(addr); SD18B20_pin_2.write(0xBE); for ( id = 0; id < 9; id++) { data[id] = SD18B20_pin_2.read();} SD18B20_pin_2.reset(); SD18B20_pin_2.select(addr); SD18B20_pin_2.write(0x44, 1); return convert_SD18B20_Data(type_s, data);}P.S. Смотрите как правильно сворачивать код, чтоб не приходилось пролистывать 1000 строк чтобы прочитать суть, http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii
По умолчанию там стояло опрос датчика 60 секунд. Это я поправил в скетче. И датчик там прописывал чтобы определения не было.
Подскажите за что отвечает delay(1000) в строке 885, снижаю с 1000 до 500 тормоза становятся меньше?
Ето пауза между запросом преобразования температуры и получением данных. Для 12 битного преобразования составляет 750 мс больше не нужно меньше надо смотреть с какой точность датчик настроен. Для меньшей точности можно снижать. Я в первом посте писал. Только строка 800.
Я удалил эту строчку тормозо пропали. Значение в этой строчке пропорциональны зависанию Температуру вроде бы показывает. Как это влияет на точность?
Я удалил эту строчку тормозо пропали. Значение в этой строчке пропорциональны зависанию Температуру вроде бы показывает. Как это влияет на точность?
Показывает последнее значение оставшееся в памяти датчика. Продолжит ли датчик преобразование после подачи команды на считывание, даташит молчит, но скорее всего нет. Вот здесь почистили этот кусок кода и убрали delay().
После вашей команды " начать преобразование" датчик начинает " вычислять " температуру.
Ченез некоторое время, а оно зависит от разрядности преобразования, данные готовы и можно спросить датчик: " дай температуру".
Вот это "некоторое" время находится в полной вашей власти.
Можете ждать в delay хоть полчаса , можете использовать millis, да хоть через час. И так много раз.
Только отдаваемые данные будут равны тому значению которое получилось при последнем " начать преобразование"
А вот спрашивать датчик когда он занят преобразованием - я не думаю что он вам правильно ответит, если вооюще что-то ответит.....
Поэтому ждите любым способом
Я не сильно силён в программировании но удалил эту строчку и всё работает, температуру могу считывать хоть каждую секунду, не виснет. Просто не пойму зачем эта строчка нужна если всё и так прекрасно работает.
Вам же написали, что вы читаете неизвестно когда измеренную температуру. Пауза нужна для проведения преобразования и записи результата в регистры. Посмотрите тот код, который я вам дал ссылку (команды все ваши). Он состоит из двух частей - команды на конвертацию и считывание+пересчет. Дали команду конвертировать, подождали 750мС и провели считывание.
Я вас понял, просто если удалить delay из выше приведённого вами скетча температуру тоже прекрасно определяет, очень быстро прикладываешь руку повышается убираешь опускается. Вот я и спрашиваю, зачем delay.
Так что, то что все работает это анамалия :-) получатся не нужно время для обработки?
Так что, то что все работает это анамалия :-) получатся не нужно время для обработки?
Если считаете себя умнее, чем производитель данной мекосхемы, не буду переубеждать.
Я не считаю просто уже как сутки работает как часы.
Я не считаю просто уже как сутки работает как часы.
выкиньте показания в порт типа флоут, и мы посмотрим как будет прыгать температура, скорей всего вы уменьшили дискретизацию.
Ничего там не уменьшалось, просто читаются данные с предыдущей конвертации. Судя по тому, что данные читаются и температура изменяется, датчик либо не успевает затереть регистры, либо вообще их не затирает. Возможно, что регистры заполняются побитово по мере конвертации. И чтение происходит до изменений в регистрах или часть битов берется от предыдущей конвертации, а часть уже от текущей, а возможно переписываюся по завершению конвертации.
Так же может быть так, что при чтении регистров датчик приостанавливает или откладывает конвертацию, но скорее всего просто конвертирует независимо от того, что регистры в этот момент читаются, а вот в случае с паразитным питанием, скорее всего конвертация прерывается, а возможно и отлкладывается. При нормальном питании чтение регистров, как мне кажется, если конвертация продолается в момент чтения, может вносить цифровой шум и повлиять на точность измерений.
Конвертация не прервется, датчик просто не отдаст данные в процессе конвертации, он выставит на шине состояние "занят". При паразитном питании, может упасть точность. Возможно библиотека отрабатывает состояние датчика и дожидается его освобождения и уже тогда запрашивает данные.
Понятно. Спасибо, значит страдает точность. Скажите можно сделать, что бы на жатие на кнопку было в приоритете перед проверкой температуры. Чтобы задержки не было?
Вы не поняли. Точность страдает при ДВУХ-проводном подключении, а у вас трех-проводное. Но задержка все равно может быть, я не вникал в ваш код. А приоритет кнопки - очень просто, после подачи команды на конвертацию опрашивайте кнопки в цикле, а данные термометра читайте только если кнопки не нажаты.