Main Content

Diese Seite wurde mithilfe maschineller Übersetzung übersetzt. Klicken Sie hier, um die neueste Version auf Englisch zu sehen.

Feuchtigkeitssensor unter Verwendung von HTTP-POST-Anfragen an den Kanal

Dieses Beispiel zeigt, wie Sie von einem Gerät, das aus dem Tiefschlaf erwacht, mehrere Datenfelder auf einem ThingSpeak™ -Kanal veröffentlichen. Sie lesen einen Bodenfeuchtigkeitssensor aus und veröffentlichen den Wert auf einem ThingSpeak Kanal. Die HTTP-POST-Anfrage wird durch Schreiben an einen Kommunikationsclient ohne separate Bibliothek ausgeführt. Das direkte Schreiben der HTTP-Anfrage an den drahtlosen Netzwerk-Client kann gegenüber der ThingSpeak Kommunikationsbibliothek eine höhere Flexibilität und Geschwindigkeit bieten.

Unterstützte Hardware

  • ESP8266-12

  • NodeMCU ESP8266-12

  • Arduino mit Ethernet- oder WLAN-Verbindung (mit einigen Code-Anpassungen)

In diesem Beispiel liest der integrierte ADC einen Feuchtigkeitssensor und sendet den Wert und die verstrichene Zeit an zwei Felder eines ThingSpeak Kanals. Sie können den POST so ändern, dass bis zu acht Felder mit Daten gefüllt werden.

Dieses Bild zeigt eine Büroanlage mit einem Feuchtigkeitssensor, der an einen NodeMCU ESP8266-12 angeschlossen ist. Die NodeMCU stellt eine drahtlose Netzwerkverbindung bereit. Der Feuchtigkeitssensor wird über einen Datenpin auf der Platine mit Strom versorgt, wodurch die Einschaltdauer des Sensors begrenzt wird. Dieses Design reduziert den Stromverbrauch und verlängert die Lebensdauer des Sensors. Zwischen den Messungen wird das gesamte Gerät in den Tiefschlafmodus versetzt, um Strom zu sparen. Sobald Daten im Kanal gepostet wurden, können Sie Reaktionen auf die Daten einrichten. Beispielsweise können Sie die React-App so einstellen, dass sie Sie benachrichtigt, wenn der Feuchtigkeitsgehalt niedrig ist.

Voraussetzungen

1) Erstellen Sie einen ThingSpeak Kanal, wie in Collect Data in a New Channel gezeigt.

2) Aktivieren Sie auf der Registerkarte „Kanaleinstellungen“ das Feld 1. Sie können einen informativen Feldnamen angeben, z. B. Moisture Value.

3) Notieren Sie sich den Schreib-API-Schlüssel auf der Registerkarte „API-Schlüssel“. Sie benötigen diesen Wert im Code, der zur Programmierung Ihres Geräts verwendet wird. Weitere Informationen finden Sie unter Channel Configurations und Channel Properties.

Erforderliche Hardware

  • ESP8266-basiertes Board oder Arduino-Board mit Internetverbindung (NodeMCU ESP8266-12E wird für diese Demonstration verwendet)

  • Bodenfeuchtigkeitssensor (z. B. Sparkfun Moisture Sensor)

  • Überbrückungskabel (mindestens 4)

  • USB-Kabel

Schema und Verbindungen

1) Verbinden Sie VCC des Feuchtigkeitssensors mit Pin D7 am NodeMCU.

2) Verbinden Sie den Sensor-Gnd mit der NodeMCU-Masse.

3) Verbinden Sie den Sig-Pin des Sensors mit dem NodeMCU-Pin A0.

4) Verbinden Sie den NodeMCU-Rst-Pin mit dem NodeMCU-Pin D0, um das Aufwachen aus dem Tiefschlaf zu ermöglichen.

Programmieren Sie Ihr Gerät

1) Laden Sie die neueste Arduino® IDE herunter.

2) Fügen Sie das ESP8266-Board-Paket hinzu.

a) Geben Sie https://arduino.esp8266.com/stable/package_esp8266com_index.json in „Zusätzliche Board Manager-URLs“ unter „Datei“ > „Einstellungen“ ein.

