Pro základní funkčnost, zpříjemnění používání webu, analytické účely a v případě udělení souhlasu také pro účely cílení reklamy využíváme soubory cookies. Nastavení vlastních preferencí cookies můžete kdykoli upravit odkazem ve spodní části stránek.

KONTAKTY

MonkeyTech
Ing. Karel Mencl
Dohnalova 552, 411 08 Štětí
tel: 602 133 240
napište nám

ZBOŽÍ V AKCI

naše cena 1 990 Kč
skladem

NEJPRODÁVANĚJŠÍ


Teploměr HOBBY edice - instalace Arduino

 

 

Jednou z příjemných možností je programovat WiFi teploměr (HOBBY edici) prostřednictvím vývojového prostředí Arduino a to díky projektu Arduino core for ESP8266 WiFi chip.

 

Jak postupovat?

 

Nejprve nainstalujte nejnovější vývojové prostředí ze stránek Arduino.cc.Ve vývojovém prostředí v nabídce „Soubor -> Vlastnosti“ zadejte do pole „Additional Board Manager URLs“ následující odkaz:

https://arduino.esp8266.com/stable/package_esp8266com_index.json

 

Aduino_setup1

 

V menu „Nástroje -> Vývojová deska -> Boards Manager…“ vyberte „esp8266 by ESP8266 Community" a tlačítko „Instalovat“.

 

Arduino install ESP

 

Následně v menu „Nástroje -> Vývojová deska“ vyberte NodeMCU 1.0 (ESP-12E Module) a nezapomeňte vybrat správný sériový port (COM) připojeného zařízení (WiFi teploměru).

 

ESP

 

Program nahráváme obvyklým způsobem Ctrl+U, nebo příslušnou položkou v liště nebo v menu. Pro monitoring (výpis na sériový port) je vhodné používat „Sériový monitor“ (Ctrl+Shift+M).

 

Následuje jednoduchý příklad, který bliká dvoubarevnou diodou. Ve výchozím stavu bliká dioda modře, po stisknutí tlačítka SETUP bliká červeně:

/*
  Blink example
 */

#define BlueLED 12
#define RedLED 13
#define Button 14
#define Jack1 4
#define Jack2 5

void setup() {
  // initialize pin
  pinMode(BlueLED, OUTPUT); 
  pinMode(RedLED, OUTPUT); 
  pinMode(Button, INPUT_PULLUP);
}

void loop() {
  // main code, run repeatedly:
  if(digitalRead(Button)==HIGH) {  // LOW = button is pressed
    digitalWrite(BlueLED, HIGH);   // turn the LED on
    delay(250);                    // wait for 250ms
    digitalWrite(BlueLED, LOW);    // turn the LED off
    delay(250);                    // wait for 250ms
  }
  else {
    digitalWrite(RedLED, HIGH);   // turn the LED on
    delay(250);                   // wait for 250ms
    digitalWrite(RedLED, LOW);    // turn the LED off
    delay(250);                   // wait for 250ms
  }    
}

 

Další příklad vypisuje do sériového monitoru připojená 1-wire teplotní čidla:

 

#include <OneWire.h>

/*
  OneWire example
  OneWire DS18S20, DS18B20, DS1822 Temperature Example

  https://www.pjrc.com/teensy/td_libs_OneWire.html
  
  The DallasTemperature library can do all this work for you!
  
  https://milesburton.com/Dallas_Temperature_Control_Library
*/

#define BlueLED 12
#define RedLED 13
#define Button 14
#define Jack1 4
#define Jack2 5


OneWire  ds(Jack1);  // on GPIO4

void setup(void) {
  Serial.begin(9600);
}

void loop(void) {
  byte i;
  byte present = 0;
  byte type_s;
  byte data[12];
  byte addr[8];
  float celsius, fahrenheit;
  
  if ( !ds.search(addr)) {
    Serial.println("No more addresses.");
    Serial.println();
    ds.reset_search();
    delay(250);
    return;
  }
  
  Serial.print("ROM =");
  for( i = 0; i < 8; i++) {
    Serial.write(' ');
    Serial.print(addr[i], HEX);
  }

  if (OneWire::crc8(addr, 7) != addr[7]) {
      Serial.println("CRC is not valid!");
      return;
  }
  Serial.println();
 
  // the first ROM byte indicates which chip
  switch (addr[0]) {
    case 0x10:
      Serial.println("  Chip = DS18S20");  // or old DS1820
      type_s = 1;
      break;
    case 0x28:
      Serial.println("  Chip = DS18B20");
      type_s = 0;
      break;
    case 0x22:
      Serial.println("  Chip = DS1822");
      type_s = 0;
      break;
    default:
      Serial.println("Device is not a DS18x20 family device.");
      return;
  } 

  ds.reset();
  ds.select(addr);
  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(addr);    
  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 / 16.0;
  fahrenheit = celsius * 1.8 + 32.0;
  Serial.print("  Temperature = ");
  Serial.print(celsius);
  Serial.print(" Celsius, ");
  Serial.print(fahrenheit);
  Serial.println(" Fahrenheit");
}

 

Následující příklad odesílá v pravidelných intervalech naměřenou teplou do portálu TMEP.cz:

 

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


#define BlueLED 12
#define RedLED 13
#define Button 14
#define Jack1 4
#define Jack2 5

const char* ssid     = "your-ssid";
const char* password = "your-password";
const char* host = "test.tmep.cz";
const char* GUID   = "12345";

OneWire  ds(Jack1);

void setup() {
  pinMode(BlueLED, OUTPUT); 
  pinMode(RedLED, OUTPUT); 
  pinMode(Button, INPUT_PULLUP);
  pinMode(Jack1, OUTPUT);
  pinMode(Jack2, OUTPUT);  
  digitalWrite(Jack1, LOW); 
  digitalWrite(Jack2, LOW); 
  digitalWrite(BlueLED, LOW);
  digitalWrite(RedLED, LOW);

  Serial.begin(9600);
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    digitalWrite(BlueLED, LOW);  
    delay(250); 
    digitalWrite(BlueLED, HIGH);
    delay(250); 
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");  
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

void loop() {
  byte present = 0;
  byte data[12];
  byte addr[8];
  float celsius;
  char temperature[10];

  digitalWrite(BlueLED, LOW);
  ds.reset();
  ds.skip();
  ds.write(0x44, 1);
  delay(250);
  present = ds.reset();
  ds.skip();   
  ds.write(0xBE);  
  if (present) {
    for (byte i = 0; i < 9; i++) {
      data[i] = ds.read();
    }
    int16_t raw = (data[1] << 8) | data[0];
    byte cfg = (data[4] & 0x60);
    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
    celsius = (float)raw / 16.0;
    Serial.print("Temperature = ");
    Serial.print(celsius);
    Serial.println(" C");
    dtostrf(celsius, 4, 3, temperature);
    Serial.print("Connecting to ");
    Serial.println(host);
    WiFiClient client;
    const int httpPort = 80;
    if (!client.connect(host, httpPort)) {
      Serial.println("Connection failed");
      digitalWrite(RedLED, HIGH);
    }
    else {
      String url = "/?";
      url += GUID;
      url += "=";
      url += temperature;
      Serial.print("Requesting URL: ");
      Serial.println(url);
      client.print(String("GET ") + url + " HTTP/1.1\r\n" +
                    "Host: " + host + "\r\n" + 
                    "Connection: close\r\n\r\n");
      delay(50);
      while(client.available()){
        String line = client.readStringUntil('\r');
        // Serial.print(line);
      }
      //Serial.println();
      Serial.println("Closing connection");
      digitalWrite(BlueLED, HIGH);
    }
  }
  else {
    digitalWrite(RedLED, HIGH);
    Serial.println("Sensor not found!");
  }
  delay(55000);
  digitalWrite(RedLED, LOW);
}

 

 

Nastavení v portálu TMEP.cz upravte doménu, GUID a typ čidla. Následující nastavení odpovídá příkladu:

 

TMEP.cz setup

 

domena

 

GUID

 

Typ čidla: Obecné

 

 

 

Příklady ke stažení: ESP_TME_Example.zip


NÁZORY A DOTAZY NÁVŠTĚVNÍKŮ