Werte von Variabeln durch WLAN, ohne neuprogrammierung ändern

Hallo zusammen,

ich habe ein Sketch programmiert der mir die Pflanzen im Balkon automatisch, an bestimmten Uhrzeiten, gießt.

Insgesamt werden mit 12 Feuchtesensoren 12 Pumpen gesteuert und die Ausgabe erfolgt über ein Display.

Jetzt beobachte ich mit diesen Automat die gelieferte Werte der Sensoren am Bildschirm und über die Serielle Schnittstelle, denn ich weiß noch nicht welche Werte (von 0-1009) für welche Pflanze einstellen soll.
Die Arduino ist über USB mit einer Raspberry verbunden und über dem seriellen Monitor der Arduino IDE, über Remote Desktop werden die Werte beobachtet.
Wenn ich merke, dass die Erde zu feucht oder zu trocken ist, ändere ich den Wert einer Variabel und lade den Sketch in der Arduino jedesmal neu.
Das ist nicht besonders elegant.
Besser wäre, über eine ESP8266 die Variable der Feuchte zu "füttern", so ähnlich wie ich die Sensoren auslese.
Ich besitze eine ESP8266-01 und sie soll eine Firmware schon drauf haben, die die AT-Befehle versteht.
Das Problem: Ich kann sie zwar mit der Arduino verbinden, aber ich habe keine Ahnung wie ich vorgehen soll.
Ich brauche nicht eine fertige Lösung, aber ich weiß noch nicht mal, ob ich auf den Holzweg bin.
Wie gehe ich an die Sache ran? Baue ich mit der ESP ein Server? Wo schreibe ich die Werte, damit die Arduino sie "nimmt"? Kann ich die Werte sogar irgendwo schreiben, damit ich sie später lesen kann?

Vielen Dank in Voraus für eventuelle Tipps! Den Rest werde ich mir selbst googlen.

Grüße

Giuseppe

