SHT31 senzor je I2C (Inter Integrated Circuit ili I2C) za mjerenje temperature i vlažnosti zraka. Komunikaciju sa senzororom se koristi I2C sabirnica Arduina. Arduino UNO ima jednu a Arduino Mega 250 dvije I2C sabirnice. Na jednu sabirnicu je moguće spojiti onoliko I2C uređaja koliko je moguće definisati različitih adresa. Kada govorimo o SHT31 senzoru, moguće je definisti dvije različite adrese i time, na jednu I2C sabirnicu, povezati maksimalno dva senzora.
I mali ESP8266-01 može komunicirati sa I2C uređajima.
Za povezivanje SHT31 senzora na ESP8266 su potrebne Wire.h i SHT31.h. Odmah moram napomenuti da verzija 0.4 i 0.5 biblioteke SHT31.h nisu kompatibilne. Kôd pisan za verziju 0.4 ne radi na SHT31.h V0.5.
Ovdje ću dati primjere kôda termometra sa ESP8266 in SHT31 za obje verzije biblioteke SHT31.h.
Kada je riječ o povezivanju samog ESP8266 modula, napajanje mora biti 3.3V,uz CHIP_EN pin spojen na +3.3V, (5V će uništiti ESP modul) iako bez problema radi na Li-Ion bateriju 3.7V. SHT31 senzor se povezuje na ESP8266 prema šemi ispod:
Električna šema spoja je na slici ispod:
SHT31 senzor temperature i vlage se povezuje pomoću četiri žice - dvije za napajanje i dvije za I2C komunikaciju Važno je napomenuti da SHT31 može raditi na 3.3V ali i na 5V. Međutim, budući da ESP8266 može raditi samo na 3.3V SHT31 sam priključio na 3.3V - isto napajanje od ESP modula.
Šema na slikama iznad predstavlja WiFi termometar napajan Li-Ion baterijom napona 3.7V koji mjeri temperaturu i vlažnost i rezultate prikazuje na web stranici koja se 'vrti' na vlastitom web serveru. Izmjerena temperatura i vlažnost su prikazani kao na slici ispod.
Prikaz rezultata se automatski osvježava svako 5 sekudni zahvaljujući sljedećoj lliniji:
// Omogući automatsko vraćanje na početnu stranicu nakon 5s
klijent.println("<meta http-equiv = \"refresh\" content = \"5; url = http://192.168.1.180\" />");
Prva verzija kôda termometra sa ESP8266 in SHT31 senzorom je za SHT31.h biblioteku V0.4:
//////////////////////////////////////////////////////////
// ESP8266 web server termometar sa SHT31 I2C senzorom. //
// Web server prikazuje temperaturu i vlažnost koje //
// ESP8266, svake sekunde, očitava sa SHT31 senzora //
// //
// ESP8266 i SHT31 se napajaju iz Li-ion bateerije 3.7V //
// Prikaz web servera se osvježava automatski svakih 5s //
// //
// ESP8266-01 pinout //
// //
// SHT31 pinout //
// VIN --> +3.3V //
// GND --> GND //
// GPIO2 --> SCL //
// GPIO0 --> SAA //
// AD nije potrebno spajati //
// //
// Verzija: 1.0.0. //
// Datum: 21. V 2023. //
// //
// Autor: Samir Gutić, http://amicus.ba //
// Maj 2023. //
//////////////////////////////////////////////////////////
#include <ESP8266WiFi.h>
#include "Wire.h"
#include "SHT31.h" // Biblioteka V0.4
// Definisanje I2C adrese za SHT31 senzor
// Za adresu 0x45 je potrebno D pin priključiti na +3.3V
#define SHT31_ADDRESS 0x44
// Pokretanje SHT senzora
SHT31 sht;
uint32_t neuspjeleKomunikacije = 0;
// Podaci za prijavu na lokalnu WiFi mrežu
const char* ssidWiFi = "WiFi_AP";
const char* passwordWiFi = "WiFiPassword";
// Definisanje mrežnih parametara WiFi modula
IPAddress ParkingLedServerIP(192, 168, 1, 180);
IPAddress ParkingLedServerGateway(192, 168, 1, 1);
IPAddress ParkingLedServerSubnet(255, 255, 255, 0);
// Port na kojem radi web server
byte portWiFi=80;
// Definisanje web servera
WiFiServer serverWiFi(portWiFi);
void setup()
{
//Wire.begin();
Wire.pins(0, 2);
Wire.begin(0, 2);
// Pokreni SHT31 senzor na podešenoj adresi
sht.begin(SHT31_ADDRESS);
Wire.setClock(100000);
// Očitaj status SHT31 senzora
uint16_t stat = sht.readStatus();
// WiFi konfiguracija i povezivanje
// Konfigurisanje statične IP adrese, subnet-a i gateway-a
WiFi.config(ParkingLedServerIP, ParkingLedServerSubnet, ParkingLedServerGateway);
// Definisanje station i access point modusa (ESP kao access point i povezan na lokalni WiFi router)
WiFi.mode(WIFI_STA);
// Povezivanje na WiFi access point sa upisanim SSID i šifrom
WiFi.begin(ssidWiFi, passwordWiFi);
// Povezivanje za lokalni WiFi
while (WiFi.waitForConnectResult() != WL_CONNECTED)
{
//Serial.println("Konekcija nije uspjela! Restart...");
delay(5000);
ESP.restart(); // Restartuj ESP nakon 5s ako nema konekcije na lokalni WiFi
}
// Pokreni web serverWiFi
serverWiFi.begin();
}
void loop()
{
// WiFi web server
// Provjeriti da li je WiFi klijent povezan
WiFiClient klijent = serverWiFi.accept();
// Vrati odgovor
klijent.println("HTTP/1.1 200 OK");
klijent.println("Content-type:text/html;charset=UTF-8"); // Zatim ide tip sadržaja tako da klijent zna šta dolazi i charset da se omogući znakova šđčćž (UTF).
klijent.println("Content-Type: text/html");
klijent.println(""); // Ne zaboraviti praznu liniju
klijent.println("<!DOCTYPE HTML>");
klijent.println("<html>");
// CSS za stiliziranje prikaza
klijent.println("<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}");
klijent.println("{text-decoration: none; font-size: 15px; margin: 2px;}");
klijent.println("</style>");
// Naslov prikazane Web stranice
klijent.println("<title>ESP8266 + SHT31</title>");
// Linija
klijent.println("<hr>");
if (sht.isConnected())
{
bool b = sht.read(); // default = true/fast slow = false
// Provjera postojanja greške na SHT31 senzoru
int error = sht.getError();
// Očitavanje statusa SHT31 senzora
uint16_t stat = sht.readStatus();
// Ispis izmjerenih podataka na web serveru
klijent.println("<h1> Temperatura = " + String(sht.getTemperature(), 2) + "˚C"); // Očitaj temperaturu
klijent.println("<br>");
klijent.println("<h1> Vlažnost = " + String(sht.getHumidity(),2) + "%"); // Očitaj vlažnost
klijent.println("<hr>");
}
else
{
// Broji neuspjele komunikacije
neuspjeleKomunikacije++;
klijent.println("<hr>");
klijent.println("<h3> Neuspjelih komunikacija = " + String(neuspjeleKomunikacije));
klijent.println("<hr>");
}
delay(1000);
// Omogući automatsko vraćanje na početnu stranicu nakon 5s
klijent.println("<meta http-equiv = \"refresh\" content = \"5; url = http://192.168.1.180\" />");
klijent.println("</html>");
}
Druga verzija kôda je za SHT31.h biblioteku V0.5:
//////////////////////////////////////////////////////////
// ESP8266 web server termometar sa SHT31 I2C senzorom. //
// Web server prikazuje temperaturu i vlažnost koje //
// ESP8266, svake sekunde, očitava sa SHT31 senzora //
// //
// ESP8266 i SHT31 se napajaju iz Li-ion bateerije 3.7V //
// Prikaz web servera se osvježava automatski svakih 5s //
// //
// ESP8266-01 pinout //
// //
// SHT31 pinout //
// VIN --> +3.3V //
// GND --> GND //
// GPIO2 --> SCL //
// GPIO0 --> SAA //
// AD nije potrebno spajati //
// //
// Verzija: 1.1.2. //
// Datum: 28. I 2024. //
// //
// Autor: Samir Gutić, http://amicus.ba //
// Maj 2023. //
//////////////////////////////////////////////////////////
#include <ESP8266WiFi.h>
#include "Wire.h"
#include "SHT31.h" // Biblioteka V0.5
// Definisanje I2C adrese za SHT31 senzor
// Za adresu 0x45 je potrebno D pin priključiti na +3.3V
#define SHT31_1 0x44 // AD nije potrebno spajati
// Pokretanje SHT senzora
SHT31 sht(SHT31_1, &Wire);
bool boolSht; // Deklaracija boolean varijable za praćenje uspješnosti povezivanja sa SHT31 senzorom
uint32_t neuspjeleKomunikacije = 0; // Varijabla za brojanje neuspjelih komunikacija sa SHT31 senzorom
// Podaci za prijavu na lokalnu WiFi mrežu
const char* ssidWiFi = "WiFi_AP";
const char* passwordWiFi = "WiFiPassword";
// Definisanje mrežnih parametara WiFi modula
IPAddress ParkingLedServerIP(192, 168, 1, 180);
IPAddress ParkingLedServerGateway(192, 168, 1, 1);
IPAddress ParkingLedServerSubnet(255, 255, 255, 0);
// Port na kojem radi web server za parking LED server (WiFi web server)
byte portWiFi=80;
// Definisanje web servera za parking LED server (WiFi web server)
WiFiServer serverWiFi(portWiFi);
void setup()
{
// I2C komunikacija
Wire.pins(0, 2); // Definiši pinove za SDA i SCL (int SDA, int SCL)
Wire.begin(); // Pokreni I2C komunikaciju
// Pokreni SHT31 senzor na podešenoj adresi
boolSht = sht.begin();
// Definiši I2C clock
Wire.setClock(100000);
// Očitaj status SHT31 senzora
uint16_t stat = sht.readStatus();
// WiFi konfiguracija i povezivanje
// Konfigurisanje statične IP adrese, subnet-a i gateway-a
WiFi.config(ParkingLedServerIP, ParkingLedServerSubnet, ParkingLedServerGateway);
// Definisanje station i access point modusa (ESP kao access point i povezan na lokalni WiFi router)
WiFi.mode(WIFI_STA);
// Povezivanje na WiFi access point sa upisanim SSID i šifrom
WiFi.begin(ssidWiFi, passwordWiFi);
// Povezivanje za lokalni WiFi
while (WiFi.waitForConnectResult() != WL_CONNECTED)
{
//Serial.println("Konekcija nije uspjela! Restart...");
delay(5000);
ESP.restart(); // Restartuj ESP nakon 5s ako nema konekcije na lokalni WiFi
}
// Pokreni web serverWiFi
serverWiFi.begin();
}
void loop()
{
// WiFi web server
// Provjeriti da li je WiFi klijent povezan
WiFiClient klijent = serverWiFi.accept();
// Vrati odgovor
klijent.println("HTTP/1.1 200 OK");
klijent.println("Content-type:text/html;charset=UTF-8"); // Zatim ide tip sadržaja tako da klijent zna šta dolazi i charset da se omogući znakova šđčćž (UTF).
klijent.println("Content-Type: text/html");
klijent.println(""); // Ne zaboraviti praznu liniju
klijent.println("<!DOCTYPE HTML>");
klijent.println("<html>");
// CSS za stiliziranje prikaza
klijent.println("<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}");
klijent.println("{text-decoration: none; font-size: 15px; margin: 2px;}");
klijent.println("</style>");
// Naslov prikazane Web stranice
klijent.println("<title>ESP8266 + SHT31</title>");
// Linija
klijent.println("<hr>");
if (sht.isConnected())
{
bool b = sht.read(); // default = true (fast) slow = false
// Provjera postojanja greške na SHT31 senzoru
int error = sht.getError();
// Očitavanje statusa SHT31 senzora
uint16_t stat = sht.readStatus();
// Ispis izmjerenih podataka na web serveru
klijent.println("<h1> Temperatura: " + String(sht.getTemperature(), 2) + "˚C"); // Očitaj temperaturu
klijent.println("<br>");
klijent.println("<h1> Vlažnost: " + String(sht.getHumidity(),2) + "%"); // Očitaj vlažnost
klijent.println("<hr>");
}
else
{
// Broji neuspjele komunikacije
neuspjeleKomunikacije++;
klijent.println("<hr>");
klijent.println("<h3> Neuspjelih komunikacija = " + String(neuspjeleKomunikacije));
klijent.println("<hr>");
}
delay(1000);
// Omogući automatsko vraćanje na početnu stranicu nakon 5s
klijent.println("<meta http-equiv = \"refresh\" content = \"5; url = http://192.168.1.180\" />");
klijent.println("</html>");
}
Razlike između ova dva Arduino sketcha su sljedeće:
Zbog toga što sam uradio update biblioteke SHT31 sa 0.4 na 0.5. u starom sketch-u se javljala greška "no matching function for call to 'SHT31::begin(int)'"
Prvo je bilo potrebno je bilo promijeniti deklaracije i inicijalizaciju SHT31 senzora.
Dodano je:
// Definisanje adrese SHT31 senzora
#define SHT31_1 0x44
// Deklaracija boolean varijabli za praćenje uspješnosti povezivanja sa SHT31 senzorom
bool boolShtIn;
Sljedeća deklaracija:
// Definisanje varijabli za očitavanje unutrašnjeg i vanjskog senzora SHT31
SHT31 sht; // Senzor vlažnosti i temperature SHT31
je zamijenjena sa:
// Definisanje varijabli za očitavanje unutrašnjeg i vanjskog senzora SHT31
SHT31 sht(SHT31_1, &Wire);; // Senzor vlažnosti i temperature SHT31
Potom je:
//sht.begin(0x44); // I2C adresa SHT31 senzora (AD na GND)
zamijenjeno sa:
Wire.begin(); // Initialise I2C communication as MASTER
// Za SHT31 senzor
boolSht = sht.begin(); // I2C adresa SHT31 senzora
Nakon svih iznad prikazanih izmjena, sketch z amjerenje temperature i vlažnosti pomoću SHT31 senzora je počeo raditi i sa novom SHT31 bibliotekom (verzija 0.5).
Potrebne komponente:
1 x ESP8266-01 modul
1x SHT31 senzor
Žice za spajanje
Napomena:
U primjeru iznad je korišten klon SHT31 senzora (ne originalni Adafruit senzor) jer je puno jeftiniji iako je na šemi iznad slika originalnog Adafruit senzora.