Support http://amicus.ba with small donation

Arduino, u AREF spoju kao termometar, može izmjerenu temperaturu prikazivati na vlastitom web serveru koji je dostupan svim uređajima koji su u istoj LAN mreži kao i Arduino.Ako Arduino ima pristup internetu, onda je očitavanje izmjeren temperature moguće sa bilo koje lokacije na svijetu.

Na slici ispod je primjer Arduino termometra sa termistorom u AREF spoju koji izmjerenu temperaturu prikazuje na vastitom web serveru.

Termistor termometar AREF web server

Budući da su izmjerene temperature prikazane na web serveru, to je potrebno izvršiti spajanje Arduino ploče na LAN mrežu. U primjeru iznad je to izvršeno pomoću LAN shield-a (mrežni modul sa RJ45 konektorom), ali je princip rada isti i za slučaj WiFi konekcije.

Za ostvarivanje mrežne komunikacije putem ethernet shield-a, u sketch je potrebno uključiti biblioteku Ethernet.h

Ispod je kôd sketch-a koji vrši mjerenje temperature pomoću termistora u AREF spoju prikaz mjerenih vrijednosti na vlasitom web serveru (kopirajte kompletan kôd ispod u Arduino IDE prozor i upload-ujte ga na Arduino) :

/*
 * MJERENJE TEMPERATURE UZ POMOĆ TERMISTORA
 * I PRIKAZ TEMPERATURE NA WEB SERVERU
 *
 * Autor: Samir Gutić
 * URL: http://amicus.ba
 * Datum: 9. IV 2017.
 */

// Uključivanje biblioteka
#include <SPI.h>
#include <Ethernet.h>

float floatSuma;
float floatProsjek;
float floatOtpor;
float floatTemperatura;

//Vrijeme refreširanja prikaza temperature
#define intOdgoda 1000

//Pin za analogno očitavanje
#define pinAnalogTerm  A1

//Vrijednost rednog otpornika u omima
#define redniOtpor 9900  

//Broj očitavanja za računanje prosječne vrijednosti
#define intBrCitanja 5

//Otpor na 20.6 stepeni C
#define intTermistorNa25 12080   

//Nominalna temperatura  
#define intNominalnaTemp 20.6  
 
//Beta koeficijent termistora (obično 3000-4000)
#define intBetaKoeficijent 4016.032


// Web server
// Upisati MAC i IP adresu ethernet shield-a
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
IPAddress ip(192, 168, 1, 100);

// Inicijalizacija Ethernet server biblioteke sa IP adresom i željenim portom
// (port 80 je default za HTTP ali je moguće izabrati i drugi port):
EthernetServer server(80);

void setup()
{

Serial.begin(9600);

  //Spojiti AREF na 3.3V i koristiti za napajanje (manje smetnji nego na 5V)
  analogReference(EXTERNAL);

  // Pokretanje Ethernet konekcije i servera
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("Web server je na IP adresi ");
  Serial.println(Ethernet.localIP());
}

void loop()
{
  //Očitavanje vrijednosti sa termistora
  floatSuma = 0;
  for (int i=0; i<intBrCitanja; i++)
  {
    floatSuma = floatSuma+analogRead(pinAnalogTerm);
    delay(10);
  }
   
  //Računanje prosječne vrijednosti u zadnjih intBrCitanja očitavanje
  floatProsjek = floatSuma/intBrCitanja;
 
  //Konverzija vrijednosti u otpor
  floatOtpor = redniOtpor*floatProsjek/(1023-floatProsjek);
 
  // Steinhart-Hart metod računanja
  floatTemperatura = floatOtpor / intTermistorNa25;          // (R/Ro)
  floatTemperatura = log(floatTemperatura);                  // ln(R/Ro)
  floatTemperatura = floatTemperatura/intBetaKoeficijent;    // 1/B * ln(R/Ro)
  floatTemperatura = floatTemperatura+1.0 / (intNominalnaTemp + 273.15); // + (1/To)
  floatTemperatura = 1.0 / floatTemperatura;                 // Invertovati vrijednost
  floatTemperatura = floatTemperatura-273.15;                // Konverzija u stepene C
 
  //Prikaz temperature
  Serial.print("Temperatura ");
  Serial.print(floatTemperatura);
  Serial.println("C");
  Serial.println("--------------------");

  // Osluškivanje konekcija klijenata
  EthernetClient client = server.available();
  if (client)
  {
    Serial.println("Novi klijent");
    
    // http zahtjev se završava praznom linijom
    boolean currentLineIsBlank = true;
    while (client.connected())
    {
      if (client.available())
      {
        char c = client.read();
        Serial.write(c);
        
        // Ako ste došli do kraja linije (primljen znak za novu liniju), http zahtjev je završen.
        // Tada je potrebno poslati odgovor
        if (c == '\n' && currentLineIsBlank)
        {
          // Poslati zaglavlje standardnog http odgovora
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");  // Konekcija će biti zatvorena nakon završetka odgovora
          client.println("Refresh: 5");  // Automatski refreširati stranicu svakih 5 sekundi
          client.println();

          // Kreirati i poslati web stranicu
          client.println("<!DOCTYPE html>");
          client.println("<html>");
          client.println("<head>");
          client.println("<title>Amicus web termometar</title>"); // Ime web stranice (prikazano u zaglavlju web browser-a)
          client.println("</head>");
          client.println("<body>");
          client.println("<h1>Pozdrav od http://amicus.ba</h1>"); // Naslov (prva linija) prikazane web stranice
          client.println("<p>Prikaz temperature putem Arduino web servera</p>"); // Linija teksta ispod naslova
          client.println("<p>Vrijednost se refrešira svakih 5 sekundi</p>");

          // Ispis poruke i izmjerene temperature na web server
          client.print("Temperatura je: ");
          client.print(floatTemperatura);
          client.print("C");
          client.println("</body>");
          client.println("</html>");
          break;
        }
        
        if (c == '\n')
        {
          // Ako pokrećete novu liniju
          currentLineIsBlank = true;
        }
        else if (c != '\r')
        {
          // Primljen je znak u trenutnoj liniji
          currentLineIsBlank = false;
        }
      }
    }
    
    // Dati web browser-u vrijeme da primi podatke
    delay(1);
    
    // Zatvoriti konekciju
    client.stop();
    Serial.println("Klijent je diskonektovan");
  }    
 
  delay(intOdgoda);
}

Više datalja o termistoru možete pronaći u članku Arduino termistor termometar (AREF) sa upisom na SD karticu.

Budući da sam već objašnjavao princip rada termomtra sa termistorom u AREF spoju, ovdje neću govoriti o tome. Novost je korištenje ethernet shield-a i način prikaza izmjerene temperature.

Ethernet shield se jednostavno postavi na Arduino pločicu tako da se ulazno/izlazni pinovi kao i pinovi za napajanje prenesu na ethernet shield (budući da više nisu dostupni ispod ploče ethernet shield-a).

Potrebno je upisati MAC i IP adresu ethernet shield-a kao i web port na kome će biti dostupan prikaz izmjerene temperature. Default port je 80, ali je moguće definisati i neki drugi ako je to neophodno.

// Web server
// Upisati MAC i IP adresu ethernet shield-a
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
IPAddress ip(192, 168, 1, 100);

// Inicijalizacija Ethernet server biblioteke sa IP adresom i željenim portom
// (port 80 je default za HTTP ali je moguće izabrati i drugi port):
EthernetServer server(80);

Nakon toga, u void setup() proceduri pokrenuti mrežnu konekciju i web server pomoću sljedećeg kôda:

// Pokretanje Ethernet konekcije i servera
Ethernet.begin(mac, ip);
server.begin();

U sketch-u iznad je pokrenuta i  serijska komunikacija ali za rad termometra i web servera nije neophodna. Služi samo za ispis informacija na serial monitor.

Nakon izračuna vrijednosti izmjerene temperature dolazi dio generisanja web stranice i prikaza izmjerene vrijednosti. U ovom slučaju je web stranica generisana dinamički, pa je prilično jednostavna. Moguće je, prije kreiranu web stranicu snimiti na SD karticu te je učitavati sa kartice.

Arduino web termometar - screenshot sa mobitelaNa slici liejevo je screenshot posjete arduino web serveru sa mobitela (browser Firefox).

U web browser je potrebno upisati IP Arduino servera definisanog na početku sketch-a (u ovom primjeru 192.168.1.100) nakon čega će, ako je Arduino uspješno povezan na istu LAN mrežu na kojoj je mobitel, biti prikazan sadržaj kao na slici lijevo.

U sketch-u je definisano da se prikaz automatski osvježava svakih 5 sekundi.

Arduino web termometar - screenshot sa PC-aNa slici desno je screenshot posjete Arduino web serveru sa PC-a (ponovo Firefox web browser).

Podaci su potpuno isti, ali postoji manja razlika u formatiranju teksta što i nije previše bitno.

Napominjem još jednom da Arduino i mobitel/računar kojim pristupamo web serveru moraju biti u istoj LAN mreži. Ako nisu, jedini način da se pristupi Arduino web serveru je putem rutiranja između dvije mreže. U primjeru iznad je Arduino ethernet shield, UTP kablom, spojen na RJ45 port WiFi router-a dok su mobitel i računar, na isti router, konektovani preko WiFi konekcije.

Drugi način je da se Arduino web serveru omogući izlaz na internet, na router-u koji je gateway za internet kreira redirekt porta 80 na IP adresu koju ima Arduino ethernet shield čime će svako ko poznaje WAN IP vašeg router-a, putem interneta moći pristupiti Arduino web serveru i očitati izmjerenu temperaturu.

Ovim se već otvara široko polje upotrebe Arduino mikrokontrolera za dvosmjernu komunikaciju i izgradnju smart uređaja u kući.

Ako imate interent konekciju sa promjenljivom vanjskom IP adresom (što je vrlo čest slučaj) onda bi, za pristup Arduino web serveru preko interneta, svaki puta bilo potrebno saznati trenutnu IP adresu. Rješenje za taj problem je upotreba besplatnog DNS servera čime dobijate web adresu (umjesto IP-a) pomoću koje se prostupa Arduino web serveru. Sve informacije u vezi besplatnog DNS servera možete pronaći u članku Besplatni DNS server na dtdns.com. Ako vaš router podržava automatsko izvršavanje skripti time ste riješili problem promjenljive IP adrese.

U slučaju da router nije u stanju sam uraditi update IP adrese na dtdns.com, onda je rješenje besplatni program koji sam kreirao za ručni update IP adrese na dtnds.com. Opis programa kao i downlaod link je u članku updateDTDNS - program za update dtdns host-a.

Šema spoja elemenata kreirana u Fritzing programu je na slici ispod (Arduino ploča je ispod ethernet shield-a).

Termistor termometar AREF web server breadboard

Električna šema spoja je na sljedećoj slici.

Termistor termometar AREF web server - električna šema

Potrebne komponente:

1 x Arduino UNO

1 x Breadboard (mala)

1x NTC termistor 12.08KΩ na 25ºC

1x otpornik 10KΩ

1 x Ethernet shield

Žice za spajanje

9V napajanje