ESP8266 WiFi mooduli programmeerimine – salvestame andmed pilve

Käesolev artikkel on teine osa ESP8266 WiFi mooduli programmeerimisest kasutades Arduino IDE‘et ning ESP8266 moodulit. Näidiskoodi ja ühenduse jaoks kasutan ESP8266 ESP-07 moodulit. Sellest kuidas seda moodulit ühendada ja programmi peale panna saab lugeda esimesest artiklist selles seerias.

Seekord ühendan mooduli reaalselt WiFi võrku (internetti) ning salvestan ThingsSpeak.com veebis loodavasse kanalisse andmeid iga 16 sekundi järel. Tehniliselt oleks siis tegu data loggeriga mis edastab logitavad andmed pilve. Väärtused mis sinna salvestame tulevad mooduli ainsast analoog sisendist ADC. Testimiseks kasutan potentsiomeeterit millega saan reguleerida ADC klemmi sisendpinget. Selle abil saab testida graafiku tekkimist vastavalt potentsiomeetrist keeratud väärtusele.

Kanali ette valmistamine ThingsSpeak.com lehel

Siin artiklis kasutan thingsspeak.com pakutavat teenust logitavate andmete hoidmiseks. Selleks, et server teaks kellega on tegu ning mis kanalisse saadetavad andmed salvestada kasutan siinses näites “Write API key” võtit.

Kõigepealt tuleb luua sinna lehele konto ning siis lisada kanal. Kanali lisamine käib menüüst valides “My Channels -> New channel”. Kanalile saab anda nime ning määrata mitu andmerida ühte ajahetke salvestada saab.

ThingsSpeak lehel kanali loomine
ThingsSpeak lehel kanali loomine

Kui kanal on loodud tuleb sealt leida “API keys” tab ning kopeerida sealt “Write API key” võtme programmi näidiskoodi apiKey muutujasse.

Loodud kanali API võtmed
Loodud kanali API võtmed

Ühendamine WiFi võrguga

Selleks pole vaja muud kui anda ette salasõna ning WiFi võrgu nimi millesse ühendada. Kõige lihtsam on see kood panna setup() osasse.

void setup() {
  // Kasutades võrgu nime ning salasõna alustame ühendamist
  WiFi.begin( "wifi võrgu nimi", "wifi salasõna" );
  
  // Ootame kuni ühendus on WiFi võrguga saavutatud, kontrollides
  // iga poole sekundi järel, et kas ühendus on juba olemas
  while ( WiFi.status() != WL_CONNECTED ) {
    delay( 500 );
  }
  
}

Skeem ja peale laetav kood

Skeem on sisuliselt sama mis esimeses postituses aga nüüd olen siia lisanud potentsiomeetri ning eemaldanud LED’i ja programmaatori. Järgnev skeem näitab kuidas on ühendatud potentsiomeeter ADC klemmile. ADC klemm muundab sellele rakendatud pinge (0V -1V) digitaalseks väärtuseks vahemikus 0 – 1023 mida saab reguleerida sinna lisatud potentsiomeetriga.

Tähelepanu. ADC sisend loeb pinget vahemikus 0V – 1V.  Seega peame enne potentsiomeetrit lisama voltage divider’i mis pinge eelnevalt 1V peale muudaks. Näiteks 230 ja 100 oomise takistiga.

Esp8266 programmeerimine, skeem potentsiomeetriga
Esp8266 programmeerimine, skeem potentsiomeetriga

Näidiskood mis iga 16 sekundi mõõdumise järel saadab analoog sisendi väärtuse thingsspeak lehel loodud kanalisse.

#include <ESP8266WiFi.h>

// Siia läheb WiFi nimi ja parool kuhu ühendada
const char* ssid = "wifi võrgu nimi";
const char* password = "wifi parool";

// thingspeak.com lehel loodud kanali API "Write API key" võti
const char* apiKey = "PTG..........WY";

// thingspeak.com API aadress ja pordi number
const char* thingsSpeakApiAddress = "api.thingspeak.com";
const int httpPort = 80;

// Siin hoiame väärtust mida hakkame saatma serverisse
int value = 0;

// päringu veebiaadress / url
String requestUrl = "";


void setup() {
  // Kõigepealt ühendame ESP8266 mooduli WiFi võrkku 
  // eelnevalt defineeritud ligipääse kasutades. 
  WiFi.begin( ssid, password );
  
  // Ja ootame kuni ühendus on saavutatud
  while ( WiFi.status() != WL_CONNECTED ) {
    delay( 500 );
  }
}


void loop() {
  // Loeme ADC / TOUT klemmilt analoog väärtuse ( 0 - 1023 ) vahemikus. 
  value = analogRead( A0 );
  
  // Kasutame WiFiClient klassiTCP ühenduse loomise jaoks serveriga
  WiFiClient client;
  if ( !client.connect( thingsSpeakApiAddress , httpPort) ) {
    //ühendamine serveriga ebaõnnestus, katkestame
    return;
  }
  
  // Loome veebiaadressi mille abil salvestame uue info. Selleks kasutame 
  // API aadressi ning meie kanali võtit. 
  requestUrl = "/update/";
  requestUrl += "?api_key=";
  requestUrl += apiKey;

  // Pärginu url'i lõppu lisame meie ainsa välja väärtuse "field1" näol. 
  requestUrl += "&field1=";
  requestUrl += value;
  
  // Nüüd teeme reaalse http päringu serverisse
  client.print( String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + thingsSpeakApiAddress + "\r\n" + 
               "Connection: close\r\n\r\n");

  // ootame kuni API server vastab
  unsigned long timeout = millis();
  while ( client.available() == 0 ) {
    if ( millis() - timeout > 5000 ) {
      // Vastust ei tulnud 5 sekundi jooksul, katkestame
      client.stop();
      return;
    }
  }

  // thingspeak.com lehel on andmete uuendamine limiteeritud 1 
  // korra peale 15 sekundi jooksul. Seega ootame iga saatmise
  // järel 16000 millisekundit ehk 16 sekunit. 
  delay(16000);
}


Tulemus

Kui kõik õigesti läks siis peaks pilve hakkama iga 16 sekundi jooksul lisanduma uus väärtus graafikule. Potentsiomeetrit keerates hakkab joonistuma välja graafik.

Graafik potentsiomeetri väärtustega mis salvestasime test kanalisse.
Graafik potentsiomeetri väärtustega mis salvestasime test kanalisse.

Selle postituse eesmärk oli vaid näidata kuidas saab andmeid lihtsalt internetti logida. Hetkel me selle infoga rohkem midagi peale ei hakka.