Hi,

Ik ben weer begonnen met het stoeien of worstelen betreffende de Auduino.
Daar is een goede rede voor, ik wil in een van mijn spannings referenties uitlezing en logging hebben betreffende de atmosphere toestand.

Hoe goed ik ook kan worstelen met analoge electronica, dit is lastig voor mij door gebrek aan kennis (daar kan ik wat aan doen, vandaar deze vraag) en mijn dyslexie waar veel moeilijker iets aan te doen is.

Goed wat wil ik uiteindelijk bereiken
In een afgesloten metalen behuizing komt een vochtigheids sensor die ook een temperatuur sensor heeft.
Het zelfde geld voor een druk sensor die ook een temp sensor heeft.
Een van de temp sensoren is maar nodig.
Ik wil dus kunen zien of de druk, de vochtigheidsgraad en de temperatuur in de dichte metalen behuizing die ook een oven is stabiel blijft.

Verder zijn er dan ook nog twee van deze sensoren (vocht/luchtdruk) die de toestand buiten deze oven aangeven.
Verder moet het geheel ook gaan loggen, met zeg 1 meting per minuut naar een geheugenkaart en/of naar mijn fileserver als dit moelijk is.

Wat hierboven staat wil ik dus naar toe werken en alle hulp is meegenomen :-)

Maar voor wat meer inzich loop ik nu vast met een simpele DALLAS 18D20 temp sensor.
Het is me gelukt na een zoekactie de code die heironder staat zo aan te passen dat hij van de basis resolutie van 9 bit nu op 12bit staat.
Hij loopt nu mooi met 0,1C op of omlaag.
Het lukt mij echter niet om op mijn Nokia 5110 display meer dan 1 digit achter de comma te krijgen.

Dus wat moet ik hoe in de code aanpassen om een hogere resolutie op het display weer tegeven.

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

#define ONE_WIRE_BUS 7
#define SENSOR_RESOLUTION 12

LCD5110 lcd(8,9,10,12,11);

extern unsigned char SmallFont[];
extern unsigned char BigNumbers[];
extern uint8_t temperatureIcon[];

char temperatureF[6];

OneWire oneWire(ONE_WIRE_BUS);

DallasTemperature sensors(&oneWire);

float tempC = 0;
float tempF = 0;

void setup(void)
{
  lcd.InitLCD();
  lcd.setFont(BigNumbers);
  sensors.begin();
}

void loop(void)
{ 

  lcd.clrScr();
  //lcd.drawBitmap(0, 0, temperatureIcon, 84, 48);
  
  sensors.requestTemperatures();
  
  tempC = sensors.getTempCByIndex(0);
  tempF = sensors.toFahrenheit(tempC);
  
  convertToString(tempF);
  
  convertToString(tempC);  //Uncomment this for degrees Celsius
 
  lcd.print(temperatureF,5,5);
  
  lcd.update();  
  delay(300);
}

void convertToString(float number)
{
   dtostrf(number, 4, 1, temperatureF);
}


Oja, ik heb geen idee welke code ik moet kiezen om dit op CO te plaatsen.
Bovenstaande stukje code, Nokia display en de DALLAs sensor gebruik ik om een beetje vertrouwd te raken met de materie :-)

Dank en gegroet,
Blackdog

hangt een beetje van de library af

voor een nokia 5110 scherm gebruik ik


#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>

// Software SPI (slower updates, more flexible pin options):
// pin 7 - Serial clock out (SCLK)
// pin 6 - Serial data out (DIN)
// pin 5 - Data/Command select (D/C)
// pin 3 - LCD reset (RST)
// pin 4 - LCD chip select (CS SCE)
Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3);

.....
  display.begin();
  display.setContrast(20);

...
  display.setCursor(0,0);
  display.setTextColor(WHITE, BLACK); // 'inverted' text
  display.println(3.141592);
  display.display();
....

en dan werken komma getallen wel.
eventueel in uw begin eens
float tempC = 0;
float tempF = 0;
aanpassen naar
float tempC = 0.0;
float tempF = 0.0;

