Go Down

Topic: Problemer med LCD og OneWire DS18**** (Read 2246 times) previous topic - next topic

k3nt_

Hei,

Har problemer med oppdatering av temperaturer på LCD 16,2.

Den oppdaterer korrekte verdier ofte, men returnerer noen ganger bare et utvalg tegn (Se bilder)
Jeg skjønner ikke hvorfor. Noen som kan hjelpe?


Code: [Select]


#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal.h>


#define ONE_WIRE_BUS 8

// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(ONE_WIRE_BUS);

//LCD
LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2);

int backLight = 13;   
int test = 27;

DallasTemperature sensors(&oneWire);

//Tildel Adresser og navn til sensorene.
DeviceAddress Probe1 = {0x28, 0x56, 0x2C, 0x94, 0x04, 0x00, 0x00, 0x2A};
DeviceAddress Probe2 = {0x28, 0x9E, 0x69, 0x93, 0x04, 0x00, 0x00, 0xA9};
DeviceAddress Probe3 = {0x28, 0x5D, 0x6A, 0x94, 0x04, 0x00, 0x00, 0xA7};
DeviceAddress Probe4 = {0x28, 0x4F, 0x36, 0x94, 0x04, 0x00, 0x00, 0x26};


void setup(void)
{
  pinMode(backLight, OUTPUT);
  digitalWrite(backLight, HIGH); // turn backlight on. Replace 'HIGH' with 'LOW' to turn it off.
   
 

  // Start up the library
  sensors.begin();
//set the resolution to 10 bit
  sensors.setResolution(Probe1, 10);
  sensors.setResolution(Probe2, 10);
  sensors.setResolution(Probe3, 10);
  sensors.setResolution(Probe4, 10);
}

void printTemperature(DeviceAddress deviceAddress)
{
float tempC = sensors.getTempC(deviceAddress);
  if (tempC == -127.00) {
    Serial.print("xxx");
  } else {
    lcd.print(tempC);
   
  }}


void loop(void)
{
  delay(4000);
  sensors.requestTemperatures();
   
  lcd.begin(2,16);              // columns, rows.  use 16,2 for a 16x2 LCD, etc.
  lcd.clear();                  // start with a blank screen
  lcd.setCursor(0,0);         
  printTemperature(Probe1);
  lcd.setCursor(11,0);         
  printTemperature(Probe2);
  lcd.setCursor(0,1);           
  printTemperature(Probe3);
  lcd.setCursor(11,1);         
  printTemperature(Probe4);
}





Msquare

Jeg kender desværre ikke den sensor/library combination. Dit program er indlysende korrekt - med mindre der er noget med en clash af interrupts/pins/timing mellem OneWire og LCD'en - men jeg tror det ikke.

Men jeg har nogle tanker angående Seriel kommunikation (som OneWire jo er)
1: Den er ikke fejlfri. Har man vigtige data, må man udvide den rå dataprotocol med noget der laver checksums og retransmits. Da du ikke kan ændre protokollen må du bare lave en ny måling hvis en modtagelse er garbage (dette gælder også hvis en ellers god datapacket er en "urimlig" målepunkt  dvs den er kun "lidt" korrumperet)
2: Støj på linjen, timing. En enkel ledning kan samle støj (falske signal værdier) og hvis man ikke kan modtage hurtigt nok, mister man en bit (interrupts af andre ting kan forstyrre). Stram op ledningsføringen, læs spec'en om du er laaangt udenfor, mål signaler med et scope. Husk at bruge TwistedPair (du har jo en jord retur ledning, så der er 2 ledninger i "OneWire")



k3nt_

Takk for svar.

Jeg tror jeg har funnet årsaken til problemet.
Av en eller annen grunn klarer ikke skjermen å oppdatere seg uten statisk tekst.

Så ved å gjøre følgende ble prboblemet borte. For meg er dette en bug, men jeg vet ikke i hvilket library det evt er feil i.

Code: [Select]
  sensors.requestTemperatures();
   
  lcd.begin(2,16);              // columns, rows.  use 16,2 for a 16x2 LCD, etc.
  lcd.clear();                  // start with a blank screen

  lcd.setCursor(0,0); 
  lcd.print("C"); 
  printTemperature(Probe1);

  lcd.setCursor(9,0);           
  lcd.print("C");
  printTemperature(Probe2);
 
  lcd.setCursor(0,1);   
  lcd.print("C");   
  printTemperature(Probe3);
 
  lcd.setCursor(9,1); 
  lcd.print("C");   
  printTemperature(Probe4);
 
  delay(1000);

Go Up