Wetterstation

Hallo Gemeinde,

ich benötige mal euer Schwarmwissen.

Folgendes:

Ich habe mir mit einem Wemos D1 mini, DHT22, Solarpanel, Laderegler und Lipo eine Wetterstation aufgebaut.

läuft mit diesem Code einwandfrei:

/************************( Importieren der genutzten Bibliotheken )************************/
#include "ThingSpeak.h"
#include "RunningMedian.h"
#include <ESP8266WiFi.h>
#include "DHT.h"    

            

       
/********************( Definieren der Globale Variablen und Konstanten)********************/
float t;                                      // Variable zum Speichern der Temperatur
float h;                                      // Variable zum Speichern der Luftfeuchtigkeit
                          

#define DHTPIN 4          // Hier die Pin Nummer eintragen wo der Sensor angeschlossen ist
#define DHTTYPE DHT22     // Hier wird definiert was für ein Sensor ausgelesen wird. In 
DHT dht(DHTPIN, DHTTYPE); // unserem Beispiel möchten wir einen DHT11 auslesen, falls du 
                          // ein DHT22 hast einfach DHT22 eintragen


unsigned long ThingspeakLastLogTime = 0;
unsigned long SensorenLetzteAktualisierung;   // Hilfsvariable für Zeitmessung
int ThingspeakSampleTime = 30000;             // Die schnellste Sample Time ist 15s ich empfehle 
                                              // 60s zu verwenden oder 300 Sekunden 
                                              
int SensorenSampleTime = 1;                   // Zeit in s für Aktualisierung der
                                          
RunningMedian Mediant = RunningMedian(10);// Initialisieren von Median mit Anzahl Messwerten    
RunningMedian Medianh = RunningMedian(10);

WiFiClient  client;
int status = WL_IDLE_STATUS;
/**********************************(Thingspeak Eistellungen)*******************************/
unsigned long myChannelNumber = 123456;         // Deine ThingSpeak Kanal Nummer
const char * myWriteAPIKey = "API-Key"; // Dein ThingSpeak API Key

/************************************(Wifi Einstellungen)**********************************/
char ssid[] = "SSID";               // Deine Wlan SSID (name)
char pass[] = "Key";             // Dein Wlan Passwort

/*******************************************(setup)****************************************/
void setup() {

  WiFi.begin(ssid, pass);             // Wlan Aktivieren und mit definiertem Netzwerk verbinden
  ThingSpeak.begin(client);           // ThingSpeak Client starten
  
  Serial.begin(9600);                 // Serial Monitor starten
  Serial.println("DHT22 Testprogramm");
  dht.begin();                        // DHT11 Library  starten
}

/*************************************(Hauptprogramm)**************************************/
void loop() {

  if (millis() - SensorenLetzteAktualisierung > (SensorenSampleTime*1000)) {
    Mediant.add(dht.readTemperature()); // Messwert hinzufügen
    t = Mediant.getAverage();           // Mittelwert auslesen
    
    Medianh.add(dht.readHumidity());    // Messwert hinzufügen
    h = Medianh.getAverage();           // Mittelwert auslesen
  }
  
  
/*********************( Überprüfen ob alles richtig Ausgelesen wurde )*********************/ 
  if (isnan(h) || isnan(t)) {       
    Serial.println("Fehler beim auslesen des Sensors!");
    return;
  }

  // Nun senden wir die gemessenen Werte an den PC diese werden wir im Seriellem Monitor sehen
  Serial.print("Luftfeuchtigkeit: ");
  Serial.print(h);                  // Ausgeben der Luftfeuchtigkeit
  Serial.print("%\t");              // Tabulator
  Serial.print("Temperatur: ");
  Serial.print(t);                  // Ausgeben der Temperatur
  Serial.write('°');                // Schreiben des ° Zeichen
  Serial.println("C");
  SensorenLetzteAktualisierung=millis();  // Letzte Aktualisierung speichern
   MesswerteSenden();               // Funktion zum Senden der Messwerte aufrufen                  
   delay(2000);
}