heb er vaak problemen mee dat C die getallen weer cast naar int's als er nergens een comma in de bewerkingen staat.

Hi fcapri,

Dank je voor het antwoord, maar het display werkt wel en geeft tot op 0,1C de temperatuur aan.

Ik heb je voorstel in mijn code geplakt maar dat geeft niet het gewensde effect.

Gegroet,
Blackdog

je moet dan vooral eerst gaan bepalen of het scherm de oorzaak is, of de berekening.

kan je een ander kommagetal met meerdere cijfers na de komma weergeven op het display?
welke waardes krijg je te zien als je een Serial.println(temperatureF); doet naar de pc?
heb me soms ook al rot gezocht waarom ik op het scherm altijd een 0 achter de komma kreeg en geen waarde.
zat dan een bugje in het programma (float * 1 geeft een int als resultaat, float * 1.0 geeft een float als resultaat).
ik was dan ook altijd aan het casten naar float en kreeg altijd een 0 achter de komma daardoor.

misschien ondersteund de LCD library niet meer dan 1 cijfer erna?
je kan eventueel de boel opsplitsen door een
int getal = temperatureF/1;
LCD.print (getal);
LCD.print(".");
int getal = (temperatureF%1)*100;
LCD.print (getal);

[Bericht gewijzigd door fcapri op (17%)]

Van de Atmel site:
--------------------------
Function dtostrf()

char * dtostrf(
	double __val,
	signed char __width,
	unsigned char __prec,
	char * __s)

The dtostrf() function converts the double value passed in val into an ASCII representationthat will be stored under s. The caller is responsible for providing sufficient storage in s.

Conversion is done in the format "[-]d.ddd". The minimum field width of the output string (including the possible '.' and the possible sign for negative values) is given in width, and prec determines the number of digits after the decimal sign. width is signed value, negative for left adjustment.

The dtostrf() function returns the pointer to the converted string s.
--------------------------
In je volgende stukje code moet je dus de "1" vervangen door je gewenste aantal decimalen.

void convertToString(float number)
{
   dtostrf(number, 4, 1, temperatureF);
}

verander (laatste lijn)

 
dtostrf(number, 4, 1, temperatureF);

in

 
dtostrf(number, 5, 2, temperatureF);

Edit: Tommyboy was sneller :-)

Edit2: met een '4' kun je maximaal 99.9 of -9.9 weergeven;
met een '5' wordt dit 999.9 of -99.9

[Bericht gewijzigd door Pertinax op (22%)]

Tommy Boy, Pertinax

Geweldig, nu twee digits achter de comma! (dtostrf(number, 5, 2, temperatureF);)
Nu gaan lezen en het gaan begrijpen ;-)

Gegroet,
Bram

Als met de 'rinkydinky' library werkt, dan kun je zonder omzetten de float meteen op de LCD weergeven, zie de (mooie) doc bij de lib.

http://www.rinkydinkelectronics.com/library.php?id=48

ik vind het raar dat ik bij al mijn programmas een stuk functie moet schrijven om van 2decimalen naar 1 decimaal moet gaan omdat mijn display te klein is

klikbaar
http://fcapri.homelinux.com/off/pics/eo/arduinodash/640/DSCN9481.JPG

Hi fcapri,

Ik ben al blij dat ik de tekst in een ander font type kon zetten en de temperatuur links boven in de hoek kon zetten.
Ik ben echt een beginner, en begrijp een groot deel van de code dat ik plaatste niet eens.

Het volgende wat ik ga doen is uitzoeken hoe ik de waarde van de sensor kan samenvoegen met een stukje tekst zoals dit: T1 = 23,56C.
De stap erna moet dan 4 of 5 sensoren worden die op de Nokia moeten worden weergegeven.

We zullen zien hoe ver ik kom :-)

Gegroet,
Blackdog

Oja, ik heb geen idee welke code ik moet kiezen om dit op CO te plaatsen.

Gebruik de tag [code=c] om de juiste highlighting te krijgen. Je .ino files op de Arduino zijn in feite C(++) code.

Hi!

