blackdog
Golden Member
Daar de mens het noodzakelijke niet kan volbrengen, streeft hij naar het overbodige (Goethe)
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.
blackdog
Golden Member
Daar de mens het noodzakelijke niet kan volbrengen, streeft hij naar het overbodige (Goethe)
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%)]
Tommyboy
Zo goed als het vroeger was, is het nooit geweest.
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);
}Pertinax
Mijn thuis is waar mijn Weller staat
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%)]
blackdog
Golden Member
Daar de mens het noodzakelijke niet kan volbrengen, streeft hij naar het overbodige (Goethe)
Tommy Boy, Pertinax
Geweldig, nu twee digits achter de comma! (dtostrf(number, 5, 2, temperatureF);)
Nu gaan lezen en het gaan begrijpen 
Gegroet,
Bram
Pertinax
Mijn thuis is waar mijn Weller staat
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.
blackdog
Golden Member
Daar de mens het noodzakelijke niet kan volbrengen, streeft hij naar het overbodige (Goethe)
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
Jochem
If you want to succeed, double your failure rate.
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.
blackdog
Golden Member
Daar de mens het noodzakelijke niet kan volbrengen, streeft hij naar het overbodige (Goethe)
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...
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.
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
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???
Roland van Leusden
It's the rule that you live by and die for It's the one thing you can't deny Even though you don't know what the price is. It is justified.
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
blackdog
Golden Member
Daar de mens het noodzakelijke niet kan volbrengen, streeft hij naar het overbodige (Goethe)
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);Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
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
blackdog
Golden Member
Daar de mens het noodzakelijke niet kan volbrengen, streeft hij naar het overbodige (Goethe)
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
blackdog
Golden Member
Daar de mens het noodzakelijke niet kan volbrengen, streeft hij naar het overbodige (Goethe)
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.
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
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
blackdog
Golden Member
Daar de mens het noodzakelijke niet kan volbrengen, streeft hij naar het overbodige (Goethe)
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
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
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...)
blackdog
Golden Member
Daar de mens het noodzakelijke niet kan volbrengen, streeft hij naar het overbodige (Goethe)
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
Roland van Leusden
It's the rule that you live by and die for It's the one thing you can't deny Even though you don't know what the price is. It is justified.
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);
}
blackdog
Golden Member
Daar de mens het noodzakelijke niet kan volbrengen, streeft hij naar het overbodige (Goethe)
HI,
WHOOT!!!
Ik heb het bijna helemaal werkend 
Nu een plaatje met echte temperaturen weergegeven.
De Accu regel is nog alleen text.
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