Windmesser über Thinkspeak auslesen

Hier ist der Sketch meine Polnischen Kollegen.

#include <OneWire.h>

//Prosty przykład implementacji ESP8266 z termometrem DS18B20 x2
//Wysyłka pomiarów na serwery Thingspeak
//avrland.it

#include <ESP8266WiFi.h>
#include <OneWire.h>


//USTAWIENIA
OneWire  ds(2);  // numer pinu do którego podpięto czujnik
const char* ssid     = ""; //<- SSID Twojej sieci
const char* password = ""; //<- Hasło do Twojej sieci
const char* host = "api.thingspeak.com"; //adres ThingSpeak
const String api_key = ""; //klucz API
//KONIEC USTAWIEŃ

//ZMIENNE DLA POMIARÓW
byte i;
byte present = 0;
byte type_s;
byte data[12];
byte addr[8];
float celsius;
float kanal1, kanal2, kanal3, kanal4, kanal5, kanal6, kanal7, kanal8; //zmienne przechowywujące wartość pomiaru
byte czujnik1[8], czujnik2[8], czujnik3[8], czujnik4[8], czujnik5[8], czujnik6[8], czujnik7[8], czujnik8[8]; //zmienne na potrzeby przechowywania adresów obecnych czujników 
//KONIEC ZMIENNYCH DLA POMIARÓW


void setup() {
  Serial.begin(115200);
  delay(10);
  Serial.println();
  Serial.println("Termometr DS18B20 IoT @ Thingspeak");
  Serial.println();
  Serial.print("Lacze do ");
  Serial.println(ssid);
  WiFi.mode(WIFI_STA); //we don't want to broadcast SSID so we put ESP8266 to standalone mode
  WiFi.begin(ssid, password);
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi polaczone");  
  Serial.println("Adres IP: ");
  Serial.println(WiFi.localIP());
  /*
   * Sekwencja uzyskiwania adresów czujników
   */
  ds.search(czujnik1);
  ds.search(czujnik2);
  ds.search(czujnik3);
  ds.search(czujnik4);
  ds.search(czujnik5);
  ds.search(czujnik6);
  ds.search(czujnik7);
  ds.search(czujnik8);
  Serial.print("ROM czujnik pierwszy =");
  for( i = 0; i < 8; i++) {
    Serial.write(' ');
    Serial.print(czujnik1[i], HEX);
  }
  Serial.println("");
  Serial.print("ROM czujnik drugi =");
   for( i = 0; i < 8; i++) {
    Serial.write(' ');
    Serial.print(czujnik2[i], HEX);
  }
  Serial.println("");
  Serial.print("ROM czujnik trzeci =");
   for( i = 0; i < 8; i++) {
    Serial.write(' ');
    Serial.print(czujnik3[i], HEX);
  }
  Serial.println("");
  Serial.print("ROM czujnik czwarty =");
   for( i = 0; i < 8; i++) {
    Serial.write(' ');
    Serial.print(czujnik4[i], HEX);
  }
  Serial.println("");
  Serial.print("ROM czujnik piaty =");
   for( i = 0; i < 8; i++) {
    Serial.write(' ');
    Serial.print(czujnik5[i], HEX);
  }
  Serial.println("");
  Serial.print("ROM czujnik szosty =");
   for( i = 0; i < 8; i++) {
    Serial.write(' ');
    Serial.print(czujnik6[i], HEX);
  }
  Serial.println("");
  Serial.print("ROM czujnik siodmy =");
   for( i = 0; i < 8; i++) {
    Serial.write(' ');
    Serial.print(czujnik7[i], HEX);
  }
  Serial.println("");
  Serial.print("ROM czujnik osmy =");
   for( i = 0; i < 8; i++) {
    Serial.write(' ');
    Serial.print(czujnik8[i], HEX);
  }
  Serial.println("");
}
/*##############
*  PĘTLA GŁÓWNA
*/
void loop() {
    kanal1 = pomiar(czujnik1); //zmierz temperature na pierwszym czujniku
    kanal2 = pomiar(czujnik2); //zmierz temperature na drugim czujniku
    kanal3 = pomiar(czujnik3); //zmierz temperature na trzecim czujniku
    kanal4 = pomiar(czujnik4); //zmierz temperature na czwartym czujniku
    kanal5 = pomiar(czujnik5); //zmierz temperature na piatym czujniku
    kanal6 = pomiar(czujnik6); //zmierz temperature na szostym czujniku
    kanal7 = pomiar(czujnik7); //zmierz temperature na siodmym czujniku
    kanal8 = pomiar(czujnik8); //zmierz temperature na osmym czujniku
    wyslij_pomiar(kanal1, kanal2, kanal3, kanal4, kanal5, kanal6, kanal7, kanal8, api_key); //wyslij pomiar
}

/*
 * Wysyłka pomiaru do Thingspeak
 * field1 - wartość na pierwszy wykres
 * field2 - wartość na drugi wykres
 * field3 - wartość na trzeci wykres
 * field4 - wartość na czwarty wykres
 * field5 - wartość na piaty wykres
 * field6 - wartość na szosty wykres
 * field7 - wartość na siodmy wykres
 * field8 - wartość na osmy wykres
 * api_key - klucz api
 */
void wyslij_pomiar(float field1, float field2, float field3, float field4, float field5, float field6, float field7, float field8, String api_key){
    Serial.print("Laczymy do: ");
    Serial.println(host);
    // Use WiFiClient class to create TCP connections
    WiFiClient client;
    const int httpPort = 80;
    if (!client.connect(host, httpPort)) {
    Serial.println("connection failed");
    //return 0;
    }
    String url = "/update?key=" + api_key + "&field1="; //<- TU WKLEJ KOD DO API
    url += (String)field1;
    url+= "&field2=" + (String)field2;
    url+= "&field3=" + (String)field3;
    url+= "&field4=" + (String)field4;
    url+= "&field5=" + (String)field5;
    url+= "&field6=" + (String)field6;
    url+= "&field7=" + (String)field7;
    url+= "&field8=" + (String)field8;
    Serial.print("Requesting URL: ");
    Serial.println(url);
    
    // This will send the request to the server
    client.print(String("GET ") + url + " HTTP/1.1\r\n" +
             "Host: " + host + "\r\n" + 
             "Connection: close\r\n\r\n");
    delay(10);
    
    // Read all the lines of the reply from server and print them to Serial
    while(client.available()){
         String line = client.readStringUntil('\r');
         Serial.print(line);
    }
    
    Serial.println();
    Serial.println("##############################");
    Serial.println("KONIEC POMIARU");
    Serial.println("##############################");
    delay(3000);
}
/*
 * POMIAR DS18B20
 * 
 * adres - 8 bitowy adres czujnika
 */
float pomiar(byte adres[8]){ 
  ds.reset();
  ds.select(adres);
  ds.write(0x44, 1);        // start conversion, with parasite power on at the end
  
  delay(1000);     // maybe 750ms is enough, maybe not
  // we might do a ds.depower() here, but the reset will take care of it.
  
  present = ds.reset();
  ds.select(adres);    
  ds.write(0xBE);         // Read Scratchpad

  Serial.print("  Data = ");
  Serial.print(present, HEX);
  Serial.print(" ");
  for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = ds.read();
    Serial.print(data[i], HEX);
    Serial.print(" ");
  }
  Serial.print(" CRC=");
  Serial.print(OneWire::crc8(data, 8), HEX);
  Serial.println();

  // Convert the data to actual temperature
  // because the result is a 16 bit signed integer, it should
  // be stored to an "int16_t" type, which is always 16 bits
  // even when compiled on a 32 bit processor.
  int16_t raw = (data[1] << 8) | data[0];
  if (type_s) {
    raw = raw << 3; // 9 bit resolution default
    if (data[7] == 0x10) {
      // "count remain" gives full 12 bit resolution
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  } else {
    byte cfg = (data[4] & 0x60);
    // at lower res, the low bits are undefined, so let's zero them
    if (cfg == 0x00) raw = raw & ~7;  // 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
    else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
    //// default is 12 bit resolution, 750 ms conversion time
  }
  celsius = (float)raw / 17.56;
  Serial.print("  Temperature  = ");
  Serial.println(celsius);
  return celsius;
}