Arduino Polska Forum

Pełna wersja: Błędny odczyt temperatury
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Cześć, Wie ktoś może dlaczego pokazuje mi błędne odczyty z termometrów na poziomie -127 jeżeli w setupie zainicjalizuje wyświetlacz LCD? jak odznaczę wszystkie funkcje z wyświetlacza w setupie wtedy wartości z termometrów są prawidłowe próbowałem odznaczać funkcje po kolei lecz dopiero przy odznaczonych wszystkich funkcjach termometr działa. Poniżej kod.
Kod:
#include <DallasTemperature.h>
#include <OneWire.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>


OneWire oneWire(2);
DallasTemperature sensors(&oneWire);

#if defined(ARDUINO) && ARDUINO >= 100
#define printByte(args)  write(args);
#else
#define printByte(args)  print(args,BYTE);
#endif

LiquidCrystal_I2C lcd(0x27, 16, 2);
byte tmp[8] = {
  0b00000,
  0b00100,
  0b00100,
  0b00100,
  0b01110,
  0b01010,
  0b01110,
  0b00000
};
byte stC[8] = {
  0b00000,
  0b01000,
  0b00011,
  0b00100,
  0b00100,
  0b00100,
  0b00011,
  0b00000
};

void setup() {
  sensors.begin();
  Serial.begin(9600);
  lcd.init();
  lcd.backlight();
  sensors.begin();
  lcd.createChar(0, tmp);
  lcd.createChar(1, stC);
 
}

void tmps() {
  sensors.requestTemperatures();
  float tempC1 = sensors.getTempCByIndex(0);
  float tempC2 = sensors.getTempCByIndex(1);
  Serial.print("In: ");
  Serial.print(tempC1);
  Serial.print(" st.C ");
  Serial.print(" Out: ");
  Serial.print(tempC2);
  Serial.println(" st.C");
  //lcd.setCursor(1, 0);
  // lcd.printByte(0);
  //lcd.print(tempC1);
  //lcd.printByte(1);

}
void loop() {
  tmps();

}
(16-03-2022, 18:54)mateuszmilke97@gmail.com napisał(a): [ -> ]Cześć, Wie ktoś może dlaczego pokazuje mi błędne odczyty z termometrów na poziomie -127 jeżeli w setupie zainicjalizuje wyświetlacz LCD? jak odznaczę wszystkie funkcje z wyświetlacza w setupie wtedy wartości z termometrów są prawidłowe próbowałem odznaczać funkcje po kolei lecz dopiero przy odznaczonych wszystkich funkcjach termometr działa. Poniżej kod.
Kod:
#include <DallasTemperature.h>
#include <OneWire.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>


OneWire oneWire(2);
DallasTemperature sensors(&oneWire);

#if defined(ARDUINO) && ARDUINO >= 100
#define printByte(args)  write(args);
#else
#define printByte(args)  print(args,BYTE);
#endif

LiquidCrystal_I2C lcd(0x27, 16, 2);
byte tmp[8] = {
  0b00000,
  0b00100,
  0b00100,
  0b00100,
  0b01110,
  0b01010,
  0b01110,
  0b00000
};
byte stC[8] = {
  0b00000,
  0b01000,
  0b00011,
  0b00100,
  0b00100,
  0b00100,
  0b00011,
  0b00000
};

void setup() {
  sensors.begin();
  Serial.begin(9600);
  lcd.init();
  lcd.backlight();
  sensors.begin();
  lcd.createChar(0, tmp);
  lcd.createChar(1, stC);
 
}

void tmps() {
  sensors.requestTemperatures();
  float tempC1 = sensors.getTempCByIndex(0);
  float tempC2 = sensors.getTempCByIndex(1);
  Serial.print("In: ");
  Serial.print(tempC1);
  Serial.print(" st.C ");
  Serial.print(" Out: ");
  Serial.print(tempC2);
  Serial.println(" st.C");
  //lcd.setCursor(1, 0);
  // lcd.printByte(0);
  //lcd.print(tempC1);
  //lcd.printByte(1);

}
void loop() {
  tmps();

}
Kod:
#include <LiquidCrystal_I2C.h>
byte znak0[8] = { 0b01100, 0b10010, 0b10010, 0b01100, 0b00000, 0b00000, 0b00000, 0b00000 };
byte znak1[8] = { 0b11111, 0b10000, 0b10000, 0b11111, 0b10000, 0b10000, 0b11111, 0b00010 };
#include <Wire.h>
#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS D7 // Pin OneWire
#define TEMPERATURE_PRECISION 9

