experimenteren met ESP8266

Geregeld wil ik met mijn Arduino wat meten. Helaas moet ik daar bij blijven omdat de SD kaart te snel vol raakt, geheugen te klein is het LCD niet genoeg waarde kan bevatten etc. Dat moet anders kunnen bedacht ik me en maakte een testboard met mijn ESP8266.
Een ESP8266 kan via WiFi in verbinding staan met een webruimte. Op een webruimte kan je een database draaien en daarmee de data opslaan. De gratis versies hebben mij te veel beperkingen en dus een eigen webruimte gehuurd.

Op mijn eigen webruimte kan ik sub domeins regelen en zo ook 'espdata.Hogenstijn.eu'. Onbeperkt gebruik van databases maakt het programeren een stuk makkelijker. De ESP8266 leest de pennen D1 t/m D4 en A0 af en stuurt die info naar Hogenstijn.eu/invoeren1.php. Daar krijgt de ESP data terug voor de pennen 5 t/m 8. D0 D3 D9 en D10 worden nu niet gebruikt. D9 en D10 omdat ik de ESP8266 geregeld aan de computer hang om data af te lezen.
Op de webstite in de database heb ik van de ESP8266 de pennen D0 t/m D13 en A0 elk een kolom gegeven. (Zie espdata.hogenstijn.eu) Omdat ik meerdere testen tegelijk met verschillende ESP8266 wil doen, moet de ESP8266 ook een mac adres doorgeven waarmee de data per mac adres te selecteren is.
En ESP8266 moet dus bijhouden wat de spanning van een accu is en op welke dag en tijdstip die spanninwaarde was. Daar is A0 goed voor.
De uitdaging is de 12V die aangeboden wordt door de accu en de 3.3 volt die de ESP8266 nodeMcu op de A0 (de meeste ESP versies kunnen max. maar 1V op A0 verdragen) kan lezen.
Een 12 deler maken dus, de +12V====diode====60K=====aftakking A0=====10K=====gezamelijke min. 1020 Is de maximale waarde die ik reken voor 15V, dus 15/1020= ca 0,015V. Bij 5V zit je op A0 waarde 3334, bij 10V dus ongeveer op waarde A0 666.7 en bij 12V ongeveer analoog waarde 800. Kom je bij 15V op 1000 en iets hoger dus 1020.
Bij espdata.hogenstijn.eu wordt de data uit de database gefilterd en van het mac adres van de ESP8266, alleen de laatste 3 waarden getoond. Je moet dus via de Arduino IDE monitor kijken wat de ESP aangeeft dat het mac adres is. in het witte vlak selecteer je jouw ESP8266 mac getallen, druk op knop en als er al waarden zijn worden die meteen getoond. Nergens wordt het hele mac adres getoond. Dat is nodig om als er data gewist moet worden, dan zijn de eerste 3 getallen van het mac adres nodig.
Nu heb ik zo'n leuk boardje waar alleen een bepaalde versie ESP8266 NodeMcu in past. Handig is wel dat ik het test boardje ook kan gebruiken voor servo's.
Via de link relais instellen, kom je op de pagina waar je D5 t/m D8 kan instellen met een vinkje. Ook hier moet je de laatste drie cijfers van je mac adres weten. Ik twijfel nog of je ook de eerste drie cijfers handmatig in moet vullen om misbruik te voorkomen.
Relai 1 (D5) kan ik automatisch bij de waarde 800 laten in of uitschakelen. D1 kan dus automatisch in of uitgeschakeld worden of met de hand in of uitgeschakeld. Prioriteit heeft automaat. Staat daar een vinkje dan wordt de handbediening van D5 onderdrukt.
Eerst dus een mac adres kiezen in het witte vlak, dan op knop drukken, de relais keuze maken en op voer in, drukken.

Het script wat de data naar mijn website stuurt:

/*
* ESP hulp programma om data te meten en schakelen
* Alle data wordt door gestuurd naar een website met database
* bron: http://esp8266.github.io/Arduino/versions/2.0.0/doc/reference.html
* http://eenander.xyz
*/
#include @ltESP8266WiFi.h>
#include @ltSoftwareSerial.h>


const char* ssid = "netwerknaam";
const char* password = "netwerkwachtwoord";
const char* host = "espdata.hogenstijn.eu";
// data van de IO poorten
int D1Pin = 5;
int D2Pin = 4;
int D4Pin =2;
int D5Pin =14 ;
int D6Pin =12 ;
int D7Pin =13;
int D8Pin =15;
float $A0;
//Status relais
String $R1;
String $R2;
String $R3;
String $R4;
byte mac[6];
String $mac;

