Pages: [1] 2   Go Down
Author Topic: Mal wieder millis()..... ;)  (Read 1865 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Jr. Member
**
Karma: 1
Posts: 89
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi,

ich habe mal wieder ne verständnisfrage den mein Kopf scheint mal wieder ein Overload zu haben. Ich habe 2 Luftfeuchte Sensoren (DHT11 & DHT22) die ich in einem Abstand von 2s nacheinander auslesen möchte. Also Sensor DHT11 nach 2s, Sensor DHT22 nach weiteren 2s, DHT11 wieder nach weiteren 2s...ihr wisst was ich meine. Leider habe ich einen schweren Denkfehler drin und grübel nun schon sehr lange darüber nach ohne auf die Lösung zu kommen. Mir ist klar wie ich es mit Delay hinbekomme, aber ich möchte es in millis machen. Dachte mir das beide millis funktionen voneinander abhändig sein müssen, aber wie? Hier mal ein Auszugvom relevanten Code:

Code:
int interval_in = 4000;
int interval_out = 2000;

void setup(void) // Setup wird einmalig durchlaufen
{
  prev_in = millis();
  prev_out = millis();
}

void HumidityInside() // Loop für die Luftfeuchte "Inside"

  if((millis() - prev_in) > interval_in) { // Delay mit Millis damit der µC nach andere Dinge paralell abarbeiten kann
  prev_in = millis(); // Aktuelle millis Zeit in "prev_in" speichern
  DHT.read11(DHT11_PIN); // DHT11_PIN einlesen
  float Humidity_In = DHT.humidity; // Luftfeuchte in float Variable speichern
  if (Humidity_In >= 20 && Humidity_In <= 90){ // Erst speichern wenn Feuchtesensor plausieblen Wert zwischen 20 % und 90 % liefert
    lcd.print(Humidity_In,0); // Luftfeuchte ohne Nachkommastelle anzeigen
    lcd.print("%"); // Text "%"
    temp_hi = Humidity_In,0; // Innen - Luftfeuchte holen und speichern
   }
  }
}


void HumidityOutside() // Loop für die Luftfeuchte "Outside"
{
  if((millis() - prev_out) > interval_out) { // Delay mit Millis damit der µC nach andere Dinge paralell abarbeiten kann
  prev_out = millis(); // Aktuelle millis Zeit in "prev_out" speichern
  DHT.read22(DHT22_PIN); // DHT22_PIN einlesen
  float Humidity_Out = DHT.humidity; // Luftfeuchte in float Variable speichern
  if (Humidity_Out >= 0 && Humidity_Out <= 100){ // Erst speichern wenn Feuchtesensor plausieblen Wert zwischen 20 % und 90 % liefert
    lcd.print(Humidity_Out,0); // Luftfeuchte ohne Nachkommastelle anzeigen
    lcd.print("%"); // Text "%"
    temp_ho = Humidity_Out,0; // Innen - Luftfeuchte holen und speichern
    }
  }
}

void loop(void) // Diese Loop wird ständig wiederholt
{
  HumidityInside(); // Ausgabe der Luftfeuchte vom "HumidityInside"
  HumidityOutside(); // Ausgabe der Luftfeuchte vom "HumidityOutside"
}


In dieser Konstellation ist es ja so das ein Sensor alle 2s aufgelesen wird, der andere alle 4s.....ist dann aber so das ja alle 4s, 8s, 12s etc.... trotzdem beide "gleichzeitig" ausgelesen werden..... smiley-confuse

Help....please....

Grüße Thomas
Logged

0
Offline Offline
Edison Member
*
Karma: 20
Posts: 1980
Wo ein Wille ist, da ist auch ein Weg !
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
#define DHT11_PIN A0
#define DHT22_PIN A1

int State = LOW;             // ledState used to set the LED
long previousMillis = 0;        // will store last time LED was updated
long interval = 2000;           // interval at which to blink (milliseconds)

void setup() {
  pinMode(DHT11_PIN, INPUT);
  pinMode(DHT22_PIN, INPUT);   
}

void loop()
{
  unsigned long currentMillis = millis();
  if(currentMillis - previousMillis > interval) {
    previousMillis = currentMillis;   
    if (State == LOW)
      HumidityInside();
    else
      HumidityOutside();
  }
}

void HumidityInside() // Loop für die Luftfeuchte "Inside"

  DHT.read11(DHT11_PIN); // DHT11_PIN einlesen
  float Humidity_In = DHT.humidity; // Luftfeuchte in float Variable speichern
  if (Humidity_In >= 20 && Humidity_In <= 90)
  { // Erst speichern wenn Feuchtesensor plausieblen Wert zwischen 20 % und 90 % liefert
    lcd.print(Humidity_In,0); // Luftfeuchte ohne Nachkommastelle anzeigen
    lcd.print("%"); // Text "%"
    temp_hi = Humidity_In,0; // Innen - Luftfeuchte holen und speichern
  }
}

void HumidityOutside() // Loop für die Luftfeuchte "Outside"
{
  DHT.read22(DHT22_PIN); // DHT22_PIN einlesen
  float Humidity_Out = DHT.humidity; // Luftfeuchte in float Variable speichern
  if (Humidity_Out >= 0 && Humidity_Out <= 100)
  { // Erst speichern wenn Feuchtesensor plausieblen Wert zwischen 20 % und 90 % liefert
    lcd.print(Humidity_Out,0); // Luftfeuchte ohne Nachkommastelle anzeigen
    lcd.print("%"); // Text "%"
    temp_ho = Humidity_Out,0; // Innen - Luftfeuchte holen und speichern
  }
}
Logged

Mein Arduino Projekte Blog:
http://ardu-megatank.blogspot.de/

Offline Offline
Jr. Member
**
Karma: 2
Posts: 99
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
#define DHT11_PIN A0
#define DHT22_PIN A1

int State = LOW;             // ledState used to set the LED
long previousMillis = 0;        // will store last time LED was updated
long interval = 2000;           // interval at which to blink (milliseconds)

void setup() {
  pinMode(DHT11_PIN, INPUT);
  pinMode(DHT22_PIN, INPUT);   
}

void loop()
{
  unsigned long currentMillis = millis();
  if(currentMillis - previousMillis > interval) {
    previousMillis = currentMillis;   
    if (State == LOW)
      HumidityInside();
    else
      HumidityOutside();
  }
}

void HumidityInside() // Loop für die Luftfeuchte "Inside"

  DHT.read11(DHT11_PIN); // DHT11_PIN einlesen
  float Humidity_In = DHT.humidity; // Luftfeuchte in float Variable speichern
  if (Humidity_In >= 20 && Humidity_In <= 90)
  { // Erst speichern wenn Feuchtesensor plausieblen Wert zwischen 20 % und 90 % liefert
    lcd.print(Humidity_In,0); // Luftfeuchte ohne Nachkommastelle anzeigen
    lcd.print("%"); // Text "%"
    temp_hi = Humidity_In,0; // Innen - Luftfeuchte holen und speichern
  }
}

void HumidityOutside() // Loop für die Luftfeuchte "Outside"
{
  DHT.read22(DHT22_PIN); // DHT22_PIN einlesen
  float Humidity_Out = DHT.humidity; // Luftfeuchte in float Variable speichern
  if (Humidity_Out >= 0 && Humidity_Out <= 100)
  { // Erst speichern wenn Feuchtesensor plausieblen Wert zwischen 20 % und 90 % liefert
    lcd.print(Humidity_Out,0); // Luftfeuchte ohne Nachkommastelle anzeigen
    lcd.print("%"); // Text "%"
    temp_ho = Humidity_Out,0; // Innen - Luftfeuchte holen und speichern
  }
}

öhm, du müstest die variable "State" noch ändern in dem if- und dem else-block oder hab ich was falsch verstanden?
Logged

Offline Offline
Jr. Member
**
Karma: 1
Posts: 89
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo Megaionstorm,

danke für deine Antwort, aber ist es dann nicht so der Humidity_Inside zwar alle 2s aufgerufen wird, aber sonst hallt die ganze zeit Humidity_Outside?! Das wäre ja nicht so gewollt....Oder verstehe ich das falsch?

Logged

Offline Offline
Jr. Member
**
Karma: 1
Posts: 89
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Dachte so irgendwie:

Code:

int interval_in = 2000;
int interval_out = 2000;

void HumidityInside() // Loop für die Luftfeuchte "Inside"
{
  if((millis() - prev_in) > interval_in) { // Delay mit Millis damit der µC nach andere Dinge paralell abarbeiten kann
  prev_out = millis(); // Aktuelle millis Zeit in "prev" speichern
  DHT.read11(DHT11_PIN); // DHT11_i_PIN einlesen
  float Humidity_In = DHT.humidity; // Luftfeuchte in float Variable speichern
  if (Humidity_In >= 20 && Humidity_In <= 90){ // Erst speichern wenn Feuchtesensor plausieblen Wert zwischen 20 % und 90 % liefert
    lcd.print(Humidity_In,0); // Luftfeuchte ohne Nachkommastelle anzeigen
    lcd.print("%"); // Text "%"
    temp_hi = Humidity_In,0; // Innen - Luftfeuchte holen und speichern
   }
  }
}

void HumidityOutside() // Loop für die Luftfeuchte "Inside"
{
  if((millis() - prev_out) > interval_out) { // Delay mit Millis damit der µC nach andere Dinge paralell abarbeiten kann
  prev_in = millis(); // Aktuelle millis Zeit in "prev" speichern
  DHT.read22(DHT22_PIN); // DHT11_o_PIN einlesen
  float Humidity_Out = DHT.humidity; // Luftfeuchte in float Variable speichern
  if (Humidity_Out >= 0 && Humidity_Out <= 100){ // Erst speichern wenn Feuchtesensor plausieblen Wert zwischen 20 % und 90 % liefert
    lcd.print(Humidity_Out,0); // Luftfeuchte ohne Nachkommastelle anzeigen
    lcd.print("%"); // Text "%"
    temp_ho = Humidity_Out,0; // Innen - Luftfeuchte holen und speichern
    }
  }
}
Logged

0
Offline Offline
Edison Member
*
Karma: 20
Posts: 1980
Wo ein Wille ist, da ist auch ein Weg !
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Das Programm sollte eigentlich so funktionieren das der DHT11 und der DHT22 abwechselnd alle 2 Sekunden abgefragt werden.

Code:
void loop()
{
  unsigned long currentMillis = millis();
  if(currentMillis - previousMillis > interval) {
    previousMillis = currentMillis;  
    if (State == LOW)
    {
      HumidityInside();
      State = HIGH;
    }
      else
      {
        HumidityOutside();
        State = LOW;
      }
  }
}

Kleine Korrektur !
« Last Edit: July 06, 2012, 01:59:46 pm by Megaionstorm » Logged

Mein Arduino Projekte Blog:
http://ardu-megatank.blogspot.de/

Offline Offline
Jr. Member
**
Karma: 1
Posts: 89
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi,

sorry aber das klappt irgendwie nicht wirklich.  smiley-cry

Ich könnt kotzen.....habe grad auch gesehen das folgendes passiert: Wenn ich einen Sensor rausziehe, nimmt er automatisch den Wert des noch verfügbaren Sensors an (im Display)..... ebenso wenn ich es mit dem anderen mache. Habe den DHT11 & DHT22 im Einsatz inkl. 100nF pro Sensor. Das ganze mit dem verzögern beim Auslesen rührt daher das die Sensoren als flasche werte angezeigt haben. Und ich nachgelesen habe das die Sensoren mindestens 2s pause benötigen..... 
Logged

0
Offline Offline
Edison Member
*
Karma: 20
Posts: 1980
Wo ein Wille ist, da ist auch ein Weg !
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Benutzt Du die Adafruit Library für den DHT ?
Logged

Mein Arduino Projekte Blog:
http://ardu-megatank.blogspot.de/

Offline Offline
Jr. Member
**
Karma: 1
Posts: 89
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi,

nein ich benutze diese http://arduino.cc/playground/Main/DHTLib
Logged

0
Offline Offline
Edison Member
*
Karma: 20
Posts: 1980
Wo ein Wille ist, da ist auch ein Weg !
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Habe in der Adafruit Library folgenden Hinweis gefunden:

// Connect pin 1 (on the left) of the sensor to +5V
// Connect pin 2 of the sensor to whatever your DHTPIN is
// Connect pin 4 (on the right) of the sensor to GROUND
// Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor

Hast Du schon einmal das Testprogramm aus dem Playground ausprobiert ?
« Last Edit: July 06, 2012, 03:24:33 pm by Megaionstorm » Logged

Mein Arduino Projekte Blog:
http://ardu-megatank.blogspot.de/

Offline Offline
Jr. Member
**
Karma: 1
Posts: 89
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ja, der 10k ist bei beiden drin. Zwischen Vcc und GND noch einen 100nF und Pin3 des Sensors zusätzlich auf GND gelegt. Ich poste mal meinen gesamten Code morgen. OK?
Logged

0
Offline Offline
Edison Member
*
Karma: 20
Posts: 1980
Wo ein Wille ist, da ist auch ein Weg !
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Der komplette Code wird wohl am hilfreichsten sein !
Logged

Mein Arduino Projekte Blog:
http://ardu-megatank.blogspot.de/

Offline Offline
Jr. Member
**
Karma: 1
Posts: 89
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Sodele,

hier mal mein gesamten Code. Ich versuche grad den Fehler zu reproduzieren. Leider ist es mir nicht gelungen es zuverlässig zu reproduzieren. Was ich bereits herausgefunden habe ist: Wenn ich die Min oder Max Taste "Rechtzeitig" drücke, passiert wieder dieser Fehler. Allerdings kann ich nicht sagen ob der Fehler während der normalen Anzeige kommt. Ich habe das gefühl das es nur dann passiert wenn ich die Min/Max Werte abrufe......Also nochmals der detailierter Fehler: Es wird die ganze Zeit die Temperatur und Luftfeuchte im Display angezeigt. Innenluftfeuchte kommt vom DHT11 und Aussen vom DHT22. Beide sind mit 100nF & 10k wie vorgesehen, beschaltet. Tempereturen werden von DS18B20 geliefert. Ab und an, wenn man die Min / Max Taste drückt, wird / wurde ein falscher Min / Max Wert gespeichert. Oder zumindest wird es dann erst sichtbar..... Mir ist bewusst das die Sensoren schwanken können, aber wenn ich Momentan im Raum ca. 60% Luftfeuchte habe, und ich dann die Taste drücke, zeigt er mir an, das ich z.B. 30% Luftfeuchte hatte.... Mir ist es schleierhaft wie diese ernormen Abweichungen zu stande kommen, gehe jedoch von aus das die Sensoren (DHT11 & 22) zu oft, oder zu schnell ausgelesen werden, oder durch irgendwas anderes gestört werden beim auslesen....also z.B. die Interrupt vom DCF oder die Abfrage der DS18B20.

Bevor ich es vergesse, dieser 1001ste Thermometer funktioniert geauso wie ich es haben möchte, bis auf den beschriebenen Fehler. Ebenso die kurz aufeinander folgende aufrufe des Befehls "sensors.requestTemperatures();" sind absicht....Hoffe das jemand den Fehler im Code sieht..... smiley-confuse
Logged

Offline Offline
Jr. Member
**
Karma: 1
Posts: 89
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hier der Code Teil 1:
Code:
// Hier werden die verwendete "Librarys" eingebunden
#include <OneWire.h> // OneWire Library (Nötig für den Bus an dem die DS18B20 hängen)
#include <DallasTemperature.h> // Dallas Library für die DS18B20
#include <LiquidCrystal.h> // LCD Library
#include <dht.h> // DHT11 Library (Für Feuchtesensor nötig)
#include <DCF77.h> // DCF77 Library für Pollin DCF Modul
#include <Utils.h> // Wird vom der DCF77 Library benötigt
#include <Time.h> // Time Library

// Initialisierung der Pins und Werte
int ledPin = 9; // Hier ist der NPN Transistor BC547 über 1k5 Ohm an der Basis angeschlossen
int analogPin = 0; // Am AnalogPin 0 ist der LDR (RS-Online Bestell Nr.: 596-141) über ein Spg. Teiler angeschlossen. 5V --> 100k --> A0 --> LDR --> GND
int val = 0; // LDR Wert wird erstmal auf 0 gesetzt
int fadeValue = 200; // Initialisierungs PWM Wert (78,43%) für Backlight
const int analogPin1 = 16; // Min. Temp. Taster auf Pin 16
const int analogPin2 = 17; // Max. Temp. Taster auf Pin 17
const int analogPin3 = 15; // Uhrzeit Taster auf Pin 15
const int analogPin4 = 18; // HilfsPin für LCD Pin D7
int interval = 10000; // Intervalzeit für Temperaturabfrage (10s)
int interval_in = 4000;
int interval_out = 3000;
unsigned long prev; // Variable "prev" wird als "unsigned long" deklariert
unsigned long prev_in;
unsigned long prev_out;
int tempupdate = 0; // Tempupdate Variable mit 0 initialisieren
float temp_ti_min = 100; // Min. Temp. Inside mit 100 initialisieren (Trick damit geupdated wird.)
float temp_hi_min = 100; // Min. Hum. Inside mit 100 initialisieren (Trick damit geupdated wird.)
float temp_to_min = 100; // Min. Temp. Outside mit 100 initialisieren (Trick damit geupdated wird.)
float temp_ho_min = 100; // Min. Hum. Outside mit 100 initialisieren (Trick damit geupdated wird.)
float temp_ti_max = 0; // Max. Temp. Inside mit 0 initialisieren
float temp_hi_max = 0; // Max. Hum. Inside mit 0 initialisieren
float temp_to_max = 0; // Max. Temp. Outside mit 0 initialisieren
float temp_ho_max = 0; // Max. Hum. Outside mit 0 initialisieren
float temp_ti = 0; // Temp. Inside mit 0 initialisieren
float temp_hi = 0; // Hum. Inside mit 0 initialisieren
float temp_to = 0; // Temp. Outside mit 0 initialisieren
float temp_ho = 0; // Hum. Outside mit 0 initialisieren
int buttonState = 0; // Status Variable für die Buttons
int buttonState2 = 0; // Status Variable für die Buttons
int buttonStateClock = LOW; // ButtonStateClock mit "LOW" initialisieren
int lastbuttonStateClock = LOW; //LastButtonStateClock mit "LOW" initialisieren
int lastbuttonStateClock2 = LOW; // LastButtonStateClock2 mit "LOW" initialisieren
int buttonCount = 1; // Button Counter (Initialisierung mit 1 weil kein PullDown am Pin)
int screen = 0; // Screen 0 setzten (Temperaturanzeige)
long lastDebounceTime = 0; // DebounceTime auf 0 setzten
long debounceDelay = 100; // Entprellzeit (in ms) für Button

// Pollin DCF77 Modul Artikelnr.: 810054
#define DCF_PIN 2 // DCF Data Pin auf Arduino Pin 2
#define DCF_INTERRUPT 0 // Interrupt für Pin 2

time_t time; // Time Library starten
DCF77 DCF = DCF77(DCF_PIN,DCF_INTERRUPT); // DCF77 Library starten

// Der OneWire Bus für DS18B20 hängt an Pin 8
#define ONE_WIRE_BUS 8

// LCD wird mit folgenden Pins initialisiert
LiquidCrystal lcd(1, 0, 5, 4, 3, 18);

// Errichtet eine Instanz um mit anderen OneWire Geräten zu kommunizieren zu können
OneWire oneWire(ONE_WIRE_BUS);

// Verweis das die Dallas Temperatur Sensoren am OneWire Bus dran sind
DallasTemperature sensors(&oneWire);

// DHT Library starten
dht DHT;
// Definiere Pin für Innen- und Aussen Feuchtesensor
#define DHT11_PIN 6 // Innensensor
#define DHT22_PIN 7 // Aussensensor


// Die DS18B20 Sensoren werden per Seriennummer "Hard" gecoded
// Hier gibt es ein Tutorial wie man an die Seriennummer kommt:
// http://www.hacktronics.com/Tutorials/arduino-1-wire-address-finder.html

// Seriennummer der verwendeten Dallas DS18B20 Sensoren
DeviceAddress insideThermometer = {
  0x28, 0x26, 0xD5, 0xD1, 0x03, 0x00, 0x00, 0xFC }; // Seriennummer für den "insideThermometer"
DeviceAddress outsideThermometer = {
  0x28, 0x6D, 0xF0, 0xD1, 0x03, 0x00, 0x00, 0x5B }; // Seriennummer für den "outsideThermometer"

// Zeichentabelle für "Eigene" Zeichen
// Um eigene Zeichen zu erstellen kann die Seite verwendet werden:
// http://www.quinapalus.com/hd44780udg.html

// Zeichen "haken"
byte haken[8] = {
  B00000, // Zeile 1
  B00001, // Zeile 2
  B00011, // Zeile 3
  B10110, // Zeile 4
  B11100, // Zeile 5
  B01000, // Zeile 6
  B00000, // Zeile 7
  B00000, // Zeile 8
};

// Zeichen "update"
byte update[8] = {
  B00000, // Zeile 1
  B00100, // Zeile 2
  B00100, // Zeile 3
  B01110, // Zeile 4
  B01110, // Zeile 5
  B11111, // Zeile 6
  B11111, // Zeile 7
  B00000, // Zeile 8
};

// Zeichen "del"
byte del[8] = {
  B00000, // Zeile 1
  B00000, // Zeile 2
  B00000, // Zeile 3
  B00000, // Zeile 4
  B00000, // Zeile 5
  B00000, // Zeile 6
  B00000, // Zeile 7
  B00000, // Zeile 8
};


void setup(void) // Setup wird einmalig durchlaufen
{
  pinMode(ledPin, OUTPUT); // ledPin 13 (Backlight Ansteuerung per NPN Transistor (BC547)) wird als Ausgang deklariert
  analogWrite(ledPin, 200); // Schreibe ein PWM Wert von 200 (78,43%) als Initialwert für Backlight
  pinMode(analogPin1, INPUT); // analogPin1 (Min. Temp. Taster) wird als Eingang deklariert
  pinMode(analogPin2, INPUT); // analogPin2 (Max. Temp. Taster) wird als Eingang deklariert
  pinMode(analogPin3, INPUT); // analogPin3 (Umschaltaster Uhrzeit / Temp-Feuchte)
  pinMode(analogPin4, OUTPUT); // analogPin4 (Hilfs Pin für LCD)
  prev = millis(); // Millis (Zeit seitdem der µC läuft) wird in Variable "prev" geschrieben
  prev_in = millis();
  prev_out = millis();
  sensors.begin(); // Sensoren (DS18B20) initialisieren
  sensors.setResolution(insideThermometer, 12); // Auflösung des Wertebereichs auf 12 bit
  sensors.setResolution(outsideThermometer, 12); // Auflösung des Wertebereichs auf 12 bit
  lcd.begin(20,4); // LCD initialisieren und auf 20 Zeichen, 4 Zeilen setzten
  lcd.clear(); // Alles auf LCD löschen
  DCF.Start(); // DCF starten
  
  // Hier werden "Eigene" Zeichen aus den "byte" (vor der setup deklariert) für das Display erstellt
  
  lcd.createChar(0, haken); // Erstellt Zeichen "haken" und kann über // lcd.print(char(0)); // im Programm jederzeit aufgerufen werden
  lcd.createChar(1, update); // Erstellt Zeichen "update" und kann über // lcd.print(char(1)); // im Programm jederzeit aufgerufen werden
  lcd.createChar(2, del); // Erstellt Zeichen "del" und kann über // lcd.print(char(2)); // im Programm jederzeit aufgerufen werden

  // Screen 1
  lcd.setCursor(2,1); // Cursorbeginn auf Zeichen 2, Zeile 2
  lcd.print("Found "); // Text "Found "
  lcd.print(sensors.getDeviceCount(), DEC); // DEC gibt die Anzahl der gefundenen Sensoren aus
  //Entscheidung ob "sensor" oder "sensors" ausgegeben wird
  if (sensors.getDeviceCount() == 2) {
    lcd.print(" sensors"); // gibt bei 2 Sensoren "sensors" aus
  }
  else {
    lcd.print(" sensor"); // gibt bei 1 Sensor "sensor" aus
  }
  
  // Hier werden die Haken dargestellt
  if (sensors.getDeviceCount() == 1) { // Hier wird die Anzahl der Sensoren geholt
    lcd.setCursor(2,2); // Cursorbeginn auf Zeichen 2, Zeile 3
    lcd.print(char(0)); // Zeichne "Haken"
  }
  if (sensors.getDeviceCount() == 2) { // Hier wird die Anzahl der Sensoren geholt
    lcd.setCursor(2,2); // Cursorbeginn auf Zeichen 2, Zeile 3
    lcd.print(char(0)); // Zeichne "Haken"
    lcd.setCursor(3,2); // Cursorbeginn auf Zeichen 3, Zeile 3
    lcd.print(char(0)); // Zeichne "Haken"
  }
  delay(2000); // Anzeige für 2s darstellen
  lcd.clear(); // Alles auf LCD löschen

  //Screen 2 (Initialscreen für Loop Schleife)
  lcd.setCursor(0, 0); // Cursorbeginn auf Zeichen 0, Zeile 1
  lcd.print("Wohnzimmer:"); // Text "Wohnzimmer:"
  lcd.setCursor(0, 2); // Cursorbeginn auf Zeichen 0, Zeile 3
  lcd.print("Aussen:"); // Text "Aussen:"
  sensors.requestTemperatures(); // Temp Werte holen lassen
  lcd.setCursor(10, 1); // Cursorbeginn auf Zeichen 6, Zeile 2
  InTemperature(); //Ausgabe des Temp. Wertes vom "InTemperature"
  lcd.setCursor(17, 1); // Cursorbeginn auf Zeichen 13, Zeile 2
  HumidityInside(); // Ausgabe der Luftfeuchte vom "HumidityInside"
  lcd.setCursor(10, 3); // Cursorbeginn auf Zeichen 6, Zeile 2
  OutTemperature(); //Ausgabe des Temp. Wertes vom "OutTemperature"
  lcd.setCursor(17, 3); // Cursorbeginn auf Zeichen 13, Zeile 2
  HumidityOutside(); // Ausgabe der Luftfeuchte vom "HumidityInside"
}
Logged