int przekaznik1 = D9;
int przekaznik2 = D10;
int buzer = D2;
bool sp1 = true;                    //zmienna boolowska sp1 do steowania stanem przekaznika1
bool sp2 = true;
unsigned long czas;
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);


DeviceAddress DS_NR1 = { 0x28, 0x32, 0xFD, 0x48, 0xF6, 0xA8, 0x3C, 0xF2 }; // Tu wpisać adresy czujników
DeviceAddress DS_NR3 = { 0x28, 0x6F, 0x82, 0x95, 0xF0, 0x01, 0x3C, 0x85 };

LiquidCrystal_I2C lcd(0x27,16,2); 

float temp1C = 0;
float temp2C = 0;
//float temp3C = 0;
void setup()
{

//  lcd.backlight();    //załącza podświetlenie
  lcd.noBacklight();  //wyłącza podświetlenie
   
    sensors.begin();
  lcd.init();                      // initialize the lcd

  lcd.backlight();

  lcd.clear();


//unsigned long czas;
czas = millis();

pinMode(przekaznik1, OUTPUT);      //przekaznik1 jako wyjście
pinMode(przekaznik2, OUTPUT);   
pinMode(buzer, OUTPUT);

digitalWrite(przekaznik1, HIGH);    //stan początkowy przekaznika1 wysoki
digitalWrite(przekaznik2, HIGH);
digitalWrite(buzer, LOW);



  sensors.setResolution(DS_NR1, TEMPERATURE_PRECISION);
  sensors.setResolution(DS_NR3, TEMPERATURE_PRECISION);
}


void loop()
{

 
  sensors.requestTemperatures();
  temp1C = sensors.getTempC(DS_NR1);  // pobierz temperaturę po kolei z 3 termometrów
  temp2C = sensors.getTempC(DS_NR3);
//  temp3C = sensors.getTempC(DS_NR2);


if(temp2C>=35)
{
  digitalWrite(przekaznik1, LOW);
  digitalWrite(przekaznik2, HIGH);
}
//  else {
//  digitalWrite(przekaznik1, HIGH);
//  digitalWrite(przekaznik2, LOW);
// }

if(temp2C<=30)
{
  digitalWrite(przekaznik1, HIGH);
  digitalWrite(przekaznik2, LOW);
}


if((temp2C>80) || (temp1C>85))
{
    digitalWrite(buzer, HIGH);
      lcd.backlight();    //załącza podświetlenie
// lcd.noBacklight();  //wyłącza podświetlenie
}
else
{
  digitalWrite(buzer, LOW);
}


lcd.createChar(0, znak0);
lcd.createChar(1, znak1);
    lcd.setCursor(0,0);
lcd.print("PIEC GAZ: ");
lcd.setCursor(10,0);
    lcd.print(temp1C,1);

lcd.print((char)0);
lcd.print("C");

    lcd.setCursor(0,1);
lcd.print("PIEC W");
lcd.print((char)1);
lcd.print("G: ");
lcd.setCursor(10,1);
    lcd.print(temp2C,1);
//  lcd.print(" ");
lcd.print((char)0);
lcd.print("C");
delay (3000);


}

Wywal co ci nie potrzebne. Dwa czujniki działają stabilnie. Były trzy ale jeden okazał się zbyteczny.
A skąd masz taki adres? 0x28, 0x32, 0xFD, 0x48, 0xF6, 0xA8, 0x3C, 0xF2 ??
mi w testerze wyświetla tylko taki 28FF1D7F501501DC jaki rodzaj adresu tego Twojego to jest może idzie jakoś go przekonwertować ?
Można przerobić tak program do odczytu aby dodawał 0x albo samemu. To np. Twój
0x28, 0xFF, 0x1D, 0x7F, 0x50, 0x15, 0x01, 0xDC
Dobra temat sam rozwiązałem przypomniało mi się że kiedyś moje oryginalne leonardo już parę lat przeżyło i nie zawsze wszystkie funkcje działają jak powinny na różnych pinach wystarczyło linie danych z termometrów przełożyć na inny pin i działa jak należy. Musze powoli nastawiać się na kupno kolejnego ardu. Ale dzięki za pomoc, dzęki Tobie nauczyłem się konwertować adresy i ustawiać rozdzielczość temeratury w poszczególnych czujnikac. Dzięki Smile