Ik ben vandaag weer een stukje verder gekomen met de Arduino en het Nokia display.
Ik heb flink gewordsteld om tekst op de plek te krijgen waar ik het wil op het display.
Je kan zoeken wat je wilt vetreffende het 5110 display van Nokia,
maar het meeste wat je vind gaat bijna allemaal over grafische functies, draaiende teksten, pacman natuurlijk enz.
Tekts op een bepaalde positie zetten, dat hoef je niet uit te leggen, ben je gek, weet toch iedereen!

Voorbeeldje wat ik tegen kwam en waarom ik wat betreft coders regelmatig mijn haren uit mijn hoofd trek.
Zie plaatje hieronder...
http://www.bramcam.nl/Arduino/Fouten-Uitleg-01.png

Door flarden die ik tegen kwam op het web, kwam ik er achter dat tekst en cijfers niet op de zelfde manier naar het display geschreven kunnen worden.
Bij de door mij gebruikte Library is wordt het schijven van simpel letters hiermee gedaan: myLCD.print(de tekst en de positie)
Ook kwam ik er achter dat cijfers op twee manieren worden behandeld Integers en Floating Point.
Mooi, heb ik vrede mee, daar zal natuurlijk een goede rede voor zijn, die ik dus langzaam aan het ontdekken ben :-)

Maar als je kijkt naar het plaatje, zijn daar zijn twee groene circels wat betreft de Integer weergave en de Floating Point weergave op het Nokia scherm.
En kijk nu naar de tekst in de rode circels, de dumbo's!!!!
Gewoon copy/paste doen van het gewone print commando en je werk zelf niet controleren of anderen het laten controleren voor je.
Dit is uit de documentatie die bij de Nokia Library hoort en jullie kunnen wel begrijpen dat ik hier niet blij mee was.
Geef mijzelf de schuld dat ik niet zit op te letten, enz, enz :-)

Dit is de code die ik voor onderstaande display weergave heb gebruikt.

// LCD5110_Scrolling_Text 
// Copyright (C)2015 Rinky-Dink Electronics, Henning Karlsen. All right reserved
// web: http://www.RinkyDinkElectronics.com/
//
// This program is a demo of how to use print().
//
// This program requires a Nokia 5110 LCD module.
//
// It is assumed that the LCD module is connected to
// the following pins using a levelshifter to get the
// correct voltage to the module.
//      SCK  - Pin 8
//      MOSI - Pin 9
//      DC   - Pin 10
//      RST  - Pin 11
//      CS   - Pin 12
//
#include <LCD5110_Graph.h>

LCD5110 myGLCD(8,9,10,11,12);

extern uint8_t SmallFont[];

//int y;

void setup()
{
  myGLCD.InitLCD();
  myGLCD.setFont(SmallFont);
  myGLCD.setContrast(62);
 // randomSeed(analogRead(0));
}

void loop()
{
 
    myGLCD.print("T1=       Cel.",0,0);
    myGLCD.printNumF(31.45, 2, 25, 0);

    myGLCD.print("T2 =      Cel",0 ,10);
    myGLCD.printNumF(42.33, 2, 30, 10);

    myGLCD.print("T3 =      C",0 ,20);
    myGLCD.printNumF(28.39, 2, 30, 20);

    myGLCD.print("T4 =       C",0 ,30);
    myGLCD.printNumF(50.11, 2, 30, 30);

    myGLCD.print("Accu =    V",0 ,40);
    myGLCD.printNumF(12.11, 2, 30, 40);
    
    //myGLCD.print("NoiseAmp Demo",CENTER,5);
    
    myGLCD.update();
    delay(50);
 
}

Wat heb ik tot nog toe bereikt.
http://www.bramcam.nl/Arduino/5110-5-Regels-Weergave.png

Van de orginele code voor het weergeven van de temperatuur is bijna niets over.
Het eerste stukje voor het initialiseren van het display is nog orgineel.