/*********************(Funktion um Daten an Thingspeak zu senden)**************************/
void MesswerteSenden() {
  
  if (millis() - ThingspeakLastLogTime > ThingspeakSampleTime) {
    ThingSpeak.setField(1, t);
    ThingSpeak.setField(2, h);
    ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);
    ThingspeakLastLogTime = millis();
  }
}

Das ganze soll jetzt mit einem Battery Monitoring mit Spannungsteiler an A0 erweitert werden.
Die verkabelung usw sind klar. Nur der die Impletierung des neuen Codes gestaltet sich für mich als Hürde.

/*
 * Wemos battery shield, measure Vbat
 * add 100k between Vbat and ADC
 * Voltage divider of 100k+220k over 100k
 * gives 100/420k
 * ergo 4.2V -> 1Volt
 * Max input on A0=1Volt ->1023
 * 4.2*(Raw/1023)=Vbat
 */


#include <ESP8266WiFi.h>
unsigned int raw=0;
float volt=0.0;


void setup() {
  Serial.begin(115200);
  Serial.println("ESP8266 in normal mode");
  const char* ssid     = "YourSSID";
  const char* password = "YourPW";
  const char* host = "api.thingspeak.com";
  const char* writeAPIKey="YourAPIkey";
  // put your setup code here, to run once:
  pinMode(A0, INPUT);
  raw = analogRead(A0);
  volt=raw/1023.0;
  volt=volt*4.2;
//  Connect to WiFi network
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
  delay(500);
  }
  String v=String(volt);// change float into string
  // make TCP connections
  WiFiClient client;
  const int httpPort = 80;
  if (!client.connect(host, httpPort)) {
    return;
  }
  String url = "/update?key=";
  url += writeAPIKey;
  url += "&field3=";
  url += String(volt);
  url += "\r\n";
 
// Send request to the server
  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
                 "Host: " + host + "\r\n" +
                 "Connection: close\r\n\r\n");

 

void loop() {
  //all code is in the Setup
}

Diese 2 Codes müssten quasi zusammen ergänzt werden. Wie würde der fertige Code aussehen?

MfG

Pascal

Baumschubser:
Diese 2 Codes müssten quasi zusammen ergänzt werden. Wie würde der fertige Code aussehen?

Ok....und warum versuchst du das nicht selbst ?

Es dürfen keine doppelten Elemente (Funktionen, Variablen usw.) dabei vorkommen.

Wäre ja nicht so das ich es nicht versucht hätte.

Die Umsetzung beider Codes erweist sich für mich als Hürde.
Vielleicht ist ja hier der ein oder andere für den es ein Klacks ist das umzusetzen. Für mich ist das stundenlanges Versuche die nicht zum gewünschten Erfolg führen.

Baumschubser:
Wäre ja nicht so das ich es nicht versucht hätte.

Die Umsetzung beider Codes erweist sich für mich als Hürde.
Vielleicht ist ja hier der ein oder andere für den es ein Klacks ist das umzusetzen. Für mich ist das stundenlanges Versuche die nicht zum gewünschten Erfolg führen.

Ich habe doch beschrieben, wie es geht.

Mach es einfach und zeige dein Ergebnis.

Du wirst sehen, es werden viele helfen. Und das Beste, du lernst etwas daraus.

Wenn wir es machen, lernst du nix.

Hi

Der obere Sketch blockiert - alle 2 Sekunden wird irgend etwas gemacht, dann wieder für 2 Sekunden delay() ... SO wird Das Nichts.

Du musst die obere loop() quasi ausklammern und nur alle 2 Sekunden aufrufen - dann stört auch die serielle Ausgabe nicht.

oha - sehe gerade - mit den beiden Sketches hast Du eigentlich gar keine Probleme beim Zusammenführen ... ist halt blöd, daß der 2.te nur in setup() irgendwas ausführt - wenn Du also den Arduino nicht alle 2 Sekunden neu starten willst, solltest Du die Funktionalität von Sketch Nummer 2 in Dessen loop() bringen und Diese dort alle x Sekunden ausführen.

Nachtwächtererklärung (hier im Forum),FSM,Schrittkette,Endlicher Automat als Suchbegriffe.

MfG