WifiNINA.h Client und (Web)Server zeitgleich?

Hallo,

ich habe hier ein MKR 1010 und ein MKR ENV Shield.

Das klappt ganz gut, ich fand das Shield ganz interessant, auch wenn die Sensoren zu dicht aneinander gebaut sind.
Damit möchte ich im Garten messen und diese Daten an Thingspeak senden (mittels Thingspeak.h). Das klappt sehr gut.

Nun möchte ich aber auch gerne einen Schaltbefehl z. B. über ein Smartphone an den MKR 1010 senden und damit ein Magnetventil für Bewässerung manuell schalten. Die Arduino IoT Cloud hatte ich ausprobiert. Das klappt aber nicht ganz so solide. Dazu müsste ich auch bezahlen für alle Messwerte. Das ist mir bei dem Anschaffungspreis der beiden Boards zu viel.

Hat jmd. so etwas schon gemacht: Clientverbindungen zu Servern aufgebaut und zeitgleich einen Webserver gehostet?
Das ganze kann auch mit Zeitverzug laufen. Alternativ könnte ich zB bei einer anderen IoT Plattform eine Variable über mein Smartphone setzen und und diese dann über den MKR 1010 WifiNINA Client zyklisch abfragen.

Über Tipps würde ich mich freuen.

P.S.: Ich werde mal gucken, dass ich auch einen zweiten Thingspeak Channel anspreche, so kann ich dan mehr als nur 8 Sensoren pro Channel an Thingspeak senden.

Neben dem MKR ENV Shielt habe ich noch einen Bodenfeuchtesensor angeschlossen, den ich analog einlese. Es kommen nach ein paar I2C Temperatur Sensoren.

Vielen Dank!

n/*
  WriteMultipleFields

  Description: Writes values to fields 1,2,3,4 and status in a single ThingSpeak update every 20 seconds.

  Hardware: Arduino MKR WiFi 1010

  !!! IMPORTANT - Modify the secrets.h file for this project with your network connection and ThingSpeak channel details. !!!

  Note:
  - Requires WiFiNINA library
  - This example is written for a network using WPA encryption. For WEP or WPA, change the WiFi.begin() call accordingly.

  ThingSpeak ( https://www.thingspeak.com ) is an analytic IoT platform service that allows you to aggregate, visualize, and
  analyze live data streams in the cloud. Visit https://www.thingspeak.com to sign up for a free account and create a channel.

  Documentation for the ThingSpeak Communication Library for Arduino is in the README.md folder where the library was installed.
  See https://www.mathworks.com/help/thingspeak/index.html for the full ThingSpeak documentation.

  For licensing information, see the accompanying license file.

  Copyright 2020, The MathWorks, Inc.
*/

#include <WiFiNINA.h>
#include <Arduino_MKRENV.h>
#include "secrets.h"
#include "ThingSpeak.h" // always include thingspeak header file after other header files and custom macros
#define LED1 5


char ssid[] = SECRET_SSID;   // your network SSID (name)
char pass[] = SECRET_PASS;   // your network password
int keyIndex = 0;            // your network key Index number (needed only for WEP)
WiFiClient  client;

unsigned long myChannelNumber = SECRET_CH_ID;
const char * myWriteAPIKey = SECRET_WRITE_APIKEY;

// Initialize our values
int counter = 0;
String myStatus = "";
float bodenfeuchtigkeit;

int moisturePin = A1;
// Set this threeshold accordingly to the resistance you used
// The easiest way to calibrate this value is to test the sensor in both dry and wet soil
int threeshold = 800;

int bLED = 0;
int bLEDState = LOW;
long bLEDTimer = 0;
long bLEDTimeout = 500;

int tsdelay = 0;
int tsdelayState = LOW;
long tsdelayTimer = 0;
long tsdelayTimeout = 20000;

byte connect_flag = false;


void setup() {
  Serial.begin(115200);  // Initialize serial
 /* while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo native USB port only
  }
*/
  pinMode(LED1, OUTPUT);

  if (!ENV.begin()) {
    Serial.println("Failed to initialize MKR ENV shield!");
    while (1);
  }

  // check for the WiFi module:
  if (WiFi.status() == WL_NO_MODULE) {
    Serial.println("Communication with WiFi module failed!");
    // don't continue
    while (true);
  }

  String fv = WiFi.firmwareVersion();
  if (fv != "1.0.0") {
    Serial.println("Please upgrade the firmware");
  }

  ThingSpeak.begin(client);  //Initialize ThingSpeak

  digitalWrite(LED1, LOW);

  Serial.println();
  Serial.println("Booting...");
  Serial.println();
}

