ich habe ein wenig mit DHT22 und einem LCD 16x2 herumgespielt.
Soweit sogut. Dann wollte ich mal sehen wie die Unterschiede zwischen 2 Sensoren sind.
Beide DHT stecken nebeneinander im Steckbrett und ich wollte Temperatur/Feuchte auf
dem zweizeiligen Display abwechselnd anzeigen lassen.
Für den Wechsel wollte ich den "Blink without delay" Sketch adaptieren. Mein Sketch
kompiliert ohne Fehlermeldungen, das Ergebnis ist aber nicht wie erwartet.
Die Texte "Temp.:" und "Feuchte:" werden in ihren Zeilen angezeigt.
Die beiden Werte zeigen aber nur "0". Zusätzlich soll am Ende der ersten Zeile die Nummer
angezeigten Sensors erscheinen. Dort erscheint aber nur die "2". Also findet wohl der
Wechsel zwischen den Sensoren nicht statt und ausserdem werden keine Werte
angezeigt. Bin etwas ratlos...
mfg
Frank
P.S.: Board ist ein Arduino Uno...
/*
LiquidCrystal Library - display() and noDisplay()
Demonstrates the use a 16x2 LCD display. The LiquidCrystal
library works with all LCD displays that are compatible with the
Hitachi HD44780 driver. There are many of them out there, and you
can usually tell them by the 16-pin interface.
This sketch prints "Hello World!" to the LCD and uses the
display() and noDisplay() functions to turn on and off
the display.
The circuit:
* LCD RS pin to digital pin 12
* LCD Enable pin to digital pin 11
* LCD D4 pin to digital pin 5
* LCD D5 pin to digital pin 4
* LCD D6 pin to digital pin 3
* LCD D7 pin to digital pin 2
* LCD R/W pin to ground
* 10K resistor:
* ends to +5V and ground
* wiper to LCD VO pin (pin 3)
Library originally added 18 Apr 2008
by David A. Mellis
library modified 5 Jul 2009
by Limor Fried (http://www.ladyada.net)
example added 9 Jul 2009
by Tom Igoe
modified 22 Nov 2010
by Tom Igoe
This example code is in the public domain.
http://arduino.cc/en/Tutorial/LiquidCrystalDisplay
*/
// include the library code:
#include <LiquidCrystal.h>
#include "DHT.h"
DHT dht0;
DHT dht1;
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
// Variablen
int dht_State = LOW; // used to set the dht_state
unsigned long previousMillis = 0; // speichere letzte zeit
const long interval = 2000; // interval des anzeigewechsels
int humidity;
int temperature;
void setup() {
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
// Print a message to the LCD.
//lcd.print("Thermo-/Hygro");
dht0.setup(8); //data pin 8
dht1.setup(9); //data pin 9
delay(1000);
}
void loop()
{
// here is where you'd put code that needs to be running all the time.
// check to see if it's time to change the display; that is, if the
// difference between the current time and last time you changed
// the display is bigger than the interval at which you want to
// change the display.
unsigned long currentMillis = millis();
if(currentMillis - previousMillis > interval) {
// save the last time you blinked the LED
previousMillis = currentMillis;
// if dht0 is active change to dht1 and vice-versa:
if (dht_State == LOW) {
dht_State = HIGH;
} else {
dht_State = LOW;
}
if (dht_State = LOW) {
delay(dht0.getMinimumSamplingPeriod());
int humidity = int(dht0.getHumidity()); // Nachkommastellen abschneiden
int temperature = int(dht0.getTemperature());
lcd.setCursor(15, 0);
lcd.print('1'); // Nummer des Sensors
}
if (dht_State = HIGH) {
delay(dht1.getMinimumSamplingPeriod());
int humidity = int(dht1.getHumidity()); // Nachkommastellen abschneiden
int temperature = int(dht1.getTemperature());
lcd.setCursor(15, 0);
lcd.print('2'); // Sensornummer
}
lcd.setCursor(0, 0);
lcd.print("Temp.:");
lcd.setCursor(0, 1);
lcd.print("Feuchte:");
lcd.setCursor(9, 0);
lcd.print(temperature);
lcd.setCursor(9, 1);
lcd.print(humidity);
}
}
Poste deinen Sketch bitte direkt im Forum in Code-Tags und verwende dazu die Schaltfläche </> oben links im Editorfenster.
Dann ist dieser für alle besser zu lesen.
warum liesst du nicht beide Sensoren immer ein und speicherst die Werte in unterschiedlichen Variable. Mit Serial print kannst Du dir dann alle Werte anzeigen lassen. Mit dem "Blinker" schaltest Du dann die Ausgabe der Variablen auf die Anzeige um.
Die Zeile funktioniert hier wenn ich nur einen Sensor anspreche.
Die Umwandlung float/integer habe ich von hier: https://forum.arduino.cc/index.php?topic=29895.0
Welche "Serielle" ist hier gemeint?
warum liesst du nicht beide Sensoren immer ein und speicherst die Werte in unterschiedlichen Variable. Mit Serial print kannst Du dir dann alle Werte anzeigen lassen. Mit dem "Blinker" schaltest Du dann die Ausgabe der Variablen auf die Anzeige um.
Heinz
Nachtrag
if (dht_State == LOW) {
= ist eine Zuweisung
== Ist ein Vergleich
du willst vergleichen
Das ist eine prima Idee, daran hatte ich gar nicht gedacht.
Zum Nachtrag: Autsch, ist wohl mein Lieblingsfehler...
Ich mache gerade ein Überarbeitung und kann den Code dann hier einstellen.
Es klappt jetzt!
Vielen Dank an Euch alle!
Ich stelle hier die überarbeitete funktionierende Version ein:
/*
LiquidCrystal Library - display() and noDisplay()
Demonstrates the use a 16x2 LCD display. The LiquidCrystal
library works with all LCD displays that are compatible with the
Hitachi HD44780 driver. There are many of them out there, and you
can usually tell them by the 16-pin interface.
This sketch prints "Hello World!" to the LCD and uses the
display() and noDisplay() functions to turn on and off
the display.
The circuit:
* LCD RS pin to digital pin 12
* LCD Enable pin to digital pin 11
* LCD D4 pin to digital pin 5
* LCD D5 pin to digital pin 4
* LCD D6 pin to digital pin 3
* LCD D7 pin to digital pin 2
* LCD R/W pin to ground
* 10K resistor:
* ends to +5V and ground
* wiper to LCD VO pin (pin 3)
Library originally added 18 Apr 2008
by David A. Mellis
library modified 5 Jul 2009
by Limor Fried (http://www.ladyada.net)
example added 9 Jul 2009
by Tom Igoe
modified 22 Nov 2010
by Tom Igoe
This example code is in the public domain.
http://arduino.cc/en/Tutorial/LiquidCrystalDisplay
*/
// include the library code:
#include <LiquidCrystal.h>
#include "DHT.h"
DHT dht0;
DHT dht1;
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
// Variablen
int dht_State = LOW; // used to set the dht_state
unsigned long previousMillis = 0; // speichere letzte zeit
const long interval = 2000; // interval des anzeigewechsels
int humidity;
int temperature;
void setup() {
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
dht0.setup(8); //data pin 8
dht1.setup(9); //data pin 9
delay(1000);
}
void loop()
{
// here is where you'd put code that needs to be running all the time.
// check to see if it's time to change the display; that is, if the
// difference between the current time and last time you changed
// the display is bigger than the interval at which you want to
// change the display.
unsigned long currentMillis = millis();
if(currentMillis - previousMillis > interval) {
// save the last time you blinked the LED
previousMillis = currentMillis;
// if dht0 is active change to dht1 and vice-versa:
if (dht_State == LOW) {
dht_State = HIGH;
} else {
dht_State = LOW;
}
if (dht_State == LOW) {
delay(dht0.getMinimumSamplingPeriod());
humidity = int(dht0.getHumidity()); // Nachkommastellen abschneiden
temperature = int(dht0.getTemperature());
lcd.clear();
lcd.setCursor(15, 0);
lcd.print('1'); // Nummer des Sensors
}
if (dht_State == HIGH) {
delay(dht1.getMinimumSamplingPeriod());
humidity = int(dht1.getHumidity()); // Nachkommastellen abschneiden
temperature = int(dht1.getTemperature());
lcd.clear();
lcd.setCursor(15, 0);
lcd.print('2'); // Sensornummer
}
lcd.setCursor(0, 0);
lcd.print("Temp.:");
lcd.setCursor(0, 1);
lcd.print("Feuchte:");
lcd.setCursor(9, 0);
lcd.print(temperature);
lcd.print(char(223)),lcd.print("C");
lcd.setCursor(9, 1);
lcd.print(humidity);
lcd.print("%");
}
}
Dein 'Lieblingsfehler' wird Dir von der IDE als WARNUNG ausgegeben, wenn Du Diese aktivierst.
In den Einstellungen beide Haken zu Meldungen beim Kompilieren und Hochladen.
Danke, habe ich gemacht. Warum ist das denn nicht standardmässig aktiv?
Andere Frage: Könnte man das Programm einfacher umsetzen?
Immerhin habe ich 2-mal den gleichen Code für die beiden Sensoren geschrieben.
Wenn ich noch mehr Sensoren hätte würde der Code recht umfangreich...
bastler_th:
Danke, habe ich gemacht. Warum ist das denn nicht standardmässig aktiv?
Andere Frage: Könnte man das Programm einfacher umsetzen?
Immerhin habe ich 2-mal den gleichen Code für die beiden Sensoren geschrieben.
Wenn ich noch mehr Sensoren hätte würde der Code recht umfangreich...
mfg
Frank
Das geht in Funktionen die du mit entsprechenden Parametern aufrufst.
Deine Code-Duplikate werden sich in einer Kleinigkeit unterscheiden - wohl dem benutztem DHT.
Du musst also dem Code-Block diesen Unterschied variable übergeben können - Das kann eine Funktion mit Parametern.
Danke, werde ich ausprobieren.
Ursprünglich hatte ich an sowas gedacht:
delay(dht(value).getMinimumSamplingPeriod());
wobei in "value" die aktuelle Sensornummer eingesetzt wird. Funktioniert aber
nicht. Dann hätte ich den Codeblock nur einmal schreiben müssen und nur den
Wert von "value" jeweils einsetzen.
Möglicherweise geht das auch irgendwie und ich als Anfänger weiss nur
nicht wie...
Ja, man kann da noch einiges vereinfachen.
War ja nur als Beispiel für die Nutzung von Funktionen gedacht.
In deinem Fall kannst du auch über die Nutzung von Arrays nachdenken.
legst du zwei objekte der Klasse DHT an jeweils mit unterschedlichem Namen
mit
DHT dht[2];
würdest Du ein Array mit 2 Elementen anlegen. die könntest Du dann jeweils über den Index in der [] ansprechen. Damit würde es sich anbieten für die Messwerte selbst auch Arrays zu verwenden.
Also beschäftige dich mit dem Thema Arrays wenn du magst.
Heinz
Tommy Danke für den Hinweis Tippteufel hatte zugeschlagen
Danke für die Hinweise. Bin gerade bei einer anderen Sache dran
mit Arrays. Klappt bisher ganz gut. Könnte ich vielleicht in einem eigenen
Thread hochladen falls Interesse besteht.
Übrigens:
Die Temperaturwerte beider Sensoren sind ziemlich identisch, lediglich
die Feuchtewerte liegen etwas auseinander(1-56%; 2-52%).
hier meine letzte Variante meines Thermo/Hygrometer Sketches:
vorige Version: 4178 Bytes
letzte Version: 4050 Bytes
es wird besser...
mfg
Frank
/*
The circuit:
LCD RS pin to digital pin 12
LCD Enable pin to digital pin 11
LCD D4 pin to digital pin 5
LCD D5 pin to digital pin 4
LCD D6 pin to digital pin 3
LCD D7 pin to digital pin 2
LCD R/W pin to ground
10K resistor:
ends to +5V and ground
wiper to LCD VO pin (pin 3)
Neue Version meines LCD Sketches
Zeigt abwechselnd Temperatur/Feuchte von 2 DHT22 Fuehlern
ohne Nachkommastellen um Platz auf Display zu sparen
*/
// include the library code:
#include <LiquidCrystal.h>
#include "DHT.h"
//DHT Array erstellen
DHT dht[2];
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
// Variablen
int dht_State = LOW; // used to set the dht_state
unsigned long previousMillis = 0; // speichere letzte zeit
const long interval = 2000; // interval des anzeigewechsels
int humidity;
int temperature;
byte sensor;
void setup() {
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
dht[0].setup(8); //erster dht pin 8
dht[1].setup(9); //zweiter dht pin 9
}
void loop()
{
unsigned long currentMillis = millis();
if (currentMillis - previousMillis > interval) {
// save the last time you blinked the LED
previousMillis = currentMillis;
// if dht0 is active change to dht1 and vice-versa:
if (dht_State == LOW) {
dht_State = HIGH;
} else {
dht_State = LOW;
}
if (dht_State == LOW) {
sensor = 0;
} else {
sensor = 1;
}
}
delay(dht[sensor].getMinimumSamplingPeriod());
humidity = int(dht[sensor].getHumidity()); // Nachkommastellen abschneiden
temperature = int(dht[sensor].getTemperature()); // Nachkommastellen abschneiden
lcd.setCursor(0, 0);
lcd.print("Temp.:");
lcd.setCursor(0, 1);
lcd.print("Feuchte:");
lcd.setCursor(9, 0);
lcd.print(temperature);
lcd.print(char(223)), lcd.print("C");
lcd.setCursor(9, 1);
lcd.print(humidity);
lcd.print("%");
lcd.setCursor(15, 0); // Cursor ans Ende der ersten Zeile
lcd.print(sensor + 1); // Sensornummer anzeigen
}
Status als int? Wie viele Status bekommst Du? Bei auch <0 char?
Ok ... boolean würde ebenfalls reichen - hier wäre 1 Byte Ram und wohl 1...2 Byte Flash einsparbar (Du musst ja nicht ein int beschreiben, wenn auch ein byte reicht - nur besteht ein int aus zwei Byte)
Auch könntest Du die Abfrage, Welcher DHT nun dran ist, in eine IF packen, bzw. dht_State einfach nur negieren.
Ob man die Sensor-Nummer (sensor) einsparen kann - also, ob Das dann wirklich spart, müsste man testen.
dht[sensor?1:0]. ...
Hätten wir aber 3x im Sketch und für die Wertzuweisung nur eine IF.