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;
}