Offline Offline
Jr. Member
**
Karma: 1
Posts: 89
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Teil 2:

Code:
void InTemperature() // Einlese Loop die DS18B20 Sensoren
{
  float tempC = sensors.getTempC(insideThermometer); // Temp. Werte werden mit Float in einer Anhängigkeit der Sensor Seriennummer gespeichert.
  if (tempC == -127.00) { // Wenn Temp. Sensor Wert "-127.00"
    lcd.print("NoDev."); // wird der Text "NoDev." ausgegeben
    if (tempC == 85.00) { // Wenn Temp. Sensor Wert "85.00"
      lcd.print("Error"); // wird "Error " ausgegeben
    }
  }
  else if (tempC < 0.0){ // Wenn Temp. < 0.0°C
    if (tempC <= -10.0){ // Wenn Temp. <= -10.0°C
      lcd.setCursor(7,1); // Cursorbeginn auf Zeichen 8, Zeile 2
      lcd.print("  "); // Text " "
      lcd.setCursor(9,1); // Cursorbeginn auf Zeichen 9, Zeile 2
    }
    else {
      lcd.setCursor(8,1); // Cursorbeginn auf Zeichen 9, Zeile 2
      lcd.print("  "); // Text " "
      lcd.setCursor(10,1); // Cursorbeginn auf Zeichen 10, Zeile 2
    }
  }
  else if (tempC < 10.0){ // Wenn Temp. < 10.0°C
    lcd.setCursor(9,1); // Cursorbeginn auf Zeichen 10, Zeile 2
    lcd.print("  "); // Text " "
    lcd.setCursor(11,1); // Cursorbeginn auf Zeichen 11, Zeile 2
  }
  else { // Sonst normale Ausgabe
    lcd.setCursor(8,1); // Cursorbeginn auf Zeichen 10, Zeile 4
    lcd.print("  "); // Text " "
    lcd.setCursor(10,1); // Cursorbeginn auf Zeichen 10, Zeile 2
  }
  temp_ti = tempC,1; // Aktuelle Temp. in Variable temp_ti schreiben
  lcd.print(tempC,1); // Schreibe Temperatur mit nur 1 Nachkommastelle (,1)
  lcd.print(char(223)); // Erstelle mit char(223) das ° Zeichen
  lcd.print("C "); // Text "C "
}