Ik heb uitgezocht hoe ik een ander fonttype kon kiezen, is gelukt.
De volgende stap was het uitzoeken van het display contrast, ik heb nu nog het aparte commando gebruikt, ook gelukt.
Toen kwam het positioneren van 5 regels tekst, de waarde e.d. is verder onzin het gaat om de positie dat dit goed staat.
Op het plaatje kunnen jullie 4 regels zien met zogenaamde temperatuur weergave.
T1 t/m T4 zijn anders van regel opbouw, dit is met opzet, omdat ik even wil laten bezinken welke weergave mij het beste bevalt.

Dit display geeft wel een beetje aan waar ik naartoe wil voor een bepaald projekt.
Mijn volgende stap is de code die ik heb voor het uitlezen van 4x een 18D20 Temp sensor als variabele in mij stukje code voor iedere regel te plakken.
Dus deze keer geen klein stapje maar een grote stap voor mij :-)

Verder dan nog dit, heeft een van jullie al een code gescheven voor een Arduino betreffende deze sensor: TSYS01
Hiermee zou ik mijn oven temperatuur heel nauwkeurig(24bit) mee kunen uitlezen, zonder precisie electronica.
Datasheet hieronder
www.bramcam.nl/Arduino/TSYS01_Digital_Temperature_Sensor.pdf

Application Note
www.bramcam.nl/Arduino/TSYS01_Application_Note.pdf

En zoals altijd, input wordt op prijs gesteld!

Gegroet,
Bram

er zijn verschillende mogelijke libraries om een display aan te sturen hé. sommige hebben meer logische functies om text printen, andere zijn dan beter om grafisch te werken.

ik ben altijd heel tevreden geweest over de adafruit drivers van de 8544 chip (hetgeen in het nokia scherm zit).
ik heb er maar 1 dag ofzo mee geprogrammeerd en heb alles kunnen doen wat ik wou.
ben uiteindelijk naar een oled scherm over gestapt
http://fcapri.homelinux.com/off/pics/eo/arduinodash/640/P_20150318_142310.jpg

ik heb destijds ook eens een bepaalde library gekozen en er was één ding dat er niet mee kon. heb ik besloten toch een andere library te nemen en alle mijn code mogen aanpassen.
ik ben nog geen specialist in het aanpassen/schrijven van library's, maar is iets dat ik wel nog wil kunnen.

PS: je spreekt over groene cirkels, die zie ik niet.
en het plaatje bij "wat in nu heb bereikt" is dezelfde foto als de eerste???

Verder dan nog dit, heeft een van jullie al een code gescheven voor een Arduino betreffende deze sensor: TSYS01

https://github.com/Oceanlabgit/TSYS01

Niet mijn code, en ik heb geen TSY01, maar het compileerd wel

Morge,

fcapri, je hebt een bug gevonden in mijn code *grin*, je gaat weer door voor de ijskast!
Ververs de pagina en het goede plaatje laad nu wel.

Ik had geen commentaar op de library maar op de documentatie.
Er staan in het plaatje vier circels, twee kleine enigzins groen en twee rode.
In de groene cirkel staat het commando goed omschreven en in de rode cirkel hoe het te gebruiken niet!

Ben nog verder gegaan met het uitlezen van meerdere 18D20 sensoren.
De adressen heb ik genoteerd ik krijg aleen nog niet voor elkaar om de uitkomst in mijn display te plaatsen.
Eerst even verder lezen/leren hoe de waarde uit de sensor in een variabele te plaatsten en de dan in de
volgende regl te krijgen: myGLCD.printNumF(28.39, 2, 30, 20); op 28.39 moet dus de temperatuur komen van een van mijn sensoren.

We worstelen verder :-)

Gegroet,
Bram

je kan eigenlijk verschillende manieren uit. ik weet natuurlijk niet wat je sensor terug geeft.

je kan die eenvoudig in een variabele gooien (float waarschijnlijk) en daar eventueel een bewerking op doen om het terug te geven. met 2 of 3 prints zoals je nu doet.


    myGLCD.print("Accu =",0 ,40);
    myGLCD.printNumF(accu_waarde, 2, 30, 40);
    myGLCD.print("V", 60 ,40);

wil je heel makkelijk werken, kan je gewoon alles in strings gooien, je maakt dan bv een kleine functie aan die 1 grote string maakt van je gegevens.


   myGLCD.print(createOutput("T1",t1_waarde,"°C") ,0 ,00);
   myGLCD.print(createOutput("T2",t2_waarde,"°C") ,0 ,10);
...
   myGLCD.print(createOutput("Accu",accu_waarde,"Volt") ,0 ,40);

String createOutput(String naam ,float waarde, String eenheid)
{
   String weergeven;      //complete string voor weer te geven
   String meting;         //string van de meetwaarde
   dtostrf(waarde, 4, 1, meting);
   weergeven = naam + "=" + meting + " " + eenheid;   //1 grote string maken met de benaming, de waarde en de eenheid op 1 regel
   return weergeven;
}

dit is een makkelijke manier omdat je display gebeuren enkel met strings hoeft te werken, nadeel is dan wel dat je telkens de gehele lijn van het scherm moet gaan aanpassen.

bij TFT schermen maak ik vaak de layout in het begin ergens op. en ga naderhand enkel het getal op de juiste plaats invullen.
in de setup zeg ik dan bv dat dit geschreven moet worden


T1   =     °C
T2   =     °C
T3   =     °C
T4   =     °C
accu =     V

en dan zeg ik bij het wegschrijven naar het display dat
t1_waarde moet geschreven worden op pixels (40,0) (40 naar rechts, 8 omlaag)
en t2_waarde komt dan op pixels (40,10). t3_waarde op (40,20). t3_waarde op (40,30), accu_waarde op (40,40).

je kan ook gaan hardcoden door te zeggen:

string regel1 = "T1   = " + convert2String(t1_waarde) + "°C";
string regel2 = "T2   = " + convert2String(t2_waarde) + "°C";
string regel3 = "T3   = " + convert2String(t3_waarde) + "°C";
string regel4 = "T4   = " + convert2String(t4_waarde) + "°C";
string regel5 = "accu = " + convert2String(accu_waarde) + "V";

nadeel is dan wel dat je alle regels moet aanpassen bij een wijziging (bv, je wil een : ipv die =. dan moet je hier 5regels aanpassen terwijl je in de code hierboven dat ene regeltje aanpast in de functie. in uw programma misschien peanuts, maar als je een paar 1000 regels code hebt waar je moet gaan in zoeken...)

en dan maak je een functie 'printToScreen' waar je dan de 5regels in afprint.

LCD.print(regel1,0,0);
LCD.print(regel2,0,10);
LCD.print(regel3,0,20);
LCD.print(regel4,0,30);
LCD.print(regel5,0,40);

dit maakt het heel makkelijk voor als je van scherm veranderd (bv naar TFT). dna hoef je enkel die 'printToScreen' functie aan te passen naar de code om string op die TFT te schrijven.
zo zit je 'visueel' deel niet meer overal in de programma code genesteld.
wil je alle gegevens op je computer ook zien, dan maak je een 'printToPC' functie aan waarin staat

Serial.println(regel1);
Serial.println(regel2);
Serial.println(regel3);
Serial.println(regel4);
Serial.println(regel5);

T1 t/m T4 zijn anders van regel opbouw, dit is met opzet, omdat ik even wil laten bezinken welke weergave mij het beste bevalt.

Ik zou voor het gradenteken (0xA7) gaan. Cel is een niet standaard afkorting die maar weinig mensen iets zegt...

T4 = 50.11°C

Hi fcapri en Arco,

Dank voor de input!
Het gradenteken is zeker netter, daar had ik nog niet aan gedacht :-)

Maar wat ik nu als eerste ga uitzoeken is dit, hoe krijg ik te temperatuur uit een sensor en hoe is deze data geformateerd.
Daar ben ik net mee begonnen uit te zoeken maar nu moet ik weg voor een storing.
Ik ga het eerste projectje dat ik heb gedaan met één sensor eens goed bestuderen en dan kijken of ik dit
kan omzetten naar een vier sensor geval.
Zonder het goed begrijpen hoe de data uit de sensor komt hebben alle andere stapjes even geen zin.

facpri

De basistekst eerst vastleggen op het scherm en daarna in de code de waarde op de goede plek gaan invullen bevalt mij wel.
Ik zal dat later vandaag eens proberen.

Gegroet,
Bram

Hi,

Ik ban weer een stukje verder en test nu met de seriele output.
Ik heb een voorbeeld genomen die in de 18D20 library staat en deze zoveel mogelijk "schoon" gemaakt.

Ook heb ik er voor gekozen gebruik te maken van de adressen die ik ken van de gebruikte sensoren.
Ik heb in de code twee sensoren er bij gemaakt: TrafoThermometer en LM317Thermometer
Ik krijg de temperatuur nu wat worstelen nu netjes in de terminal geprint zie onderstaande plaatje.
Ook het plaatsen van lijntjes e.d. gaat tot nog toe goed.
http://www.bramcam.nl/Arduino/4x-18D20-Serial.png

Het probleem zit er in, dat ik niet goed begrijp hoe de temperatuur per stuk uit de sensoren wordt gehaald?
Er wordt zover ik kan zien steeds de fload "tempC" gebruikt.
Kan ik niet om het voor mij simpel te houden gewoon op een sensor adres de data er uit krijgen?
Hieronder de code waarmee ik nu test.

// Include the libraries we need
#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 2
#define TEMPERATURE_PRECISION 12

// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);

// arrays to hold device addresses
DeviceAddress insideThermometer = { 0x10, 0x99, 0x3E, 0xB5, 0x02, 0x08, 0x00, 0xD3 };
DeviceAddress outsideThermometer = { 0x28, 0x75, 0x2A, 0x3B, 0x06, 0x00, 0x00, 0x25 };
DeviceAddress TrafoThermometer = { 0x28, 0x95, 0x52, 0x3B, 0x06, 0x00, 0x00, 0x5F };
DeviceAddress LM317Thermometer = { 0x28, 0x9A, 0x92, 0x3B, 0x06, 0x00, 0x00, 0x59 };

void setup(void)
{
  // start serial port
  Serial.begin(9600);
  Serial.println("------------------------------------------------");
  Serial.println("NoiseAmp Coding Prullaria 18D20 Temperature Demo");
  Serial.println("------------------------------------------------");

  // Start up the library
  sensors.begin();

  // locate devices on the bus
  Serial.print("Locating devices...");
  Serial.print("Found ");
  Serial.print(sensors.getDeviceCount(), DEC);
  Serial.println(" devices.");
  Serial.println("------------------------------------------------");
  
  // set the resolution to 12 bit per device
  sensors.setResolution(insideThermometer, TEMPERATURE_PRECISION);
  sensors.setResolution(outsideThermometer, TEMPERATURE_PRECISION);
  sensors.setResolution(TrafoThermometer, TEMPERATURE_PRECISION);
  sensors.setResolution(LM317Thermometer, TEMPERATURE_PRECISION);
}

// function to print the temperature for a device
void printTemperature(DeviceAddress deviceAddress)
{
  float tempC = sensors.getTempC(deviceAddress);
  Serial.print("Temp C: "); //Deze regel begrijp ik, die plaatst Temp C in de terminal aan het begin van de regel
  Serial.print(tempC);      //Hier gaat het mis met het begrijpen, ik weet dat deze regel uiteindelijk de temperatuur van een bepaalde sensor op een regel plaatst
}                           //maar hier wordt steeds de zelfde variabele gebruikt, hoe wordt deze variabele gevult met een van de vier sensoren?

// main function to print information about a device
void printData(DeviceAddress deviceAddress)
{
  Serial.print(" ");
  printTemperature(deviceAddress);
  Serial.println();
}

/*
 * Main function, calls the temperatures in a loop.
 */
void loop(void)
{ 
  // call sensors.requestTemperatures() to issue a global temperature 
  // request to all devices on the bus
  Serial.print("Requesting temperatures...");
  sensors.requestTemperatures();
  Serial.println("DONE");

  // print the device information
  printData(insideThermometer);
  printData(outsideThermometer);
  printData(TrafoThermometer);
  printData(LM317Thermometer);
}

Bedankt en gegroet,
Bram

deviceAddress geeft aan welke sensor er op dat moment wordt uitgelezen...

Hi Arco,

Ik vind het nogal verwarrend., je hebt DeviceAddress en deviceAddress...

Is het niet mogelijk op de naam van de sensor de gegevens op te vragen?

Zoiets als dit: Serial.print("insideThermometer") <=(natuurlijk hier fout geformateerd maar je begrijpt me wel)

Gegroet,
Bram

Ik vind case sensitivity altijd vreselijk. 't Is nergens goed voor en geeft alleen ellende, ik zet 't altijd meteen uit... :)
(heb programma's gezien waarin LOOP, Loop, en loop als verschillende labels gebruikt werden, om helemaal dol van te worden...)

Hi Arco,

Dus ik ben niet de enige die loop in loop erg onoverzichtelijk vind :-)
Doet me denken aan de professionele Sony Video recorders, daar had je ook 3 loops in elkaar, lekker storing zoeken was dat voor de motor controler...

Ik ga kijken of ik wat kan frutten om de data per stuk uit de sensoren kan krijgen, dat moet toch mogelijk zijn.

Gegroet,
Blackdog

Ik ga kijken of ik wat kan frutten om de data per stuk uit de sensoren kan krijgen, dat moet toch mogelijk zijn.

// Include the libraries we need
#include <OneWire.h>
#include <DallasTemperature.h>
 
// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 2
#define TEMPERATURE_PRECISION 12
 
// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);
 
// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);
 
// arrays to hold device addresses
DeviceAddress insideThermometer = { 0x10, 0x99, 0x3E, 0xB5, 0x02, 0x08, 0x00, 0xD3 };
DeviceAddress outsideThermometer = { 0x28, 0x75, 0x2A, 0x3B, 0x06, 0x00, 0x00, 0x25 };
DeviceAddress TrafoThermometer = { 0x28, 0x95, 0x52, 0x3B, 0x06, 0x00, 0x00, 0x5F };
DeviceAddress LM317Thermometer = { 0x28, 0x9A, 0x92, 0x3B, 0x06, 0x00, 0x00, 0x59 };
 
void setup(void)
{
  // start serial port
  Serial.begin(9600);
  Serial.println("------------------------------------------------");
  Serial.println("NoiseAmp Coding Prullaria 18D20 Temperature Demo");
  Serial.println("------------------------------------------------");
 
  // Start up the library
  sensors.begin();
 
  // locate devices on the bus
  Serial.print("Locating devices...");
  Serial.print("Found ");
  Serial.print(sensors.getDeviceCount(), DEC);
  Serial.println(" devices.");
  Serial.println("------------------------------------------------");
 
  // set the resolution to 12 bit per device
  sensors.setResolution(insideThermometer, TEMPERATURE_PRECISION);
  sensors.setResolution(outsideThermometer, TEMPERATURE_PRECISION);
  sensors.setResolution(TrafoThermometer, TEMPERATURE_PRECISION);
  sensors.setResolution(LM317Thermometer, TEMPERATURE_PRECISION);
}

/*
 * Main function, calls the temperatures in a loop.
 */
void loop(void)
{ 

float temp_insideThermometer = Sensors.getTempC(insideThermometer);
float temp_outsideThermometer=sensors.getTempC(outsideThermometer);
float temp_TrafoThermometer = sensors.getTempC(TrafoThermometer);
float temp_LM317Thermometer = sensors.getTempC(LM317Thermometer);

// print the device information
  printData(temp_insideThermometer);
  printData(temp_outsideThermometer);
  printData(temp_TrafoThermometer);
  printData(temp_LM317Thermometer);

wait(1);
}

HI,

WHOOT!!!
Ik heb het bijna helemaal werkend :-)

Nu een plaatje met echte temperaturen weergegeven.
De Accu regel is nog alleen text.
http://www.bramcam.nl/Arduino/Werkt-01.png

En hieronder de code waar de spaghetti onzin is uitgehaald en het nu een stuk leesbaarder is.
Het zal best mooier kunnen maar zover ben ik nog niet.

// This program requires a Nokia 5110 LCD module.
//
// It is assumed that the LCD module is connected to
// the following pins using a levelshifter to get the
// correct voltage to the module.
//      SCK  - Pin 8
//      MOSI - Pin 9
//      DC   - Pin 10
//      RST  - Pin 11
//      CS   - Pin 12

#include <LCD5110_Graph.h>
#include <OneWire.h>
#include <Wire.h>
#include <DallasTemperature.h>

/*-----( Declare Constants and Pin Numbers )-----*/
// Data wire is plugged into port 2 on the Arduino (can be changed)
#define ONE_WIRE_BUS 2
#define TEMPERATURE_PRECISION 12

/*-----( Declare objects )-----*/
OneWire oneWire(ONE_WIRE_BUS);

// Pass address of our oneWire instance to Dallas Temperature. 
DallasTemperature sensors(&oneWire);

LCD5110 myGLCD(8,9,10,11,12);

extern uint8_t SmallFont[];

/*-----( Declare Variables )-----*/
DeviceAddress OvenT = { 0x10, 0x99, 0x3E, 0xB5, 0x02, 0x08, 0x00, 0xD3 };
DeviceAddress TrafoT = { 0x28, 0x75, 0x2A, 0x3B, 0x06, 0x00, 0x00, 0x25 };
DeviceAddress KastT = { 0x28, 0x95, 0x52, 0x3B, 0x06, 0x00, 0x00, 0x5F };
DeviceAddress LM317T = { 0x28, 0x9A, 0x92, 0x3B, 0x06, 0x00, 0x00, 0x59 };

float Oven;
float Trafo;
float Kast;
float LM317;


void setup()
{
  
//------- Initialize the Temperature measurement library--------------
  sensors.begin();
  
  // set the resolution to 10 bit (Can be 9 to 12 bits .. lower is faster)
  sensors.setResolution(OvenT, TEMPERATURE_PRECISION);
  sensors.setResolution(TrafoT, TEMPERATURE_PRECISION);
  sensors.setResolution(KastT, TEMPERATURE_PRECISION);
  sensors.setResolution(LM317T, TEMPERATURE_PRECISION);
   
  myGLCD.InitLCD();
  myGLCD.setFont(SmallFont);
  myGLCD.setContrast(62);
}

void loop()
{
  sensors.requestTemperaturesByAddress(OvenT);
  sensors.requestTemperaturesByAddress(TrafoT);
  sensors.requestTemperaturesByAddress(KastT);
  sensors.requestTemperaturesByAddress(LM317T);
  
  Oven = sensors.getTempC(OvenT);
  Trafo = sensors.getTempC(TrafoT);
  Kast = sensors.getTempC(KastT);
  LM317 = sensors.getTempC(LM317T);

  myGLCD.print("T1 =       °C",0,0);
  myGLCD.printNumF(float(Oven), 2, 30, 0);

  myGLCD.print("T2 =       °C",0 ,10);
  myGLCD.printNumF(float(Trafo), 2, 30, 10);

  myGLCD.print("T3 =       °C",0 ,20);
  myGLCD.printNumF(float(Kast), 2, 30, 20);

  myGLCD.print("T4 =       °C",0 ,30);
  myGLCD.printNumF(float(LM317), 2, 30, 30);

  myGLCD.print("Accu =    V",0 ,40);
  myGLCD.printNumF(12.11, 2, 30, 40);
    
  myGLCD.update();
    delay(1000);
 }

Roland
Ik ga zo naar jouw code kijken, die kwam binnen tijdens het typen van dit stukje, dank je in ieder geval.

Dan nog een opmerking/vraag als ik dit wil gebruiken "°C" dan plaast hij een dubbele punt in het display.
Moet ik deze notatie anders invoeren in de code, ik heb het nu vanaf CO in de code geplakt.

Gegroet,
Bram