Mit dem ESP8266 kannst Du eine Konfigdatei im SPIFFS schreiben. Im Weihnachtsstern (in #476 ist ein Link zum Code ) habe ich das genutzt.

Änderung über Webinterface und wenn ich will, wird die Konfigdatei neu geschrieben.

Gruß Tommy.

Hi

Da ich gerade mit FRAMs spiele - FM24C256
Der ist per I2C ansprechbar und kann 32kb (32768 x 8 Bit) Daten speichern, ist 'unbegrenzt' beschreibbar und schneller als der Bus - braucht also keine Wartezyklen wie ein EEprom (womit ich auch Mal spielen wollte).
Mit 10^11 Schreibzyklen bei 400kHz könnte man, laut Datenblatt, eine einzelne Zelle 10 Jahre am Stück beschreiben - wenn der µC noch was Anderes machen soll, außer den FRAM grillen, also ewig.
Einzig das fitzelige Gehäuse SOP8 (... ok, gibt auch kleinere SMD) empfinde ich als nicht sonderlich gut lötbar.
Hatte gestern mit Tommy's Code aus dem Nachbarforum Probleme (Wire lieferte Fehlerwert 2, Erfolg ergibt Fehlerwert 0), heute händisch den Aufruf nach Doku klappt, im Code nachgeschaut, eigentlich Alles genau so, getestet, klappt auch - irgendwer mochte mich Gestern wohl nicht!

Damit könnte man nicht nur für jeden Blumentopf einen eigenen Grenzwert einstellen, man könnte auch den Pflanzendurst protokollieren.

MfG

FRAM, absoluter Overkill fürs Blumengiessen :wink:

Warum? Wenn er schon mal da ist, kann man den doch gut nutzen. Dann von Zeit zu Zeit die Werte nach extern schreiben (zur Auswertung) und wieder von der Anfangsadresse loslegen.

Wenn die Pflanze plötzlich nicht mehr ihre gewohnte Wassermenge abnimmt, könnte sie ein Problem haben.

Ich fand/finde FRAM als gute Alternative zu EEPROM und FLASH für oft geänderte Daten.

Gruß Tommy

Hallo noiasca, Hallo Tommy,

Danke für euren wertvollen Tipps!
@noiasca:

Ja, das ist wirklich was ich suche, dort sind viele wertvolle Informationen die ich sicher gebrauchen kann.
Dort sind auch die pro und Kontra "only ESP" vs "ESP mit Arduino angezeigt.
Als Anfänger reizt mir die Anzeige mit der App Virtuino sehr: wenig lernen, aber optisch ansprechender App, mit "scheinbar" wenig Aufwand.
--> EEPROM.write / EEPROM.read... Ist dort den Anzahl der Schreibzyklen nicht begrenzt? 10000 mal wie bei der Arduino?
Im Moment schreibe ich definiere ich die Werte der Feuchte die die Erde erreichen soll in einer Variabel.
Konnte ich dann ein Befehl wie Int Feuchte = EEPROM.read(wert) wenn ich vorher den Wert mit EEPROM.write schreibe? Entweder habe ich die Frage falsch gestellt, oder ich sehe keinen Vorteil gegenüber direkt den Sketch hochladen...
Ideal wäre, dass ich den Wert der Feuchte in einer APP oder Server schreibe (Über PC oder APP) damit ich im Sketch sowas wie " Int Feuchte = AUSDENSERVER.read(wert)

@Tommy:
Zuerst Kompliment für dein Weihnachtsstern! Deine Programmierung ist (in meine unerfahrenen Augen) wie in Lehrbuch: Überall Kommentare, die Variablen sind sparsam definiert, das Programm sehr schön strukturiert.
Bevor ich dein Sketch in meiner Arduino "Brutzle" möchte ich das meiste verstehen. Wie Du im Bild siehst, versuche ich auch die Sachen so gut wie möglich zu verstehen und umzusetzen. Auch wenn es mir oft try and pray sehr anzieht...
Dein Engagement in diesen Forum ist enorm, fast immer bist Du dabei mit Tipps und Ratschläge.
Ich versuche die Funktionsweise des server "Ich bin umgezogen" zu verstehen: Ist ein freier Service im Internet?
Und dann werde ich versuchen dein Sketch zu verstehen, oder zumindest den Teil wo es um die Kommunikation geht, wobei ich muss gestehen, das es mir einer Nummer zu groß für mich erscheint.
Ich fange mal an die ESP an der Arduino nano zum testen zu verbinden. Dafür habe ich ein bidirektionaler Pegelwandler besorgt. (5 Stück für 3,80)
Ich werde die 3,3V an: Pegelumvandler LV und GND anschließen, dann an der ESP (VCC und GND)
Die 5V werde ich an Pegelumvandler HV und GND anschließen
Die RXD der ESP an LV1, von HV1 zu RXD der Arduino anschließen
Die TXD der ESP an LV2, von HV2 zu TXD der Arduino anschließen
Dann werde ich mit ein Standardsketch schauen ob meine Schaltung funktioniert. Led 13 blinken lassen.
Dann versuche ich eure Tipps zu verstehen und für ein mein Projekt in einer separaten arduino testen.
Wenn alles läuft werde ich alles in mein Hauptsketch einbauen und bei Erfolg euch ganz feste drücken!
Keine Angst...Nur virtuell! :slight_smile:

So, jetzt ran an die bulette!

Gruß
Giuseppe

postmaster-ino:
Hi

Da ich gerade mit FRAMs spiele - FM24C256
Der ist per I2C ansprechbar und kann 32kb (32768 x 8 Bit) Daten speichern, ist 'unbegrenzt' beschreibbar und schneller als der Bus - braucht also keine Wartezyklen wie ein EEprom (womit ich auch Mal spielen wollte).
Mit 10^11 Schreibzyklen bei 400kHz könnte man, laut Datenblatt, eine einzelne Zelle 10 Jahre am Stück beschreiben - wenn der µC noch was Anderes machen soll, außer den FRAM grillen, also ewig.
Einzig das fitzelige Gehäuse SOP8 (... ok, gibt auch kleinere SMD) empfinde ich als nicht sonderlich gut lötbar.
Hatte gestern mit Tommy's Code aus dem Nachbarforum Probleme (Wire lieferte Fehlerwert 2, Erfolg ergibt Fehlerwert 0), heute händisch den Aufruf nach Doku klappt, im Code nachgeschaut, eigentlich Alles genau so, getestet, klappt auch - irgendwer mochte mich Gestern wohl nicht!

Damit könnte man nicht nur für jeden Blumentopf einen eigenen Grenzwert einstellen, man könnte auch den Pflanzendurst protokollieren.

MfG

Das hört sich auch interessant an! Ich werde mich auch dahingehend informieren. Dankeschön! Hier ist wie in Traumland für mich!

ElEspanol:
FRAM, absoluter Overkill fürs Blumengiessen :wink:

Laaach! Blumengießen.... 12 Sensoren, 12 Pumpen, 12 verschiedene Pflanzen.
Nach 2 Wochen habe ich den idealen Wert der Feuchte für eine(!) Palme herausgefunden. ( und mindestens 100 mal die Arduino neu programmiert)

Ich habe eine Sicherung eingebaut, falls ein Sensor kaputt geht, oder falls ein Vogel ihn herausreißt... Nur durch Werte ändern.

Für Blumengießen hätte ich mir einer der unzähligen Sketch herauskopiert und drauf gebruzzelt.
Da steckt viel mehr dahinter. Wie Tommy schon sagt... den Pflanzen soll gut gehen!
Und danach kommt der "Dünger-Modus"! Da ändert sich der Widerstand der Erde wieder und ich fange neu an...

Aber vielleicht hast Du Recht und Du hast eine bessere Idee?

Zum FRAM habe ich nebenan ein paar Funktionen #22 geschrieben.
Zur Kopplung NodeMCU könnte das hier weiter helfen. Beachte die unterschiedliche Ausrichtung von Strukturen.

Gruß Tommy

cateyes:
Und danach kommt der "Dünger-Modus"! Da ändert sich der Widerstand der Erde wieder und ich fange neu an...

Wenn der Widerstand der Erde in Deine Messung eingeht, hast Du die falsche Meßmethode, da dabei Elektrolyse stattfindet und sich Deine Elektroden zersetzen und die Metallionen sich oft nicht mit den Pflanzen vertragen (oder umgekehrt).

Wie misst Du die Feuchte?

Gruß Tommy

cateyes:
Laaach!
...

Aber vielleicht hast Du Recht und Du hast eine bessere Idee?

Ich bezog mich rein auf die Hardware. Fürs Blumengiesen reicht der Eeprom locker aus, Notfalls mit intelligenter Verwaltung der Speicherplätze.

Suche mal hier im Forum nach "Gießomat", da sind auch andere Sensoren mit erwähnt. Nebenan gibt es auch einen Thread und eine Realisierung.

Allen gemeinsam ist das kapazitive Messprinzip. Es fließt also kein Strom durchs Erdreich.

Gruß Tommy

Tommy56:
Zum FRAM habe ich nebenan ein paar Funktionen #22 geschrieben.
Zur Kopplung NodeMCU könnte das hier weiter helfen. Beachte die unterschiedliche Ausrichtung von Strukturen.

Gruß Tommy

Endlich habe ich verstanden was FRAM ist! Zum speichern mit Microprozessoren scheinen ideal zu sein.
Ich habe eine NodeMCU bereits zu Hause, noch liegt eingepackt. Die Verbindung zwischen den beiden Welten erscheint mir im Moment zu hoch. Die Verwendung der NodeMCU alleine scheint mir einfacher.
Wenn ich dein Motto lese, denke ich immer mehr, dass ich anfangen soll meine Axt zu schleifen....
Oh Mann! Um so mehr ich von eure Berichte lese, um so mehr fühle ich mich unwissend. Langsam kommt Frust auf.
Alle eure Bemühungen haben allerdings trotzdem gefruchtet: Ihr habt mir nicht nur ein Weg gegeben, sondern mehrere.

Endlich

cateyes:
Oh Mann! Um so mehr ich von eure Berichte lese, um so mehr fühle ich mich unwissend. Langsam kommt Frust auf.
Alle eure Bemühungen haben allerdings trotzdem gefruchtet: Ihr habt mir nicht nur ein Weg gegeben, sondern mehrere.

Ein Leidensgenosse :slight_smile:
Keine Angst, Du bist damit bei Weitem nicht allein!
Müsste auch schon wesentlich weiter sein, mit meinen Spielereien ...
Aber Frust ist bei mir nicht das passende Wort ... 'Arsch hoch kriegen' passt bei mir besser.

MfG

Wir haben alle irgendwann mal von null angefangen.

Die Erkenntnis kommt mit der Zeit und der Intensität der Beschäftigung. Nicht verzagen, weiter machen.

Wichtig ist immer, dass man das Grundlagenstudium nicht vernachlässigt, weil es anders ja bequemer ist.Aus den Grundlagen werden größere Zusammenhänge und dann kommt wieder mal der "AHA-Moment".

Ich habe mir vor mittlerweile 40 Jahren Assembler auf Z80 selbst beigebracht. Bin dann über Basic, Turbo Pascal zum 80x86 gekommen - wieder Assembler, dann Delphi, C und UNIX, JAVA und alles was man im Browser braucht.
Dazwischen habe ich irgendwann mein Hobby (Programmieren) zum Beruf gemacht.

C++ habe ich erst vor 1,5 Jahren mit dem Arduino begonnen. Da gab es dann auch nach ein paar Pannen die ersten AHA-Effekte mit eigenen Klassen.

Es geht immer weiter, wenn man lernen will und Fehler gehören zum Lernprozess dazu.

Haltet durch.

Gruß Tommy

postmaster-ino:
...

Damit könnte man nicht nur für jeden Blumentopf einen eigenen Grenzwert einstellen, man könnte auch den Pflanzendurst protokollieren.

MfG

Hi, sagte ich gerade... Als Speichermedium und noch per I2C super...

Ich habe von einer DS3231 (so einer) den EEPROM runter gelötet und dafür den FRAM drauf. Ist in dem Thread auch angesprochen.

Gruß Tommy

Edit: Link ergänzt

Danke Tommy für die tröstenden Wörter und Danke auch an postmaster-ino.
Ihr habt Recht, es darf nicht zum Frust kommen.
Ich habe vor ca 3 Monate angefangen (wieder) zu programmieren. Vor 30 Jahren habe ich Assembler auf ein Plus4 von Commodore programmiert. Es war faszinierend wie Schnell Assembler gegenüber Basic war. Auch da war ich aber nicht ein Profi, aber immerhin konnte ich fast ohne Dokumentation verstehen, wie der Basic Interpreter läuft und ein paar Zeiger so verbiegen, dass ich die Meldungen in Basic in Deutsch übersetzen konnte.
Alles was ich bis jetzt geschrieben habe, habe ich auch verstanden. Nicht einfach nach den Motto Copy & Paste und als meins verkauft.
So auch mit mein Greensitter oder wie es andere nennen... Blumen gießen.
A propos... Du hast Recht, die richtige Methode die Erdfeuchte zu messen ist eine Kapazitive Messung, nicht nur aus den Gründen die Du genannt hast, sondern, weil diese Messung wirklich den Wasserinhalt indirekt misst. Ich habe so ein Sensor gekauft, der Kostet aber um die 12 Euro.
Um die Elektrolyteeffekte drastisch zu reduzieren und damit den Verfall des Sensor, habe ich eine sehr simple Idee gehabt: Ich messe 3 x am Tag, 500 ms lang. Meine Testpflanzen laufen seit 2,5 Monate und die Sensoren sehen wie neu aus. Wenn ich permanent messe sind sie in ca eine Woche unbrauchbar und die Kupfer und Zink-Teilchen in der Erde.
Die kapazitive Sensoren in der Preisklasse von 12 Euro sind wesentlich besser aber auch kein Profi-Zeug. bei 12 Sensoren läppert sich eine nicht erhebliche Summe. Auch die Pumpen in der niedrige Preisklasse sind unbrauchbar. Nach 2 Wochen sind sie verrostet. Man muss schon um die 6 Euro pro Pumpe rechnen.
Das gas ganze hat angefangen, weil meine Tochter 40 km weiter ausgezogen ist und somit meine Pflanzen nicht jeden Tag gießen kann. Es hat mit einer Schaltuhr und eine Pumpe angefangen und dann bin ich auf den Geschmack gekommen.
So jetzt ist wirklich weit weg vom Thema... :wink:
Wenn Du mal in Köln bist, lade ich dich zum Essen ein und dann können wir über dies und das reden.
Als Lösung für mein Vorhaben habe ich mich entschieden entweder Blynk oder Virtuino zu benutzen.
Die Themen die Ihr alle vorgeschlagen habt, werde ich aber nicht zur Seite schieben, sondern langsam verfolgen. Da reicht die Zeit bis zum Frühling nicht mehr.
Ich habe mit Virtuino angefangen. Zum testen habe ich eine Nano benutzt und eine esp 8266-01 als Server. Ich habe beide miteinander verbunden, das Problem mit der Spannung konnte ich mit eine Externe Spannungsversorgung lösen und die Kommunikation mit ein bidirektionaler Spannungswander. CH-PD habe ich mir ein 10kOhm Widerstand an die 3,3 Volt fest verbunden.
Anfangs habe ich wie in der Anleitung A2 und A3 als softserial benutzt und den Standard Sketch geladen. Die esp ließ sich nicht programmieren, der Serialmonitor blieb bei "Inizialisieren" stehen.
Danach habe ich die TXD und RXD benutz, dafür musste ich den Sketch und die Bibliothek geringfügig ändern. Und siehe da... Der serialmonitor zeigt:
Server init...
AT+GMR
AT+CWMODE=1
AT+CWJAP="mein Router","mein Passwort" (mit den richtigen Werte natürlich)
AT+CIFSR
AT+CIPMUX=1
AT+CIPSERVER=1,8000
AT+CIPSTA="192.168.178.140"
Diese Adresse lässt sich auch gut pingen aber.... Der Virtuino zeigt bei der Testconnection:
communication error...mehr nicht.
Adresse, passwort des Server, port stimmen. Mehr kann ich nicht einstellen!
Wenn ich Probleme zwischen der Arduino und der ESP hätte, bekäme ich doch keine Antwort und der Server hätte nicht die Adresse die ich vergeben hatte.
Wie konnte ich den Server noch testen?

Blynk kannst Du Dir sparen, Deine Mittel sind (wenn Du nix bezahlst) recht begrenzt, zudem bist Du gezwungen, einen Account anzulegen, und dann läuft alles über einen Blynk-Server.
Virtuino ist da viel angenehmer, da braucht es nicht mal Internet.
Zu Deinem Problem:
Was für ein Code steckt denn auf dem ESP? Ich hab da jedenfalls nix mit AT-Befehlen gemacht....

Guten Morgen,

ja, Du hast Recht. Blynk ist da mehr kommerziell. Man kann aber ein eigenen Server aufbauen und dann ist nicht so teuer.
Virtuino überzeugt mich mehr.
In meiner ESP soll bereits ein Code die bereits AT-Befehle verstehen soll.
Ich habe folgenden Code durch die Arduino hochgeladen.
Das ist den Code der in der Anleitung mitgegeben haben.
Zuerst habe ich versucht mit Softserial zu programmieren, da tat sich nichts, danach habe ich mit TXD/RXD versucht. Seid dem kann ich die ESP anpingen. (PING)
Ich habe die Schaltung 1 x mit Spannungsteiler und 1 x mit ein bidirektionaler Spannungswandler versucht. gleiche Ergebnis...CH-PD habe ich mir ein 10kOhm Widerstand an die 3,3 Volt fest verbunden.

/* Virtuino ESP8266 web server example No1  
 * Example name = "Enable or disable pin 13 LED"
 * Created by Ilias Lamprou
 * Updated Jul 01 2016
 * Before  running this code config the settings below as the instructions on the right
 * 
 * 
 * Download latest Virtuino android app from the link: https://play.google.com/store/apps/details?id=com.virtuino_automations.virtuino&hl=el
 * Getting starting link:
 * Video tutorial link: 
 * Contact address for questions or comments: iliaslampr@gmail.com
 */

/*========= VirtuinoEsp8266 Class methods  
 
 * boolean connectESP8266_toInternet(String wifiNetworkName,String wifiNetworkPassword, int port);  Set your home wifi network SSID and PASSWORD  (Put this function on start of void setup)
 *
 * boolean createLocalESP8266_wifiServer(String wifiNetworkName,String wifiNetworkPassword, int port, int mode); Use this function to create an ESP8266 wifi local network
 *                                                                   set port to 80 
 *                                                                   set mode=2 to use ESP8266 only as access point 
 *                                                                   set mode=3 to use ESP8266 as access point and internet station.
 *
 *  bool esp8266_setIP(byte a1, byte a2, byte a3, byte a4);           set ESP8266 local IP. Use this function after connectESP8266_toInternet function 
 *
 * ========= Virtuino general methods  
 *  void vDigitalMemoryWrite(int digitalMemoryIndex, int value)       write a value to a Virtuino digital memory   (digitalMemoryIndex=0..31, value range = 0 or 1)
 *  int  vDigitalMemoryRead(int digitalMemoryIndex)                   read  the value of a Virtuino digital memory (digitalMemoryIndex=0..31, returned value range = 0 or 1)
 *  void vMemoryWrite(int memoryIndex, float value);                  write a value to Virtuino memory             (memoryIndex=0..31, value range as float value)
 *  float vMemoryRead(int memoryIndex);                               read a value of  Virtuino memory             (memoryIndex=0..31, returned a float value
 *  run();                                                            neccesary command to communicate with Virtuino android app  (on start of void loop)
 *  int getPinValue(int pin);                                         read the value of a Pin. Usefull to read the value of a PWM pin
 *  void vDelay(long milliseconds);                                   Pauses the program (without block communication) for the amount of time (in miliseconds) specified as parameter
 *  void vDelay(long milliseconds);                                   Pauses the program (without block communication) for the amount of time (in miliseconds) specified as parameter
 *  void clearTextBuffer();                                           Clear the text received text buffer
 *  int textAvailable();                                              Check if there is text in the received buffer
 *  String getText(byte ID);                                          Read the text from Virtuino app
 * void sendText(byte ID, String text);                               Send text to Virtuino app  
 */
 
#include "VirtuinoEsp8266_WebServer.h"



// Code to use SoftwareSerial
//#include <SoftwareSerial.h>
//SoftwareSerial espSerial =  SoftwareSerial(2,3);      // arduino RX pin=2  arduino TX pin=3    connect the arduino RX pin to esp8266 module TX pin   -  connect the arduino TX pin to esp8266 module RX pin
//VirtuinoEsp8266_WebServer virtuino(espSerial);   // Your esp8266 device's speed is probably at 115200. For this reason use the test code to change the baud rate to 9600
                                                      // SoftwareSerial doesn't work at 115200 
                                                      
// Code to use HardwareSerial
VirtuinoEsp8266_WebServer virtuino(Serial);    // enable this line and disable all Software serial lines
                                                        // Open VirtuinoESP8266_WebServer.h file on the virtuino library folder
                                                        // and disable the line: #define ESP8266_USE_SOFTWARE_SERIAL 




//================================================================== setup
//==================================================================
//==================================================================
void setup() 
{
  virtuino.DEBUG=true;                                            // set this value TRUE to enable the serial monitor status.It is neccesary to get your esp8266 local ip
  //Serial.begin(9600);                                             // Enable this line only if DEBUG=true

//  espSerial.begin(115200);                  // Enable this line if you want to use software serial (Uno, Nano etc.)
  //Serial1.begin(115200); // Enable this line if you want to use hardware serial (Mega, DUE etc.)
Serial.begin(115200);
  virtuino.connectESP8266_toInternet("NETCOLOGNE-xxx","xxxxxxxxx",8000);  // Set your home wifi router SSID and PASSWORD. ESP8266 will connect to Internet. Port=80
  virtuino.esp8266_setIP(192,168,178,140);                                          // Set a local ip. Forward port 80 to this IP on your router

  //virtuino.createLocalESP8266_wifiServer("ESP8266 NETWORK NAME","PASSWORD",80,2);   //Enable this line to create a wifi local netrork using ESP8266 as access point
                                                                                      //Do not use less than eight characters for the password. Port=80
                                                                                      //Default access point ESP8266 ip=192.168.4.1. 
 
  virtuino.password="xxxxxx";                                     // Set a password to your web server for more protection 
                                                                // avoid special characters like ! $ = @ # % & * on your password. Use only numbers or text characters
                              
  
  
//------ enter your setup code below

   pinMode(13,OUTPUT);       
 
    
    
}


//================================================================== loop
//==================================================================
//==================================================================


void loop(){
   virtuino.run();           //  necessary command to communicate with Virtuino android app
   
    //------ enter your loop code below here
    //------ avoid to use delay() function in your code. Use the command virtuino.vDelay() instead of delay()

    // your code .....

 
  }
  
        
     //----- end of your code

Ich hatte verstanden, dass ich mit diesen Code die ESP gleichzeitig programmiere.... Liege ich da falsch?

Gruß

Giuseppe