b) Wählen Sie „Extras“ > „Boards“ > „Board-Manager“. Suchen Sie in der Suchleiste nach ESP8266 und installieren Sie das Paket.

3) Wählen Sie den entsprechenden Port und die entsprechende Platine in der Arduino IDE aus. Die zum Generieren dieses Beispiels verwendete Hardware verwendete die Option Node MCU 1.0 (ESP 8266–12E) .

4) Erstellen Sie die Anwendung: Öffnen Sie ein neues Fenster in der Arduino IDE und speichern Sie die Datei. Fügen Sie den im Abschnitt „Code“ bereitgestellten Code hinzu. Stellen Sie sicher, dass Sie die Informationen zum drahtlosen Netzwerk und den API-Schlüssel im Code bearbeiten.

5) Nachdem Sie Ihr Programm erfolgreich hochgeladen haben, können Sie die Ausgabe über den seriellen Monitor oder Ihre Kanalansichtsseite überwachen.

Code

1) Binden Sie die ESP8266WiFi- Bibliothek ein und initialisieren Sie Variablen für Hardware und Datenerfassung. Bearbeiten Sie die Netzwerkinformationen und schreiben Sie den API-Schlüssel in Ihren Code.

#include <ESP8266WiFi.h>

// Network information.
#define WIFI_NAME "YOUR_WIFI_NAME"
#define PASSWORD "WIFI_PASSWORD"

// Hardware information.
#define SENSOR_POWER 13                            // Connect the power for the soil sensor here.
#define SOIL_PIN A0                                // Connect the sensor output pin here.
#define TIMEOUT  5000                              // Timeout for server response.
#define SLEEP_TIME_SECONDS 1800

// ThingSpeak information.
#define NUM_FIELDS 2                               // To update more fields, increase this number and add a field label below.
#define SOIL_MOISTURE_FIELD 1                      // ThingSpeak field for soil moisture measurement.
#define ELAPSED_TIME_FIELD 2                       // ThingSpeak field for elapsed time from startup.
#define THING_SPEAK_ADDRESS "api.thingspeak.com"
String writeAPIKey="XXXXXXXXXXXXXXXX";             // Change this to the write API key for your channel.

// Global variables. 
int numMeasure = 5;                                // Number of measurements to average.
int ADCValue = 0;                                  // Moisture sensor reading.
                         
WiFiClient client;

2) Starten Sie in der Funktion setup den seriellen Monitor, stellen Sie eine Verbindung zum drahtlosen Netzwerk her und initialisieren Sie die von Ihnen verwendeten Gerätepins.

// Put your setup code here, to run once:
void setup()
{
    Serial.begin( 115200 );   // You may need to adjust the speed depending on your hardware.
    connectWifi();
    pinMode( SENSOR_POWER , OUTPUT );
    digitalWrite( SENSOR_POWER , LOW );   // Set to LOW so no power is flowing through the sensor.
}

3) Lesen Sie in der Hauptschleife den Bodenmonitor aus und speichern Sie ihn im Array data . POSTEN Sie die Daten an ThingSpeak und versetzen Sie das Gerät dann in den Energiesparmodus.

// Put your main code here, to run repeatedly:
void loop()
{
    // Write to successive fields in your channel by filling fieldData with up to 8 values.
    String fieldData[ NUM_FIELDS ];  

    // You can write to multiple fields by storing data in the fieldData[] array, and changing numFields.        
    // Write the moisture data to field 1.
    fieldData[ SOIL_MOISTURE_FIELD ] = String( readSoil( numMeasure ) ); 
    Serial.print( "Soil Moisture = " );
    Serial.println( fieldData[ SOIL_MOISTURE_FIELD ] );
    
    // Write the elapsed time from startup to Field 2.
    fieldData[ ELAPSED_TIME_FIELD ] = String( millis() ); 
    
    HTTPPost( NUM_FIELDS , fieldData );
    
    delay( 1000 );
    Serial.print( "Goodnight for "+String( SLEEP_TIME_SECONDS ) + " Seconds" );
    ESP.deepSleep( SLEEP_TIME_SECONDS * 1000000 );
    // If you disable sleep mode, add delay so you don't post to ThingSpeak too often.
    // delay( 20000 );
}

4) Verwenden Sie die Funktion readSoil , um den Sensor mit Strom zu versorgen, und lesen Sie dann die Spannung am Ausgang mithilfe des ADC ab. Schalten Sie nach der Messung den Strom aus.

// This function reads the soil moisture sensor numAve times and returns the average.
long readSoil(int numAve)
{
  long ADCValue = 0;
  
  for ( int i = 0; i < numAve; i++ ) {
    digitalWrite( SENSOR_POWER, HIGH );  // Turn power to device on.
    delay(10);    // Wait 10 milliseconds for sensor to settle.
    ADCValue += analogRead( SOIL_PIN );     // Read the value from sensor.
    digitalWrite( SENSOR_POWER, LOW );   // Turn power to device off.
  }
  
  ADCValue = ADCValue / numAve;
  return ADCValue;                    // Return the moisture value.
}

5) Verbinden Sie Ihr Gerät mit der Funktion connectWiFi mit dem drahtlosen Netzwerk.

// Connect to the local Wi-Fi network
int connectWifi()
{
    
    while (WiFi.status() != WL_CONNECTED) {
        WiFi.begin( WIFI_NAME , PASSWORD );
        Serial.println( "Connecting to Wi-Fi" );
        delay( 2500 );
    }
    Serial.println( "Connected" );  // Inform the serial monitor.
}

6) Erstellen Sie die Datenzeichenfolge, die Sie auf Ihrem Kanal veröffentlichen möchten. Stellen Sie eine Verbindung zu ThingSpeak her und verwenden Sie den Wi-Fi-Client, um einen HTTP-POST durchzuführen.

// This function builds the data string for posting to ThingSpeak
    // and provides the correct format for the wifi client to communicate with ThingSpeak.
    // It posts numFields worth of data entries, and takes the
    // data from the fieldData parameter passed to it. 
  
int HTTPPost( int numFields , String fieldData[] ){
  
    if (client.connect( THING_SPEAK_ADDRESS , 80 )){

       // Build the postData string.  
       // If you have multiple fields, make sure the sting does not exceed 1440 characters.
       String postData= "api_key=" + writeAPIKey ;
       for ( int fieldNumber = 1; fieldNumber < numFields+1; fieldNumber++ ){
            String fieldName = "field" + String( fieldNumber );
            postData += "&" + fieldName + "=" + fieldData[ fieldNumber ];
            
            }

        // POST data via HTTP.
        Serial.println( "Connecting to ThingSpeak for update..." );
        Serial.println();
        
        client.println( "POST /update HTTP/1.1" );
        client.println( "Host: api.thingspeak.com" );
        client.println( "Connection: close" );
        client.println( "Content-Type: application/x-www-form-urlencoded" );
        client.println( "Content-Length: " + String( postData.length() ) );
        client.println();
        client.println( postData );
        
        Serial.println( postData );
        
        String answer=getResponse();
        Serial.println( answer );
    }
    else
    {
      Serial.println ( "Connection Failed" );
    }
    
}

7) Warten Sie mit getResponse auf die Antwort vom Server und empfangen Sie diese.

// Wait for a response from the server indicating availability,
// and then collect the response and build it into a string.

String getResponse(){
  String response;
  long startTime = millis();

  delay( 200 );
  while ( client.available() < 1 && (( millis() - startTime ) < TIMEOUT ) ){
        delay( 5 );
  }
  
  if( client.available() > 0 ){ // Get response from server.
     char charIn;
     do {
         charIn = client.read(); // Read a char from the buffer.
         response += charIn;     // Append the char to the string response.
        } while ( client.available() > 0 );
    }
  client.stop();
        
  return response;
}

Sie können den nützlichen Wertebereich bestimmen, indem Sie Ihren Kanal über Nass- und Trockenzyklen hinweg überwachen. Die vom ADC gelesene und an Ihren Kanal gesendete Zahl ist proportional zur Spannung und somit proportional zur Bodenfeuchtigkeit. Die Werte variieren je nach Temperatur, Luftfeuchtigkeit und Bodenart. Sobald Sie die Werte für trockenen Boden kennen, können Sie mit der React-App eine Benachrichtigung generieren, dass es Zeit ist, die Pflanze zu gießen. Weitere Informationen zum Einrichten von React finden Sie unter React App.

Externe Websites