void loop() {

  // read all the sensor values
  float temperature = ENV.readTemperature();
  float humidity    = ENV.readHumidity();
  float pressure    = ENV.readPressure();
  float illuminance = ENV.readIlluminance();
  float uva         = ENV.readUVA();
  float uvb         = ENV.readUVB();
  float uvIndex     = ENV.readUVIndex();
  bodenfeuchtigkeit = float(get_average_moisture());



  // Connect or reconnect to WiFi
  if (WiFi.status() != WL_CONNECTED) {
    connect_flag = false;
    Serial.print("Attempting to connect to SSID: ");
    Serial.println(SECRET_SSID);
    while (WiFi.status() != WL_CONNECTED) {
      WiFi.begin(ssid, pass); // Connect to WPA/WPA2 network. Change this line if using open or WEP network
      Serial.print(".");
      delay(5000);
    }
    Serial.println();
    Serial.println("\nConnected.");
    Serial.println();
    connect_flag = true;
  }



  if (connect_flag == true) {
    if (millis() > bLEDTimeout + bLEDTimer )
    {
      bLEDTimer = millis();

      if (bLEDState == LOW) bLEDState = HIGH;
      else bLEDState = LOW;

      digitalWrite(LED1, bLEDState);
    }
  }


  if (connect_flag == false) {
    digitalWrite(LED1, LOW);
  }



  // set the fields with the values
  ThingSpeak.setField(1, bodenfeuchtigkeit);
  ThingSpeak.setField(2, temperature);
  ThingSpeak.setField(3, humidity);
  ThingSpeak.setField(4, pressure);
  ThingSpeak.setField(5, illuminance);
  ThingSpeak.setField(6, uva);
  ThingSpeak.setField(7, uvb);
  ThingSpeak.setField(8, counter);

  /*
    // figure out the status message
    if (number1 > number2) {
      myStatus = String("field1 is greater than field2");
    }
    else if (number1 < number2) {
      myStatus = String("field1 is less than field2");
    }
    else {
      myStatus = String("field1 equals field2");
    }
  */


  if (millis() > tsdelayTimeout + tsdelayTimer )  // alle 20 Sekunden an Thingspeak senden
  {
    tsdelayTimer = millis();

    if (tsdelayState == LOW) tsdelayState = HIGH;
    else tsdelayState = LOW;

    if (tsdelayState ==  HIGH)
    {

      // print each of the sensor values
      Serial.print("Temperature = ");
      Serial.print(temperature);
      Serial.println(" °C");

      Serial.print("Humidity    = ");
      Serial.print(humidity);
      Serial.println(" %");

      Serial.print("Pressure    = ");
      Serial.print(pressure);
      Serial.println(" kPa");

      Serial.print("Illuminance = ");
      Serial.print(illuminance);
      Serial.println(" lx");

      Serial.print("UVA         = ");
      Serial.println(uva);

      Serial.print("UVB         = ");
      Serial.println(uvb);

      Serial.print("UV Index    = ");
      Serial.println(uvIndex);

      Serial.print("Bodenfeuchtigkeit    = ");
      Serial.println(bodenfeuchtigkeit);

      Serial.print("Counter    = ");
      Serial.println(counter);

      // print an empty line
      Serial.println();

      // set the status
      ThingSpeak.setStatus(myStatus);

      // write to the ThingSpeak channel
      int x = ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);
      if (x == 200) {
        Serial.println("Channel update successful.");
      }
      else {
        Serial.println("Problem updating channel. HTTP error code " + String(x));
      }

      counter = counter + 1;
    }
  }
  //delay(20000); // Wait 20 seconds to update the channel again
}



int get_average_moisture() { // make an average of 10 values to be more accurate
  int tempValue = 0; // variable to temporarly store moisture value
  for (int a = 0; a < 10; a++) {
    tempValue += analogRead(moisturePin);
    delay(100);
  }
  return tempValue / 10;
}

Hallo,

ich spreche jetzt wie hier die sog. “Talkback” API von Thingspeak an: Control a Light with TalkBack on ESP8266 - MATLAB & Simulink - MathWorks Deutschland.

Wenn ich dann auf der Thingspeakseite einen command absetzte, wie eben: “TURN ON”, wirft mir die serielle Ausgabe leider dies hier aus:

checking queue...
  Latest command from queue: 7
TURN_ON
0

Ich benutze den Codeschnipsel aus dem Beispiel.
Das

7
TURN_ON
0

wird nicht in der Schleife abgefragt. Was könnte dort nicht stimmen?

Ich benutze
#include <WiFiNINA.h>
#include “ThingSpeak.h”

Es ist kein ESP8266, sondern der MKR 1010.

Danke.

okay…

if(newCommand.indexOf("TURN_ON")>0)

So gehts…

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.