• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Błędny odczyt temperatury
#1
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();

}
 
Odpowiedź
#2
(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.
 
Odpowiedź
#3
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ć ?
 
Odpowiedź
#4
Można przerobić tak program do odczytu aby dodawał 0x albo samemu. To np. Twój
0x28, 0xFF, 0x1D, 0x7F, 0x50, 0x15, 0x01, 0xDC
 
Odpowiedź
#5
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
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości