Pages: [1]   Go Down
Author Topic: Problemer med LCD og OneWire DS18****  (Read 2159 times)
0 Members and 1 Guest are viewing this topic.
Scandinavia
Offline Offline
Newbie
*
Karma: 0
Posts: 2
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:

#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);
}





* bilde2.JPG (723.91 KB, 1632x1224 - viewed 44 times.)

* bilde.JPG (707.97 KB, 1632x1224 - viewed 44 times.)
Logged

Copenhagen, Denmark
Offline Offline
Edison Member
*
Karma: 33
Posts: 1225
Have you testrun your INO file today?
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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")


Logged

Scandinavia
Offline Offline
Newbie
*
Karma: 0
Posts: 2
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
  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);
Logged

Pages: [1]   Go Up
Jump to: