LCD+DHT11+LM35

Het volgende: ik ben bezig met een sketch voor een project. De bedoeling is om op een lcd-scherm (weergave: 16,2) de temperatuur weer te geven welke worden weergegeven door zowel een DHT11 en een LM35-sensor. De hardware is inmiddels opgebouwd maar de sketch krijg ik niet aan de gang:

#include <LiquidCrystal.h>;
#include <DHT.h>;
#include <LM35.h>;

DHT11 dht11;

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

#define tempPin 14;
#define tempPin 15;

int sensorPin = 15;
int tempC;

void setup () {

pinMode (tempPin 14, INPUT);
pinMode (tempPin 15, INPUT);
}

void loop () {

delay (dht.getMinimumSamplingPeriod () )

float temperature = dht.getTemperature();

lcd.setCursor (0, 1);
lcd.print(<DHT11 = >);
lcd.setCursor(15, 1);
lcd.println(<temperature, 1>);
lcd.setCursor(< oC>);

int get_temperature(int pin15) {

int temperature = analogRead(pin15);

lcd.setCursor(0, 2);
lcd.print(<LM35 = >);
lcd.setCursor(15, 2);
lcd.println(<temperature, 1>);
lcd.setCursor(< oC>);
}

In regel 10+11, en regel 22+23 wordt ondanks diverse veranderingen telkens een foutmelding aangegeven. Heeft iemand een oplossing? Alvast bedankt.

Code posten met tags aub.

Misschien even vermelden wat de foutmelding is, anders wordt het moeilijk om hier iets zinnigs over te zeggen.

Welke Arduino gebruik je?

Hoi pascal100,

Inderdaad, graag je code posten tussen [code] [/code]  tags, dat maakt het veel gemakkelijker je te helpen.

De IDE gaat voor het compileren, eerst controleren of alles wel klopt (voor zover dat te vinden is).
Bij de eerste de beste fout die de IDE tegen komt, gooit ie een foutmelding naar je, en stopt dan met de verdere afhandeling.
Die regel hierboven is ter voorbereiding voor je, want er is nog wel meer aan te merken op jouw sketch tot nog toe.

Wanneer ik de code die je gepost hebt, kopieer naar de IDE, dan kom ik bij de genoemde regels uit op dingen die je met tempPin wil doen.
Je begint er mee (regel 10) om tempPin te definiëren, en das goed.
Maar defines zijn geen onderdeel van je code, het zijn instructies voor de IDE.
Daarom moet je een define niet afsluiten met een puntkomma.
Met een define vertel je de IDE (specifiek in jouw code), dat elke keer wanneer je tempPin typt, je eigenlijk 14 bedoelt.
Direct daarna vertel je dat wanneer je tempPin typt, 15 bedoelt.
Met dat laatste zal de IDE geen probleem hebben, je hebt je schijnbaar bedacht en wil nu iets anders dan zojuist
Wanneer het een persoon zou zijn, zou ie tegen je roepen: "wat wil je nou, 14 of 15 ?"
Maar het zal in de IDE wel tot fouten leiden.
Een stukje verderop doe je ook nog iets met het getal 15 in verband met een sensor die je verder helemaal niet gebruikt (in de getoonde code).

Ook includes doe je om dezelfde redenen zonder ;

In regel 22 doe je iets raars want je probeert iets met tempPin wat niet te begrijpen is.
Dat komt omdat tempPin [spatie] 14 een heel andere betekenis heeft dan tempPin14 of tempPin_14.
Het slaat ook nergens op om tempPin14 te gebruiken. want dan ben je veel sneller klaar door alleen naar het getal 14 te wijzen.

Wat je werkelijk met deze 2 problemen zou moeten willen, is het gemakkelijker te maken je code lezen.
Daarom helpt het gebruik van tempPin erg weinig.

Dus kan ik me voorstellen dat je niet alleen een naam bedenkt die beschrijft dat de betreffende pin iets met temperatuur te maken heeft, maar dat je nog duidelijker maakt over welke temperatuur je het dan hebt.
Dus dhtPin en lmPin bijvoorbeeld (als dat klopt met wat je gebruiken wil).

Wanneer je dan een waarde gaat binnenhalen, doe je dit:

int temperature = analogRead(pin15);

Maar je hebt pin15 niet gedefinieerd, dus de IDE heeft er helemaal geen idee van dat je hiermee naar pin 15 wil verwijzen.
Met deze kleine wijziging zal ie dat veel beter gaan snappen:

int temperature = analogRead(15);

Alleen weet ik niet uit het hoofd of pin 15 wel een analoge pin is (of met ArdLab_Gent's woorden: Welke Arduino gebruik je ?).

Dan nog je LCD.
Je vergeet de LCD te initialiseren, dus of die ooit gaat werken weet ik niet.
Je hebt m wel verteld op welke pinnen de LCD is aangesloten, maar niet dat ie die ook moet gaan gebruiken en hoeveel regels en tekens per regel dat ding dan heeft.
Je vertelde dat je een 16,2 display gebruikt.
Das dus 2 regels van 16 karakters.
Maar je was schijnbaar vergeten dat het tellen niet bij 1, maar bij 0 begint.
Dus de eerste positie van je LCD is positie 0,0.
Wanneer je je LCD dus deze instructie geeft:

lcd.setCursor(15, 2);

Dan zet je de cursor op de laatste plaats van de 3e regel op je LCD met 2 regels.
Zou zomaar kunnen zijn dat dat wel werkt en de betreffende waarde uiteindelijk op 0,1 uitkomt.
Maar waarom wil je het zo moeilijk maken (ik geloof helemaal niet dat je dat wil hoor), terwijl het veel duidelijker kan ?

[edit]
Ik vergeet nog iets dat me opviel.
Dit stukje zal leiden tot verwarring van de IDE:

#include <DHT.h>;
.
.
DHT11 dht11;

Je probeert ogenschijnlijk DHT.h aan te roepen wanneer je dht11 typt.
Maar dan moet je niet als eerste DHT11 typen.
Verder moet je de library ook vertellen (klik ! voor het voorbeeld waar ik dat vandaan heb) welke DHT sensor je gebruikt

DHT dht(14, DHT11);

Je code bevat dus voldoende aanwijzingen om te concluderen dat je een DHT11 sensor wil gebruiken aan pin 14 van je Arduino.
[/edit]


Ik begrijp best dat je al een tijdje aan het stoeien bent met je sketch en dat je de laatste sketch die je gemaakt hebt hier hebt laten zien.
Daar denk ik ook sommige van de aangestipte problemen uit te kunnen verklaren.
Om dit soort problemen te voorkomen, sla ik zelf telkens als ik wat aan een code heb veranderd, de sketch op met een nieuwe naam.
Dus eerst sketch1.ino, dan sketch1.1.ino enzovoorts.
Zo word het dus vrij eenvoudig om aan versiebeheer te doen.
En kun je gemakkelijk een stap (of meer) terug wanneer het toch niet helemaal de goede kant op ging met je laatste inspanningen.

En ik probeer ook om problemen 1 voor 1 aan te pakken, maar das wel iets lastiger omdat sommige problemen pas naar voren komen als je verder bent met je sketch en/of iets wil uitbreiden.

pascal100:
void loop () {

[KNIP]

int get_temperature(int pin15) {

int temperature = analogRead(pin15);

lcd.setCursor(0, 2);
lcd.print(<LM35 = >);
lcd.setCursor(15, 2);
lcd.println(<temperature, 1>);
lcd.setCursor(< oC>);
}

Ik denk dat ik nog een probleem zie: de regel "int get_temperature(int pin15) {" duidt een functie aan, maar:
1: deze staat binnen de functie loop();
2: heeft, ondanks de "int", geen returnwaarde;
3: wordt nergens in de code aangeroepen.

Of ben ik nou in de war?

Dit klopt, en is waarschijnlijk ook een restant van een aantal malen proberen.
Of het is het resultaat van het vergeten een { of } (of beiden) op de juiste plaatsten te zetten.
Op zich kan het geen kwaad om deze zaken in een aparte functie te zetten, maar ik zie de noodzaak er niet zo van.
Omdat het op de huidige wijze zeker niet gaat werken en de winst van een aparte functie hiervoor zeer beperkt is, zou ik het daarom ook niet in een functie doen en gewoon in de loop meenemen.

Overigens heb ik dat dus duidelijk wel over het hoofd gezien, want hiermee is dus pin15 wel degelijk gedefinieerd.
Alleen niet op de juiste wijze en geldt het andere commentaar dat ik er op gaf nog steeds.
Verder staat er inderdaad geen terug te geven waarde in dat stukje van de code.

Ik heb inmiddels een aantal aanpassingen gemaakt en heb nu onderstaande sketch:

#include <LM35.h>
#include <LiquidCrystal.h>
#include <DHT.h>

DHT11 dht11;
LM35;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
DHT11.setup D5;
LM35.setup D6;
int DHT11 = analogRead(D6);
int DHTValue = 0;
int LM35 = analogRead(D7);
int LM35Value = 0;

void setup () {

lcd.begin (0, 0);
}

void loop() {
delay(2000);
float temperature = DHT.getTemperature();
lcd.setCursor (0, 0);
lcd.print(<DHT11 = >);
lcd.setCursor (8, 0);
lcd.println (temperature, 1);
lcd.setCursor(13, 0);
lcd.print (< oC>);

float temperature = LM35.getTemperature();
lcd.setCursor (0, 1);
lcd.print(<LM35 = >);
lcd.setCursor (8, 1);
lcd.print (temperature, 1);
lcd.setCursor(13, 1);
lcd.print (< oC>);
}

In regel 9 wordt een foutmelding aangegeven: expected unqualified-id before ';' token. Er klopt nog steeds iets niet maar kom er maar niet achter wat. Misschien een kleinigheid waar ik over heen kijk. Wellicht dat iemand wel ziet wat er niet klopt? (Ik heb overigens een Arduino Uno in gebruik).

Code posten met tags aub.

wat is D5?
wat is D6?
wat is D7?

Zoals ze er nu staan zijn dat niet gedeclareerde variabelen.

lcd.begin (0, 0);
Dat is een display met 0 rijen en 0 kolommen, kan je weinig op zien.

#include <LM35.h>
#include <LiquidCrystal.h>
#include <DHT.h>

DHT11 dht11;
LM35;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
DHT11.setup D5;
LM35.setup D6;
int DHT11 = analogRead(D6);
int DHTValue = 0;
int LM35 = analogRead(D7);
int LM35Value = 0;

void setup () {

  lcd.begin (0, 0);
}

void loop() {
  delay(2000);
  float temperature = DHT.getTemperature();
  lcd.setCursor (0, 0);
  lcd.print(<DHT11 = >);
  lcd.setCursor (8, 0);
  lcd.println (temperature, 1);
  lcd.setCursor(13, 0);
  lcd.print (< oC>);

  float temperature = LM35.getTemperature();
  lcd.setCursor (0, 1);
  lcd.print(<LM35 = >);
  lcd.setCursor (8, 1);
  lcd.print (temperature, 1);
  lcd.setCursor(13, 1);
  lcd.print (< oC>);
}

In de voorbeelden zie je dat die LM35 steeds iets doet met A0; dat is een analoge ingang.
Waarom blijf je die op een niet analoge ingang gebruiken ?
Dat werkt niet.
D5 bestaat trouwens niet; dat is gewoon 5.
En waar komen de <> vandaan in je prints ?
Heeft dat iets met een AZERTY toetsenbord indeling te maken toevallig (ik heb echt geen idee) ?

Ik heb inmiddels de sketch veranderd in de onderstaande. Deze bevat in elk geval geen fouten, maar laat zich verifieren.

#include <My_DHT_Using_Opp.h>
#include <LM35.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

int value;
float celsius;
const int dhtPin = 0; // de analoge pin voor de DHT11
const int lmPin = 1; // de analoge pin voor de LM35
void setup() {
lcd.begin(16, 2);
}
void loop() {
value = analogRead(0);
celsius = (value / 1023 * 500);
lcd.clear();

lcd.setCursor (0, 0);
lcd.print ("DHT11 = ");
lcd.setCursor (8, 0);
lcd.println (celsius, 1);
lcd.setCursor(13, 0);
lcd.print (" oC");

lcd.setCursor (0, 1);
lcd.print("LM35 = ");
lcd.setCursor (8, 1);
lcd.print (celsius, 1);
lcd.setCursor(13, 1);
lcd.print (" oC");
delay (1000);
}

code posten met tags aub

#include <My_DHT_Using_Opp.h>
#include <LM35.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

int value;
float celsius;
const int dhtPin = 0; // de analoge pin voor de DHT11
const int lmPin = 1;  // de analoge pin voor de LM35
void setup() {
  lcd.begin(16, 2);
}
void loop() {
  value = analogRead(0);
  celsius = (value / 1023 * 500);
  lcd.clear();

  lcd.setCursor (0, 0);
  lcd.print ("DHT11 = ");
  lcd.setCursor (8, 0);
  lcd.println (celsius, 1);
  lcd.setCursor(13, 0);
  lcd.print (" oC");

  lcd.setCursor (0, 1);
  lcd.print("LM35 = ");
  lcd.setCursor (8, 1);
  lcd.print (celsius, 1);
  lcd.setCursor(13, 1);
  lcd.print (" oC");
  delay (1000);
}

Misschien even opzoeken welke UNO pinnen kunnen gebruikt worden als digitale of analoge ingang.
Pin 0 en 1 kan je beter niet gebruiken, die worden gebruikt door de seriële monitor.

Ik ga niet weer beginnen over [code] [/code] tags, maar ga ook niet meer antwoorden als ze niet gebruikt worden.

Wanneer een code geen problemen geeft bij een verificatie, wil dat nog niet zeggen dat die geen fouten heeft.

  lcd.println (celsius, 1);
  lcd.setCursor(13, 0);

println betekent dat de cursor na het printen naar de eerste positie van de volgende regel springt.
Daarna zet jij m weer terug naar de vorige regel; niet erg zinvol.
Daarom maar gewoon print in plaats van println gebruiken.
Vervolgens stuur je de inhoud van celsius naar het scherm, en vertel je daarbij dat base 1 gebruikt moet worden voor dat printen.
Base 1 bestaat niet (klik!).
Ik zou ook niet weten waarom je dat zou willen gebruiken, want je hoeft de getalnotatie helemaal niet te veranderen.

Daarna zeg je dat je een andere meting laat zien, maar stuur je weer dezelfde dus onveranderde inhoud van celsius naar je scherm.

Wanneer deze code alles is wat er in je sketch gebruikt, kun je het zo doen.
Maar wanneer er meer gedaan moet worden in je code, is wat je tot nog toe hebt, erg inefficiënt.
Maar dat is van later zorg.