void setup() {
Serial.begin(9600); //data via TX RX
delay(10);
// IOpoorten input
pinMode(D1Pin, INPUT); //
pinMode(D2Pin, INPUT); //
pinMode(D4Pin, INPUT); //
pinMode(D5Pin, OUTPUT); //
pinMode(D6Pin, OUTPUT); //
pinMode(D7Pin, OUTPUT); //
pinMode(D8Pin, OUTPUT); //
// High is relais uit
digitalWrite(D5Pin,HIGH);
digitalWrite(D6Pin,HIGH);
digitalWrite(D7Pin,HIGH);
digitalWrite(D8Pin,HIGH);

// We starten met aansluiten op een WiFi netwerk
Serial.println();
Serial.println("Sketch versie:");
Serial.print("ESPtestServer4RelaisMysql ");
Serial.println();
// mac adres van het board opvragen
WiFi.macAddress(mac);
Serial.print("MAC ");
$mac=="";
$mac+=String(mac[5],HEX);
$mac+=":";
$mac+=String(mac[4],HEX);
$mac+=":";
$mac+=String(mac[3],HEX);
$mac+=":";
$mac+=String(mac[2],HEX);
$mac+=":";
$mac+=String(mac[1],HEX);
$mac+=":";
$mac+=String(mac[0],HEX);
Serial.println ($mac);
Serial.println();
Serial.print("Verbonden met ");
Serial.println(ssid);

WiFi.begin(ssid, password);
int teller=0;
while (WiFi.status() != WL_CONNECTED) {
delay(500);
teller++;
Serial.print(".");
if (teller>=100){teller=0;Serial.print("Probeer te verbinden met:");Serial.println(ssid);}
}

Serial.println("");
Serial.print("WiFi verbonden en kreeg IP adres: ");
Serial.println(WiFi.localIP());

}


void loop()
{

Serial.print("Verbonden met: ");
Serial.println(host);

// gebruik WiFiClient class om een verbinding te maken
WiFiClient client;
const int httpPort = 80;
if (!client.connect(host, httpPort))
{
Serial.println("Geen verbinding ");
return;
}
// me maken data gereed voor verzenden
String url = "/voerin1.php";
url += "?MAC=";
url += $mac;
url += "&D1=";
url += digitalRead(D1Pin);
url += "&D2=";
url += digitalRead(D2Pin);
url += "&D4=";
url += digitalRead(D4Pin);
url += "&D5=";
url += digitalRead(D5);
url += "&D6=";
url += digitalRead(D6);
url += "&D7=";
url += digitalRead(D7);
url += "&D8=";
url += digitalRead(D8);
url += "&A0=";
url += analogRead(A0);
Serial.print("Verzonden naar URL: ");
Serial.println(url);
// Dit zend de data naar de server
client.print(String("GET ") + url + " HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"Connection: close\r\n\r\n");
delay(1000);// om de data op te halen bij slechte verbinding

// Lees de data die de website terug zend
Serial.println("Ontvangen van site:");

while(client.available())
{
String line = client.readStringUntil('\r\n');
Serial.print("ingelezen data: ");
Serial.println(line);
// splits data voor RGB uit andere data en stuur de RGB aan met waarde * 10
// splitsing controleren
//String text = line.substring(3,7);
//Serial.println(text);
// en dan uitvoeren

if (line.substring(0,3) == "#5=")
{

if (line.substring(3,7)== "on")
{
digitalWrite(D5Pin,LOW);Serial.println("D5 laag/aan");
}else{
digitalWrite(D5Pin,HIGH);Serial.println("D5 hoog/uit");
}
}
if (line.substring(0,3) == "#6=")
{
if (line.substring(3,7)== "on")
{
digitalWrite(D6Pin,LOW);Serial.println("D6 laag/aan");
}else{
digitalWrite(D6Pin,HIGH);Serial.println("D6 hoog/uit");
}
}
if (line.substring(0,3) == "#7=")
{
if (line.substring(3,7)== "on")
{
digitalWrite(D7Pin,LOW);Serial.println("D7 laag/aan");
}else{
digitalWrite(D7Pin,HIGH);Serial.println("D9 hoog/uit");
}
}
if (line.substring(0,3) == "#8=")
{
if (line.substring(3,7)== "on")
{
digitalWrite(D8Pin,LOW);Serial.println("D8 laag/aan");
}else{
digitalWrite(D8Pin,HIGH);Serial.println("D8 hoog/uit");
}
}

delay(50);
}
Serial.println("--");
Serial.println("Einde bericht van website.");
Serial.println("ik sluit de verbinding en wacht ff.");
//delay(3000);
delay(600000);// 10 minuten
}