Логер температури на ESP8266 + DS18B20 та ThingsPeak

Доброго дня всім. Ось і настав той вирішальний день коли я спробував що то таке Ардуино. Сьогодні збираємо логер температури на ESP8266 + DS18B20 та ThingsPeak.

temp logger

Спробувавши ESP8266 у зв’язці з керуючим контролером я вирішив спробувати написати власний код для цього модуля.

Є три варіанти середовища розробки для ESP8266:  Безпосереднє написання коду в середовищі Eclipse з сирцевим кодом SDK (здалось мені поки що складним), Lua скрипт використовуючи прошивку NodeMCU (трохи дивний і незручний для мене сінтаксіс кода),   Arduino IDE для програмування безпосередньо ESP8266 – оце спробуємо.

[adsense type=”banner”]

Налагоджуємо IDE:

 

Ось посилання як настроїти середовище

 http://iot-playground.com/2-uncategorised/38-esp8266-and-arduino-ide-blink-example

Та варіант російською:

http://esp8266.ru/arduino-ide-esp8266/

Реєструємось на ThingSpeak.com – Це такий сервер на якій ми будемо скидувати данні.

 

На даному етапі важливо скопіювати десь Write API Key на відео він на 1:41 хвилині

 

Пишемо скетч основа взята тут http://iot-playground.com/2-uncategorised/41-esp8266-ds18b20-temperature-sensor-arduino-ide

/*
 *  This sketch sends data via HTTP GET requests to data.sparkfun.com service.
 *
 *  You need to get streamId and privateKey at data.sparkfun.com and paste them
 *  below. Or just customize this script to talk to other HTTP servers.
 *
 */

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


#define ONE_WIRE_BUS 2  // DS18B20 pin
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature DS18B20(&oneWire);

const char* ssid     = "Konst";
const char* password = "";

const char* host = "api.thingspeak.com";
const char* APIkey   = "FQSPTF3RHFF9D3CE";


float oldTemp;



void setup() {
  Serial.begin(115200);
  delay(10);

  // We start by connecting to a WiFi network

  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}



void loop() {
  delay(30000);

  float temp;


  DS18B20.requestTemperatures();
  temp = DS18B20.getTempCByIndex(0);
  Serial.print("Temperature: ");
  Serial.println(temp);

  char charVal[12];

  dtostrf(temp, 8, 2, charVal);

  Serial.print("connecting to ");
  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;
  }




  // We now create a URI for the request
  String url = "/update?key=";
  url += APIkey;
  url += "&field1=";
  url += charVal;//String(temp);



  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("closing connection");
}

Де

const char* ssid = "Konst";
const char* password = "";

Поля де ви маєте ввести назву та пароль  WIFI точки.

const char* APIkey = "FQSPTF3RHFF9D3CE";

Той самий Write API Key

Компілюємо CTRL+R.

Збираємо схему для програмування.

 

Заливаємо прошивку кнопкою Upload в цей момент GIPIO 0 має бути підтягнутий до землі.

 

 

Датчик DS18B20 має бути під’єднаний за наступною схемою.

 

Запускаємо:

Якщо натиснути кнопку “serial monitor”

 

 

Можна бачити хід виконання програми.

Temperature: 27.50
connecting to api.thingspeak.com
Requesting URL: /update?key=FQSPTF3RHFF9D3CE&field1=27.50
closing connection
Temperature: 27.56
connecting to api.thingspeak.com
Requesting URL: /update?key=FQSPTF3RHFF9D3CE&field1=27.56
closing connection

Данні відіслані можна дивитись результат:

 

 

Данні можна як записувати так і читати швидкість обміну лімітована 15 сек на одну посилку. Тобто можна зробити чудову систему керування пристроями якщо вони не потребують миттєвої реакції. На цьому все дякую за увагу.

P.S. Ви також повинні змінити частину dtostrf функції ( ) у файлі core_esp8266_noniso.c
Щоб уникнути помилки, що я знайшов. Наприклад, температура була 24.06 , але dtostrf ( ) переводить її як 24,6 string.
Таким чином, ви повинні замінити

while(prec-- > 0) {
remainder *= 10.0;
}

на

while(prec-- > 0) {
        remainder *= 10.0;
        if((int)remainder == 0){
                *out = '0';
                 ++out;
        }
    }

Залишити відповідь