void OutTemperature() // Einlese Loop die DS18B20 Sensoren
{
  float tempC = sensors.getTempC(outsideThermometer); // Temp. Werte werden mit Float in einer Anhängigkeit der Sensor Seriennummer gespeichert.
  if (tempC == -127.00) { // Wenn Temp. Sensor Wert "-127.00"
    lcd.print("NoDev."); // wird der Text "NoDev." ausgegeben
    if (tempC == 85.00) { // Wenn Temp. Sensor Wert "85.00"
      lcd.print("Error"); // wird "Error " ausgegeben
    }
  }
  else if (tempC < 0.0){ // Wenn Temp. < 0.0°C
    if (tempC <= -10.0){ // Wenn Temp. <= -10.0°C
      lcd.setCursor(7,3); // Cursorbeginn auf Zeichen 8, Zeile 4
      lcd.print("  "); // Text " "
      lcd.setCursor(9,3); // Cursorbeginn auf Zeichen 9, Zeile 4
    }
    else {
      lcd.setCursor(8,3); // Cursorbeginn auf Zeichen 9, Zeile 4
      lcd.print("  "); // Text " "
      lcd.setCursor(10,3); // Cursorbeginn auf Zeichen 6, Zeile 4
    }
  }
  else if (tempC < 10.0){ // Wenn Temp. < 10.0°C
    lcd.setCursor(9,3); // Cursorbeginn auf Zeichen 10, Zeile 4
    lcd.print("  "); // Text " "
    lcd.setCursor(11,3); // Cursorbeginn auf Zeichen 11, Zeile 4
  }
  else { // Sonst normale Ausgabe
    lcd.setCursor(8,3); // Cursorbeginn auf Zeichen 10, Zeile 4
    lcd.print("  "); // Text " "
    lcd.setCursor(10,3); // Cursorbeginn auf Zeichen 10, Zeile 4
  }
  temp_to = tempC,1; // Aktuelle Temp. in Variable temp_to schreiben
  lcd.print(tempC,1); // Schreibe Temperatur mit nur 1 Nachkommastelle (,1)
  lcd.print(char(223)); // Erstelle mit char(223) das ° Zeichen
  lcd.print("C "); // Text "C "
}

void HumidityInside() // Loop für die Luftfeuchte "Inside"
{
  if((millis() - prev_in) > interval_in) { // Delay mit Millis damit der µC nach andere Dinge paralell abarbeiten kann
  prev_in = millis(); // Aktuelle millis Zeit in "prev" speichern
  DHT.read11(DHT11_PIN); // DHT11_i_PIN einlesen
  float Humidity_In = DHT.humidity; // Luftfeuchte in float Variable speichern
  if (Humidity_In >= 20 && Humidity_In <= 90){ // Erst speichern wenn Feuchtesensor plausieblen Wert zwischen 20 % und 90 % liefert
    lcd.print(Humidity_In,0); // Luftfeuchte ohne Nachkommastelle anzeigen
    lcd.print("%"); // Text "%"
    temp_hi = Humidity_In,0; // Innen - Luftfeuchte holen und speichern
   }
  }
}

void HumidityOutside() // Loop für die Luftfeuchte "Inside"
{
  if((millis() - prev_out) > interval_out) { // Delay mit Millis damit der µC nach andere Dinge paralell abarbeiten kann
  prev_out = millis(); // Aktuelle millis Zeit in "prev" speichern
  DHT.read22(DHT22_PIN); // DHT11_o_PIN einlesen
  float Humidity_Out = DHT.humidity; // Luftfeuchte in float Variable speichern
  if (Humidity_Out >= 0 && Humidity_Out <= 100){ // Erst speichern wenn Feuchtesensor plausieblen Wert zwischen 20 % und 90 % liefert
    lcd.print(Humidity_Out,0); // Luftfeuchte ohne Nachkommastelle anzeigen
    lcd.print("%"); // Text "%"
    temp_ho = Humidity_Out,0; // Innen - Luftfeuchte holen und speichern
    }
  }
}
Logged

Pages: [1] 2   Go Up
Jump to: