Sistem logare functionare sistem ventilatie industrial

Obiectiv

Logarea functionarii unui sistem industrial de ventilatie. Ventilatorul folosit (deja instalat) este de 10 kW, alimentat la 220V. Cerinta este de a monitoriza functionarea acestuia de-a lungul timpului.

Hardware

Am ales sa folosesc urmatoarele :

 

Senzorul de curent non-invaziv

 

Un senzor de curent non-invaziv reprezinta o modalitate excelenta de a masura consumul unui aparat alimentat la priza de 220V.

Foarte scurt, bobina senzorului se trece in jurul unuia dintre firele de alimentare de 220 (nul sau faza), iar curentul alternativ de 220V induce in bobina senzorului un curent alternativ, care este masurat folosind placa Arduino, pe un rezistor de sarcina.

Un pic mai pe lung, tensiunea indusa in bobina este o tensiune alternativa, iar nivelele de tensiune sunt centrate pe zero (exista atat tensiuni pozitive, cat si negative). Arduino nu se descurca cu tensiuni negative. Solutia este un divizor de tensiune creat folosind 2 rezistoare de 10 K, si folosirea tensiunii de 2.5 V astfel obtinute pentru a centra tensiunea citita pe nivelul de 2.5V (in loc de zero).

Daca esti curios sa intelegi mai multe despre cum functioneaza senzorul, arunca un ochi aici – https://learn.openenergymonitor.org/electricity-monitoring/ct-sensors/interface-with-arduino?redirected=true

Daca nu, si tot ce vrei este sa obtii ceva functional, vezi mai jos.

Senzorul de curent este prevazut din fabrica cu un jack audio, cu trei pini de iesire (central, mijloc si camasa). O varianta simpla este sa tai jack-ul si astfel sa ai acces la cele trei fire. Din cele trei, doar doua sunt utile (conectate la bobina senzorului), al treilea nu este folosit. Ca sa iti dai seama care sunt cele doua fire pe care le vei folosi, cel mai simplu este sa folosesti un ohmetru. Cauta perechea de fire intre care masori o rezistenta de cateva sute de ohm (rezistenta bobinei). Intre oricare alte doua fire este o rezistenta extrem de mare.

Realizeaza circuitul de mai sus pe un breadboard, sau pe o placa cu gauri .

 

Arunca un ochi si aici, pentru ceva explicatii mai in detaliu – https://learn.sparkfun.com/tutorials/environmental-monitoring-with-the-tessel-2

Am folosit in plus si un LCD Shield pentru debug, sau pentru situatia in care nu imi functioneaza internet-ul si vreau totusi sa vad valoarea citita de senzor – https://www.robofun.ro/shield-lcd-16×2?search=lcd%20shield

Codul sursa

Este disponibil integral pe github – https://github.com/viorelspinu/senzor-curent, sau mai jos.

In codul de mai jos, va trebuie sa inlocuiesti TOKEN cu o valoare valida de identificare de senzor obtinut gratuit din http://iot.robofun.ro/ . Vezi si http://iot.robofun.ro/doc .

 

#include "LiquidCrystal.h"
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
#include "SPI.h"
#include "Ethernet2.h"
byte mac[] = { 0x90, 0xA2, 0xDA, 0x10, 0xE1, 0xEE };
EthernetClient client;
char server[] = "iot.robofun.ro";

bool isInternet = true;

void setup() {
  Serial.begin(9600);
  lcd.begin(16, 2);
  lcd.setCursor(0, 0);
  lcd.print("START INTERNET..");

  if (Ethernet.begin(mac) == 0) {
    isInternet = false;
    lcd.setCursor(0, 0);
    lcd.print("                ");
    lcd.setCursor(0, 0);
    lcd.print("NO INTERNET");
  } else {
    isInternet = true;
    Serial.println(Ethernet.localIP());
    lcd.setCursor(0, 0);
    lcd.print("                ");
    lcd.setCursor(0, 0);
    lcd.print(Ethernet.localIP());
  }
}

int oldVal = 0;
long iotUpdateTime = 0;
void loop() {
  int val = readCurrent();

  if (val < 16) { val = 0; } if (oldVal != val) { if (oldVal == 0) { iotUpdateTime = millis(); sendIOT(oldVal); sendIOT(val); } if (oldVal != 0) { if ((millis() - iotUpdateTime) > 60 * 10000) {
        iotUpdateTime = millis();
        sendIOT(val);
      }
    }

    if (val == 0){
        iotUpdateTime = millis();
        sendIOT(oldVal);
        sendIOT(val);
    }
    
    oldVal = val;
  }

  Serial.println(val);
  lcd.setCursor(0, 1);
  lcd.print("     ");
  lcd.setCursor(0, 1);
  lcd.print(val);

  delay(10);
}


void sendIOT(int val) {

  if (isInternet) {
    String temp = "GET /api/v1/senzor/TOKEN/input?value=" + String(val) + " HTTP/1.1";
    char param[100];
    temp.toCharArray(param, temp.length() + 1);

    if (client.connect(server, 80)) {
      client.println(param);
      client.println("Host: iot.robofun.ro");
      client.println("User - Agent: arduino - ethernet");
      client.println("Connection: close");
      client.println();
      Serial.println("GET DONE");
    }
    client.stop();
  }
}

int readCurrent() {
  long minim = 1023;
  long maxim = 0;
  for (int i = 0; i < 500; i++) { int v = analogRead(0); if (minim > v) {
      minim = v;
    }
    if (maxim < v) {
      maxim = v;
    }
  }
  return maxim - minim;
}




Sistem IOT monitorizare temperatura si umiditatea solului

 

Obiectiv 

Am dezvoltat acest sistem pentru un prieten care are o casa la tara, unde are o mica gradina. Nu locuieste acolo tot timpul, si vrea sa stie daca este sau nu cazul sa irige gradina.

Arhitectura

Ca sa aiba acces la date de oriunde, am ales sa trimit datele in Internet folosind http://iot.robofun.ro .

Mai jos este graficul temperaturii, in timp real :

http://iot.robofun.ro/public/senzor/8rr6e9r8sag76t0vnkrcrnp4ml

In acest moment datele masurate sunt publice. Intra pe http://iot.robofun.ro si foloseste “Testeaza Cont Demo”.

Pentru nodul care face efectiv masurarea valorilor am ales :

Arduino Pro Mini 3.3 V https://www.robofun.ro/arduino_pro_mini_328_8mhz 

  • am ales asta pentru ca este o placa care consuma extrem de putin in sleep mode, ceea ce imi permite sa o alimentez pe baterii

Modul Radio RFM69  – https://www.robofun.ro/sparkfun-rfm69-breakout-434mhz-

Senzor Umiditate Sol https://www.robofun.ro/soil-moisture-sensor

Senzor de Temperatura Inlantuibil Brick – https://www.robofun.ro/senzor-temperatura-inlantuibil-brick-DS18B20-motherboard

Senzor de Temperatura DS18B20+ – https://www.robofun.ro/senzor-temperatura-DS18B20

  • am ales senzorii de temperatura inlantuibili pentru ca folosind doar 3 fire pot monta oricat de multi senzori (pe aceleasi 3 fire).  Distanta intre Arduino si senzori poate ajunge la cateva sute de metri.

Cutie 6 baterii AA – https://www.robofun.ro/cutie-6-baterii

As fi putut sa pun direct un modul wifi si sa renunt la WIFI, dar m-am gandit ca poate in viitor voi vrea sa extind sistemul cu mai multi senzori pus in zone in care nu bate WIFI-ul din casa.

 

Pentru gateway (sistemul catre trimite valorile in cloud) am ales :

Arduino YUN  – https://www.robofun.ro/arduino_yun

Sunt multe lucruri care imi plac tare la acest dispozitiv :

  • este foarte robusta, de fiecare data a mers exact cum trebuie, in toate proiectele unde am folosit-o; libraria este bine scrisa, simplu de folosit
  • are atat conectivitate WIFI cat si prin fir de retea
  • setarea datelor de retea WIFI se face foarte foarte simplu, fara sa fie nevoie sa reprogramez placa; acest punct a fost unul esential pentru mine, pentru ca era cam aiurea sa ii cer amicului sa-mi dea parola lui de WIFI ca sa o pun eu in cod; folosind Arduino YUN, te conectezi la o retea generata chiar de placa si din interfata web de configurare (intri folosind telefonul mobil intr-un site web) setezi tot ce vrei; un exemplu mai clar aici – https://www.youtube.com/watch?v=9-hPhWHWnvs 

Modul Radio RFM69  – https://www.robofun.ro/sparkfun-rfm69-breakout-434mhz-

  • pentru receptia datelor trimise de nod

Arduino Pro Mini 3.3 V https://www.robofun.ro/arduino_pro_mini_328_8mhz 

  • dat fiind ca modulul radio functioneaza maxim la 3.3V, iar Arduino YUN functioneaza la 5V, am mai folosit inca un Arduino Pro Mini 3.3V pentru interfatare; Arduino Pro Mini este conectat la modulul radio (3.3V ambele), iar apoi trimite datele printr-o conexiune SoftwareSerial catre Arduino YUN. Dat fiind ca doar trimite date catre YUN (si nu si receptioneaza date inapoi), este OK din punct de vedere al nivelelor de tensiune. “1” logic este trimis de catre Arduino Pro Mini ca 3.3V, iar YUN interpreteaza si el tot ca “1” logic acest nivel, chiar daca functioneaza la 5V.

 

  • folosirea unui Arduino Pro Mini pe post de convertor de nivel logic (asa cum am facut eu) nu este chiar cea mai desteapta idee 🙂 Iti recomand sa folosesti un device special gandit pentru asta – https://www.robofun.ro/logic-level-convertor-4-canale-bidirectional . Daca folosesti un logic level convertor poti sa faci transmisie radio in ambele sensuri (si de la nod catre YUN si de la YUN catre nod). Eu nu l-am folosit pentru ca in momentul in care am realizat proiectul nu am avut unul la indemana.

 

Nodul care citeste datele

Conexiunile Arduino Pro Mini – modul radio

Senzorul de temperatura (motherboard – https://www.robofun.ro/senzor-temperatura-inlantuibil-brick-DS18B20-motherboard) l-am conectat cu pinul DQ la pinul 6 digital Arduino Pro Mini. GND si 5V le-am conectat la GND, respectiv 3.3 V (chiar daca pe placa este specificat 5V ca tensiune de alimentare, senzorul merge foarte OK si la 3.3 V).

Senzorul de umiditate a solului l-am cuplat pe pinul analogic 0 (VCC la 3.3 V, GND la GND si SIG la pinul analog 0 al placii Arduino Pro Mini).

Sistemul l-am alimentat folosind cutia de baterii (pinii GND si RAW).

Pentru a citi nivelul bateriei (ca sa stiu cand trebuie sa le schimb), am realizat un divizor de tensiune 1:3. Am folosit 3 rezistoare de 100 de K inseriate (legate unul in continuarea celuilalt). Capetele extreme le-am legat la pinul RAW si la pinul GND. Pinul analog 7 (se afla pe zona interioara a placii Arduino Pro Mini) l-am conectat dupa primul rezistor (numarand de la GND). Vezi poza de mai jos.

In acest mod voltajul bateriei (de 9V) este redus de 3 ori, pana la cel mult 3 V, astfel incat tensiunea sa poata fi citita de catre Arduino Pro Mini.

 

Codul sursa pentru nod

Codul sursa pentru nod este bazat pe exemplu Node din libraria pentru modulul radio RFM69.

Este disponibil integral, aici – https://github.com/viorelspinu/iot-sol-umiditate/blob/master/nod/nod.ino

Gateway-ul

Pentru gateway (sistemul care primeste datele prin radio si trimite in Internet) am folosit un Arduino Pro Mini + un modul radio RFM69 pe post de receptor radio, si un Arduino YUN pentru a trimite in Internet.

Am conectat pinul digital 8 al placii Arduino Pro Mini cu pinul digital 8 al placii Arduino YUN pentru a putea trimite datele receptionate prin radio de catre Arduino Pro Mini catre Arduino YUN.

Disclaimer :

  • folosirea unui Arduino Pro Mini pe post de convertor de nivel logic (asa cum am facut eu) nu este chiar cea mai desteapta idee 🙂 Iti recomand sa folosesti un device special gandit pentru asta – https://www.robofun.ro/logic-level-convertor-4-canale-bidirectional . Daca folosesti un logic level convertor poti sa faci transmisie radio in ambele sensuri (si de la nod catre YUN si de la YUN catre nod). Eu nu l-am folosit pentru ca in momentul in care am realizat proiectul nu am avut unul la indemana.

 

Codul sursa Arduino Pro Mini din gateway este disponibil integral, aici – https://github.com/viorelspinu/iot-sol-umiditate/blob/master/gateway/gateway.ino

 

Codul sursa Arduino YUN din gateway este disponibil integral, aici – https://github.com/viorelspinu/iot-sol-umiditate/blob/master/yun/yun.ino

HOT ! 10 (zece) proiecte cu Raspberry Pi 3, în format electronic pe Google Play

162 de pagini de proiecte cu placa Raspberry Pi 3, scrisă într-un limbaj foarte accesibil. Aceasta este ultima carte în limba română scrisă despre Raspberry Pi 3.

În acest moment este în pregătire varianta pe hârtie. Va fi disponibilă pe Robofun cam într-o săptămână. Până atunci, este disponibilă varianta digitală, cu reducere de mai mult de 50% (pe hârtie costul va fi de 39 RON, iar varianta digitală este doar 11.62 RON !).

 

 

 

 

 

 

 

Aici găsești varianta digitală –

https://play.google.com/store/books/details/Radu_Pietraru_10_zece_proiecte_cu_Raspberry_Pi_3?id=qOUpDwAAQBAJ.

 

Cuprinsul este disponibil mai jos.