Institut Tec. Rambla Prim - Curs 2017-18

INTERNET OF THINGS

INTERNET OF THINGS

Setmana 0-dll

1. Introducció a IoT. Prezi de presentació.

Arduino IDE 1.8.1 portable (500 MB), Intranet rPrimTech.

2. Possibles escenaris.

undefined

3. Primeres passes.

undefined

4. Disseny de la interfície de blynk:

undefined

undefined

5. Sketch d'Arduino.

6. Comprova el funcionament. Ensenya'l al professor.

Setmana 0-dv (actualitzada 12.02.2017)

1. Crea un nou projecte de blynk connectant al servidor amb la Raspberry Pi del rPrim Tech (192.168.1.222). Cal triar com a hardware l'Arduino Uno, connexió ethernet.

Ara crearem un interruptor per controlar la il·luminació principal d'un menjador , i un led indicador de l'estat real d'aquesta. A més a més un indicador de finestres obertes al menjador amb enviament de notificació, i un indicador de portes obertes amb enviament d'un email.

undefined

2. Afegeix un interruptor (Button widget configurat com switch) assignat al pin digital D3 per controlar la sortida Q3. Canvia el text que identifica aquest interruptor posant per exemple LL.MENJADOR, modifiqueu el color i canvieu el text ON OFF per unes emoticones adequades.

3. Afegeix un led (LED widget), assigna'l al pin virtual V3, modifica el text posant el mateix que el de l'interruptor o una emoticona indicativa i modificar el color del led.

4. Inclou un led i assigna'l al pin virtual V2. Aquest led indica l'estat de l'entrada I2 que estarà connectada als sensors de finestres obertes. Modifica el text i color (potser emoticones) perquè sigui més representatiu.

5. Inclou un altre led i assigna'l al pin virtual V8. Aquest led indica l'estat de l'entrada I8 que estarà connectada als sensors de portes obertes. Modifica el text i color (potser emoticones) perquè sigui més representatiu.

6. Afegeix el widget Notification i el widget email que habiliten l'enviament de notificacions i mails (un per minut).

7. Envia't per mail el token corresponent a aquest projecte i fes-lo servir en el següent sketch d'arduino:

 

 

Setmana 1-dll

1. Instal·la node.js al teu ordinador: 32 bits, 64 bits.

2. Instal·la node-red:

  • Obre en una finestra el Símbolo del sistema.
  • Aleshores escriu:
   npm install -g --unsafe-perm node-red
  • Un cop instal·lat, posem en marxa node-red:
   node-red
  • Per accedir a node-red amb el navegador apuntem a la IP del nostre ordinador http://localhost:1880
  • Ara aprofitarem i instal·larem nou nodes adicionals. Primer parem node-red amb Ctrl-C. Escriu el següents comandaments:

 

    npm install -g node-red-contrib-bigtimer
    npm install -g node-red-node-dweetio
    npm install -g node-red-contrib-thingspeak

7. Torna a posar en marxa node-red.

Ara aprendrem a utilitzar node-red.

8. Entreu i creeu una nova pestanya amb el vostre nom sense espais, per exemple JohnDoe. Per crear-la, tecla +, per renomenar-la, Flows-Rename.

9. Familiaritzeu-vos amb l'entorn fent un flow senzill com aquest:

undefined

10. Feu deploy perquè comenci a funcionar i comprova el seu funcionament,

11. Ara afegeix el següent:

undefined

12. Configura el node de sortida http request amb Method GET, i URL http://blynk-cloud.com/05dcb257652b49208396cb5f42dc00a4/update/D3?value=1. Això permet activar la sortida Q3 de l'Arduino del professor connectat al nuvol de blynk . Per actuar directament al teu Arduino, la URL és http://192.168.0.31:8080/elTeuToken/update/D3?value=1.

La IP és 192.168.0.31 perquè per accedir a la RPi des de fora del router amb el PC de classe, cal apuntar al router (192.168.0.31).

Afegim un altre flow per apagar la sortida Q3. Hauria de quedar així:

undefined

Comprova el funcionament.

13. Els flows es poden importar i exportar. Per fer-ho segueix les instruccions del professor.

 

Setmana 2-dll

1. Amb node-red automatitza l'encesa i apagada de Q3 de dilluns a divendres de 8:00 a 20:00 hores.

2. Ara amb node-red anem a realitzar una intermitència sobre la sortida Q9. Importeu el següent flow:

undefined

[{"id":"fe17e575.c972e","type":"function","z":"806f8919.cc60d8","name":"headers","func":" msg.headers = \n {\n \"Content-type\" : \"application/json\" \n };\n //msg.payload=\"[ \\\"0\\\"]\"\n return msg;","outputs":1,"noerr":0,"x":462.22222900390625,"y":881,"wires":[["fb5a3bc4.54ce1"]]},{"id":"e657b384.b49b2","type":"trigger","z":"806f8919.cc60d8","op1":"[ \"0\"]","op2":"[ \"1\"]","op1type":"str","op2type":"str","duration":"10","extend":false,"units":"s","reset":"","name":"","x":307.88885498046875,"y":880.8888549804688,"wires":[["fe17e575.c972e"]]},{"id":"20aae35b.f0704c","type":"inject","z":"806f8919.cc60d8","name":"DISPARA","topic":"","payload":"","payloadType":"date","repeat":"20","crontab":"","once":false,"x":141,"y":881.6666259765625,"wires":[["e657b384.b49b2"]]},{"id":"fb5a3bc4.54ce1","type":"http request","z":"806f8919.cc60d8","name":"ON-OFF Q9","method":"PUT","ret":"txt","url":"http://192.168.0.31:8080/elTeuToken/pin/D9","tls":"","x":636.8333129882812,"y":880.8333129882812,"wires":[[]]},{"id":"cd343d8b.51eb1","type":"comment","z":"806f8919.cc60d8","name":"INTERMITÈNCIA OUTPUT Q9","info":"","x":174,"y":845,"wires":[]}]

3. Al llarg d'aquesta setmana instal·lat l'app Telegram al mòbil (android o iphone), a l'ordinador, al chrome, o al firefox.

4. Analitza els avantatges d'aquesta aplicació respecte whatsapp, i creat un bot que més endavant et permetrà controlar el teu sistema domòtic. Tutorial.

AMPLIACIÓ PELS QUE COMENCEN AMB nodeMCU:

//IoT-nodeMCU-00.ino
//06-03-2017

#define BLYNK_PRINT Serial // Comment this out to disable prints and save space
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <SimpleTimer.h> // here is the SimpleTimer library

char auth[] = "elVostreToken";

void setup()
{
delay(500);
Serial.begin(115200);
Serial.println("Comencem....");
//Blynk.begin(auth, "IoT-2", "pitufito");//servidor Blynk
Blynk.begin(auth, "IoT-2", "pitufito", IPAddress(192,168,1,222));//servidor rPrim

}

void loop()
{
Blynk.run();
}

 

ARDUINO WEB SERVER

1. Instal·la l'Arduino IDE si no està al teu ordinador. Agafa una IOT-eth.

undefined

2. Instal·la manualment aquestes llibreries.

3. Càrrega a la placa IoT-eth el següent sketch, modificant els valors de network config per a la teva placa:

//  _2017_01_23_IoT-eth-web-server.ino
//  V1.0 23-01-2017
//  write by Jaume Nogues Gazquez
//  jnogues@gmail.com
//  Institut Tecnologic Rambla Prim, Barcelona
//
//  Internet of Things server node remote web controller
//  for use with openHAB
//  this node has:
//   4 digital outputs:
//                    Q3  ---> pin3  of arduino UNO
//                    Qa3 ---> pinA3 of arduino UNO
//                    Q7  ---> pin7  of arduino UNO
//                    Q9  ---> pin9  of arduino UNO
//   4 digital inputs:
//                    I2  ---> pin2  of arduino UNO
//                    Ia2 ---> pinA2 of arduino UNO
//                    I8  ---> pin8  of arduino UNO
//                    Ia1 ---> pinA1 of arduino UNO
//   1 analog inputs, betwen 0 and 5V, 0 to 1023, 10 bit precision:
//                    AI0 ---> pinA0 of arduino UNO
//             
//   2 pseudo analog outputs (pwm), 0 to 255, 8 bit precision:
//                    Q5 ---> pin5 of arduino UNO
//                    Q6 ---> pin6 of arduino UNO
//   If necessary 2 inputs/outputs more for I2C or general purpose Qa4 (SDA), Qa5 (SCL)
//   Servo to A5


#include <EtherCard.h>  //link??, library for the ethernet card based on enc28j60 chip, modificacio per UDP!!!!
//https://github.com/jcw/ethercard/issues/59   modify tcpip.cpp
////if ((dip[0] & 0xF0) == 0xE0 || *((unsigned long*) dip) == 0xFFFFFFFF || !memcmp(broadcastip,dip,IP_LEN))//modificat jnogues
#include <EEPROM.h>
#include <avr/wdt.h>
#include <DHT.h>  //adafruit, cal afegir adafruit unified sensor
#include <SimpleTimer.h>
#include <Servo.h>


//*************************************************************************//
//********************** network config ***********************************//
char nodeName[] = "IoT-eth 1-";
#define STATIC 1  // set to 1 to disable DHCP (adjust myip/gwip values below)
static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31};//31, 32, 33,32 
#if STATIC
static byte myip[] = {192,168,0,31}; //this is the ip of the node          
static byte gwip[] = {192,168,0,1 }; //gateway ip                          
#endif
byte nodeRedServer[]= { 192, 168, 0, 222};//openHAB server ip
const int udpPort=3000;
               
//*************************************************************************//
//********************** network config ***********************************//


#define DEBUGUEA 1 // set to 1 for output serial messages for debugging
#define DHTPIN 4
#define DHTTYPE DHT22   // DHT 22  (AM2302)
//#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);

byte Ethernet::buffer[500];
BufferFiller bfill;

SimpleTimer timer; // creem un temporitzador de tasques

char estat[50];
char strAI0[6];
char strHumedad[6]="0";
char strTemperatura[6]="0";
char strPWM5b[6]; //string for pwm5 value
char strPWM6b[6]; //string for pwm6 value
char strPWM5[6]; //string for pwm5 value
char strPWM6[6]; //string for pwm6 value
char strSERV[6];
int PWM5value=0;  //pwm5 adjust value variable
int PWM6value=0;  //pwm6 adjust value variable
int SERVvalue=0;
char strMinutes[8];
boolean publicaEstat=0;
char estatInputsAnt[4];
unsigned long esperaAI0=0;
int AI0valueAnterior=0;
char strIP[4];

boolean Q3 = 0;   //output pin3
boolean Qa3 = 0;  //output pinA3
boolean Q7 = 0;   //output pin7
boolean Q9 = 0;   //output pin9
boolean Qa4 = 0;   //output pin3
//boolean Qa5 = 0;   //output pin3
boolean Ia5 = 0;   //input pinA5
boolean I2 = 0;   //input pin2
boolean Ia2 = 0;  //input pinA2
boolean I8= 0;    //input pin8
boolean Ia1 = 0;  //input pinA1
boolean I2before=0;
boolean Ia2before=0;

int AI0value=0; //A0 analog read value variable

int minutesTime=0;
unsigned long millisWebServer=0;
unsigned long watchDogCounter=0;//counter for ENC28J69 watchdog
unsigned long sendMessageInterval=0;
boolean softReset=0;
byte commandOK=0;
unsigned long upTimeCounter=0;
unsigned long upTimeMinutes=0;
unsigned long upTimeHores=0;
unsigned long upTime=0;
unsigned long esperaDHT=0;
byte temperatura=0;
byte humitat=0;
unsigned long thingsCounter=0;
unsigned long xmppCounter=0;
unsigned long dweetCounter=0;
byte numberOfResets;
int eepromQ3=10;
int eepromQa3=11;
int eepromQ7=12;
int eepromQ9=13;
int eepromQa4=14;
//int eepromQa5=15;
int eepromPwm5=16;
int eepromPwm6=17;
int eepromResets=18;

Stash stash;
//Servo myservo; 

void setup() {
  wdt_disable();
  Serial.begin(57600); //starting serial port
  Serial.println(F("WebControl En marxa"));
  Serial.print(F("Free RAM:"));
  Serial.println(freeRam());
  numberOfResets=EEPROM.read(eepromResets);
  numberOfResets=numberOfResets+1;
  if (numberOfResets==255) numberOfResets=1;
    EEPROM.write(eepromResets, numberOfResets);
  Serial.print(F("Reset: "));
  Serial.println(numberOfResets);
  
  if (ether.begin(sizeof Ethernet::buffer, mymac, 10) == 0) 
     Serial.println(F( "Failed to access Ethernet controller"));
#if STATIC     
  ether.staticSetup(myip, gwip);
#else
  if (!ether.dhcpSetup())
    Serial.println("DHCP failed");
#endif 
  
  ether.printIp("IP:  ", ether.myip);
  ether.printIp("GW:  ", ether.gwip);  
  ether.printIp("DNS: ", ether.dnsip);
  ether.copyIp(ether.hisip, nodeRedServer);   
  ether.printIp("node-red: ", ether.hisip); 
  
  pinMode(3, OUTPUT);
  pinMode(A3, OUTPUT); 
  pinMode(7, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(A4, OUTPUT);
  
  
  Q3=EEPROM.read(eepromQ3);
  digitalWrite(3, Q3);
  Qa3=EEPROM.read(eepromQa3);
  digitalWrite(A3, Qa3);
  Q7=EEPROM.read(eepromQ7);
  digitalWrite(7, Q7);
  Q9=EEPROM.read(eepromQ9);
  digitalWrite(9, Q9);
  Qa4=EEPROM.read(eepromQa4);
  digitalWrite(A4, Qa4);
  //Qa5=EEPROM.read(eepromQa5);
  //digitalWrite(A5, Qa5);
 
  pinMode(2, INPUT);
  pinMode(A2, INPUT);
  pinMode(8, INPUT);
  pinMode(A1, INPUT);
  pinMode(A5, INPUT);
  PWM5value=EEPROM.read(eepromPwm5);
  analogWrite(5, PWM5value);
  PWM6value=EEPROM.read(eepromPwm6);
  analogWrite(6,PWM6value);
  AI0value=analogRead(A0);
  //AI0value = map (AI0value, 0, 1023, 0, 100);
  dht.begin();
  softReset=0;
  timer.setInterval(300L, pushButtons);
  timer.setInterval(10000L, analogInputChange);
  timer.setInterval(30000L, readDHT);
  //timer.setInterval(600000L, watchDogENC);
  timer.setInterval(60000L, upTimeCalc);
  //myservo.attach(A5);
  //myservo.write(90); 
  wdt_enable(WDTO_8S);
  publishIP();
  
}

//main program  
void loop() {
  if (softReset==1) software_Reset();
  wdt_reset();
  webServer();
  wdt_reset();
  publishEstat();
  timer.run();  
}


//functions
void webServer(){
  word pos=(ether.packetLoop(ether.packetReceive()));
  wdt_reset();
  if (pos) {
    millisWebServer=millis();
    #if DEBUGUEA
    Serial.print(F("pos="));
    Serial.println(pos);
    #endif
    
    bfill=ether.tcpOffset();
    char* data=(char *) Ethernet::buffer + pos;
    #if DEBUGUEA
    Serial.print("data=");
    Serial.println(data);
    #endif
    
    //sortida Q3
    if(strstr_P((char *)Ethernet::buffer + pos, PSTR("GET /q3on")) != 0) {
      Q3= 1;
      EEPROM.write(eepromQ3, Q3);
      commandOK=0;
    }
    else if(strstr_P((char *)Ethernet::buffer + pos, PSTR("GET /q3off")) != 0) {
      Q3 = 0;
      EEPROM.write(eepromQ3, Q3);
      commandOK=0;
    }    
    else if(strstr_P((char *)Ethernet::buffer + pos, PSTR("GET /q3tog")) != 0) {
      Q3 = !Q3;
      EEPROM.write(eepromQ3, Q3);
      commandOK=0;
    }   
    //sortida Qa3
    else if(strstr_P((char *)Ethernet::buffer + pos, PSTR("GET /qa3on")) != 0) {
      Qa3= 1;
      EEPROM.write(eepromQa3, Qa3);
      commandOK=0;
    }
    else if(strstr_P((char *)Ethernet::buffer + pos, PSTR("GET /qa3off")) != 0) {
      Qa3 = 0;
      EEPROM.write(eepromQa3, Qa3);
      commandOK=0;
    }
    else if(strstr_P((char *)Ethernet::buffer + pos, PSTR("GET /qa3tog")) != 0) {
      Qa3 = !Qa3;
      EEPROM.write(eepromQa3, Qa3);
      commandOK=0;
    }
    //sortida Q7
    else if(strstr_P((char *)Ethernet::buffer + pos, PSTR("GET /q7on")) != 0) {
      Q7= 1;
       EEPROM.write(eepromQ7, Q7);
      commandOK=0;
    }
    else if(strstr_P((char *)Ethernet::buffer + pos, PSTR("GET /q7off")) != 0) {
      Q7 = 0;
      EEPROM.write(eepromQ7, Q7);
      commandOK=0;
    }
    else if(strstr_P((char *)Ethernet::buffer + pos, PSTR("GET /q7tog")) != 0) {
      Q7 = !Q7;
      EEPROM.write(eepromQ7, Q7);
      publicaEstat=1;
      commandOK=0;
    }
    //sortida Q9
    else if(strstr_P((char *)Ethernet::buffer + pos, PSTR("GET /q9on")) != 0) {
      Q9= 1;
      EEPROM.write(eepromQ9, Q9);
      commandOK=0;
    }
    else if(strstr_P((char *)Ethernet::buffer + pos, PSTR("GET /q9off")) != 0) {
      Q9 = 0;
      EEPROM.write(eepromQ9, Q9);
      commandOK=0;
    }
    else if(strstr_P((char *)Ethernet::buffer + pos, PSTR("GET /q9tog")) != 0) {
      Q9 = !Q9;
      EEPROM.write(eepromQ9, Q9);
      publicaEstat=1;
      commandOK=0;
    }
    //sortida Qa4
    else if(strstr_P((char *)Ethernet::buffer + pos, PSTR("GET /qa4on")) != 0) {
      Qa4= 1;
      EEPROM.write(eepromQa4, Qa4);
      commandOK=0;
    }
    else if(strstr_P((char *)Ethernet::buffer + pos, PSTR("GET /qa4off")) != 0) {
      Qa4 = 0;
      EEPROM.write(eepromQa4, Qa4);
      commandOK=0;
    }
    else if(strstr_P((char *)Ethernet::buffer + pos, PSTR("GET /qa4tog")) != 0) {
      Qa4 = !Qa4;
      EEPROM.write(eepromQa4, Qa4);
      publicaEstat=1;
      commandOK=0;
    }
/*    //sortida Qa5
    else if(strstr_P((char *)Ethernet::buffer + pos, PSTR("GET /qa5on")) != 0) {
      Qa5= 1;
      EEPROM.write(eepromQa5, Qa5);
      commandOK=0;
    }
    else if(strstr_P((char *)Ethernet::buffer + pos, PSTR("GET /qa5off")) != 0) {
      Qa5 = 0;
      EEPROM.write(eepromQa5, Qa5);
      commandOK=0;
    }
    else if(strstr_P((char *)Ethernet::buffer + pos, PSTR("GET /qa5tog")) != 0) {
      Qa5 = !Qa5;
      EEPROM.write(eepromQa5, Qa5);
      publicaEstat=1;
      commandOK=0;
    }
*/    
    //all outputs on
    else if(strstr_P((char *)Ethernet::buffer + pos, PSTR("GET /allon")) != 0) {
      Q3=1;Qa3=1;Q7=1;Q9=1;Qa4=1;
      EEPROM.write(eepromQ3, Q3);
      EEPROM.write(eepromQa3, Qa3);
      EEPROM.write(eepromQ7, Q7);
      EEPROM.write(eepromQ9, Q9);
      EEPROM.write(eepromQa4, Qa4); 
      //EEPROM.write(eepromQa5, Qa5);
      commandOK=0;
    }
    //all outputs off
    else if(strstr_P((char *)Ethernet::buffer + pos, PSTR("GET /alloff")) != 0) {
      Q3=0;Qa3=0;Q7=0;Q9=0;Qa4=0;
      EEPROM.write(eepromQ3, Q3);
      EEPROM.write(eepromQa3, Qa3);
      EEPROM.write(eepromQ7, Q7);
      EEPROM.write(eepromQ9, Q9);
      EEPROM.write(eepromQa4, Qa4); 
      //EEPROM.write(eepromQa5, Qa5);
      commandOK=0;
    }
    //pwm5
    else if(strstr_P((char *)Ethernet::buffer + pos, PSTR("GET /pwm5")) != 0) {
      strPWM5[2]=data[12];
      strPWM5[1]=data[11];
      strPWM5[0]=data[10];
      if (strPWM5[2]=='H') strPWM5[2]=' ';
      PWM5value=atoi(strPWM5);
      if (PWM5value > 255) PWM5value=255; //limit it to 255
      byte pwm5=byte(PWM5value); //convert to byte
      analogWrite(5,pwm5); //write to output
      commandOK=0;
    }

    //pwm6
    else if(strstr_P((char *)Ethernet::buffer + pos, PSTR("GET /pwm6")) != 0) {
      strPWM6[2]=data[12];
      strPWM6[1]=data[11];
      strPWM6[0]=data[10];
      if (strPWM6[2]=='H') strPWM6[2]=' ';
      PWM6value=atoi(strPWM6);
      if (PWM6value > 255) PWM6value=255; //limit it to 255
      byte pwm6=byte(PWM6value); //convert to byte
      analogWrite(6,pwm6); //write to output
      commandOK=0;
    }

    //servo
    else if(strstr_P((char *)Ethernet::buffer + pos, PSTR("GET /serv")) != 0) {
      strSERV[2]=data[12];
      strSERV[1]=data[11];
      strSERV[0]=data[10];
      if (strSERV[2]=='H') strSERV[2]=' ';
      SERVvalue=atoi(strSERV);
      if (SERVvalue > 180) SERVvalue=180; //limit it to 180
      byte SERV=byte(SERVvalue); //convert to byte
      //myservo.write(SERV);
      commandOK=0;
    }

    //info
    else if(strstr_P((char *)Ethernet::buffer + pos, PSTR("GET /info")) != 0) {
     commandOK=0; 
    }
    //info2
    else if(strstr_P((char *)Ethernet::buffer + pos, PSTR("GET /inf")) != 0) {
     publicaEstat=1;
     commandOK=0; 
    }
    else if(strstr_P((char *)Ethernet::buffer + pos, PSTR("GET /reset")) != 0) {
      softReset=1;
      commandOK=0;
    }
    else if(strstr_P((char *)Ethernet::buffer + pos, PSTR("GET /noR")) != 0) {
      numberOfResets=EEPROM.read(eepromResets);
      commandOK=2;
    }
    else if(strstr_P((char *)Ethernet::buffer + pos, PSTR("GET /cnoR")) != 0) {
      EEPROM.write(eepromResets, 0);
      numberOfResets=EEPROM.read(eepromResets);
      commandOK=2;
    }

    else {
      commandOK=1;
    }
    if (commandOK==1){
      BufferFiller bfill = ether.tcpOffset();
      bfill.emit_p(PSTR("HTTP/1.1 200 OK\r\n"
       "Content-Type: text/html\r\n\r\n"
        "<html><head><title>IoT-ramblaPrim</title></head><body><h2>"
        "No entenc el comandament"  
        "</h2></body></html>"  
        ));    
      ether.httpServerReply(bfill.position());   
    }
    if (commandOK==0 & softReset==1){
      BufferFiller bfill = ether.tcpOffset();
      bfill.emit_p(PSTR("HTTP/1.1 200 OK\r\n"
       "Content-Type: text/html\r\n\r\n"
        "<html><head><title>IoT-ramblaPrim</title></head><body><h2>"
        "El node fara un reset" 
        "</h2></body></html>"  
        ));    
      ether.httpServerReply(bfill.position());
    }
    if (commandOK==0){
      digitalWrite(3, Q3);
      digitalWrite(A3, Qa3);
      digitalWrite(7, Q7);
      digitalWrite(9, Q9);
      digitalWrite(A4, Qa4);
      //digitalWrite(A5, Qa5);
      delay(20);//??per evitar penjades enc28j60?
      AI0value = analogRead(A0);
      //AI0value = map (AI0value, 0, 1023, 0, 100);
      I2 = digitalRead(2);
      Ia2 = digitalRead(A2);
      I8 = digitalRead(8);
      Ia1 = digitalRead(A1);
      Ia5 = digitalRead(A5);
      
      BufferFiller bfill = ether.tcpOffset();
      bfill.emit_p(PSTR("HTTP/1.1 200 OK\r\n"
       "Content-Type: text/html\r\n\r\n"
        "<html><head><title>IoT-ramblaPrim</title></head><body><h2>"
        "{Q3:$D;Qa3:$D;Q7:$D;Q9:$D;Qa4:$D;Ia5:$D;I2:$D;Ia2:$D;I8:$D;Ia1:$D;AI0:$D;T:$D;H:$D;PWM5:$D;PWM6:$D;uT:$D}"  
        "</h2></body></html>"  
        ), Q3,Qa3,Q7,Q9,Qa4,Ia5,I2,Ia2,I8,Ia1,AI0value,temperatura,humitat,PWM5value,PWM6value,upTimeMinutes);
      ether.httpServerReply(bfill.position());
    }
    
    if (commandOK==2){
      
      BufferFiller bfill = ether.tcpOffset();
      bfill.emit_p(PSTR("HTTP/1.1 200 OK\r\n"
       "Content-Type: text/html\r\n\r\n"
        "<html><head><title>IoT-ramblaPrim</title></head><body><h2>"
        "{Number of Resets: $D}"  
        "</h2></body></html>"  
        ), numberOfResets);
      ether.httpServerReply(bfill.position());
    }
      
    commandOK=0;//clear variable
  }
}

void watchDogENC()
{
    //ether.begin(sizeof Ethernet::buffer, mymac, 10);
    //ether.staticSetup(myip, gwip);
    ether.powerDown();
    delay(100);
    ether.powerUp();
    #if DEBUGUEA 
      Serial.println (F("reset ENC"));
    #endif
}

void software_Reset() // Restarts program from beginning but does not reset the peripherals and registers
{
asm volatile ("jmp 0");
}

void upTimeCalc()
{
    upTimeMinutes++;
    upTime++;
    if (upTime==60){
      upTime=0;
      upTimeHores++;
    }
}


void readDHT()
{
    float h = dht.readHumidity();
    humitat=byte(h);
    sprintf (strHumedad, "%u", humitat);
    // Read temperature as Celsius
    float t = dht.readTemperature();
    temperatura=byte(t);
    sprintf (strTemperatura, "%u", temperatura);
    publicaEstat=1;        
}

void publishEstat()
{
   if ((millis()-sendMessageInterval>60000) || publicaEstat==1){
      sendMessageInterval=millis();
      wdt_reset();
      //Serial.print(".");
      memset(estat,0,50);//esborra estat
      I2 = digitalRead(2);
      Ia2 = digitalRead(A2);
      I8 = digitalRead(8);
      Ia1 = digitalRead(A1);
      Ia5 = digitalRead(A5);
      //secondsTime=millis()/1000;
      minutesTime=millis()/60000;
      estat[0]=Q3+'0';
      estat[1]=';';
      estat[2]=Qa3+'0';
      estat[3]=';';
      estat[4]=Q7+'0';
      estat[5]=';';
      estat[6]=Q9+'0';
      estat[7]=';';
      estat[8]=Qa4+'0';
      estat[9]=';';
      estat[10]=Ia5+'0';
      estat[11]=';';
      estat[12]=I2+'0';
      estat[13]=';';
      estat[14]=Ia2+'0';
      estat[15]=';';
      estat[16]=I8+'0';
      estat[17]=';';
      estat[18]=Ia1+'0';
      estat[19]=';';
      AI0value = analogRead(A0);
      sprintf (strAI0, "%u", AI0value);
      strcat(estat,strAI0);
      strcat(estat,";");
      strcat(estat, strTemperatura);
      strcat(estat,";");
      strcat(estat, strHumedad);
      strcat(estat,";"); 
      sprintf (strPWM5b, "%u", PWM5value);
      strcat(estat,strPWM5b);
      strcat(estat,";");
      sprintf (strPWM6b, "%u", PWM6value);
      strcat(estat,strPWM6b);
      strcat(estat,";");
      sprintf (strMinutes, "%u", minutesTime);
      strcat(estat,strMinutes);
      ether.sendUdp(estat, sizeof estat, udpPort, nodeRedServer, udpPort);
      publicaEstat=0;
   }
}

void pushButtons(){ 
  if (estatInputsAnt[0]==0 && digitalRead(2)==1) {
    Q3=!Q3;
    digitalWrite(3,Q3);
    delay(100);
    EEPROM.write(eepromQ3, Q3);
    estatInputsAnt[0]=1;
    publicaEstat=1;   
    }
  if (estatInputsAnt[0]==1 && digitalRead(2)==0) {
    estatInputsAnt[0]=0;
    }
  
  if (estatInputsAnt[2]==0 && digitalRead(8)==1) {
    Qa3=!Qa3;
    digitalWrite(A3,Qa3);
    delay(100);
    EEPROM.write(eepromQa3, Qa3);
    estatInputsAnt[2]=1;
    publicaEstat=1;   
    }
  if (estatInputsAnt[2]==1 && digitalRead(8)==0) {
    estatInputsAnt[2]=0;
    }
  
  else if (estatInputsAnt[1]!=digitalRead(A2)) {
    estatInputsAnt[1]=digitalRead(A2);
    publicaEstat=1; 
    }
  
  else if (estatInputsAnt[3]!=digitalRead(A1)) {
    estatInputsAnt[3]=digitalRead(A1);
    publicaEstat=1; 
    }  
}

void analogInputChange() {
     wdt_reset();
     AI0value=analogRead(A0);
     //AI0value = map (AI0value, 0, 1023, 0, 100);
      if (AI0value != AI0valueAnterior){
         AI0valueAnterior=AI0value;
         publicaEstat=1;
       } 
}

void publishIP()
{
  memset(estat,0,50);//esborra estat
  strcat(estat, nodeName);
  sprintf (strIP, "%u", ether.myip[0]);
  strcat(estat, strIP);
  strcat(estat,".");
  sprintf (strIP, "%u", ether.myip[1]);
  strcat(estat, strIP);
  strcat(estat,".");
  sprintf (strIP, "%u", ether.myip[2]);
  strcat(estat, strIP);
  strcat(estat,".");
  sprintf (strIP, "%u", ether.myip[3]);
  strcat(estat, strIP);
  ether.sendUdp(estat, sizeof estat, udpPort, nodeRedServer, udpPort);
}

int freeRam () {
  extern int __heap_start, *__brkval; 
  int v; 
  return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval); 
}

4. Comprova el funcionament enviant algun comandament, per exemple http://192.168.0.XX/q3tog o bé http://192.168.0.XX/info

5. Executa tots els comandaments possibles per verificar el temps de resposta. Fes un ping a la teva placa.

6. Instal·la node-red al teu ordinador seguin aquestes passes:

  • Instal·la node.js; 32 bits, 64 bits.
  • Obre en una finestra el Símbolo del sistema.
  • Aleshores escriu:
   npm install -g --unsafe-perm node-red
  • Un cop instal·lat, posem en marxa node-red:
   node-red
  • Per accedir a node-red amb el navegador apuntem a la IP del nostre ordinador http://192.168.0.XX:1880 o be http://localhost:1880
  • Ara aprofitarem i instal·larem nou nodes adicionals. Primer parem node-red amb Ctrl-C. Escriu el següents comandaments:

 

    npm install -g node-red-node-xmpp
    npm install -g node-red-contrib-bigtimer
    npm install -g node-red-contrib-scheduler
    npm install -g node-red-node-dweetio
    npm install -g node-red-contrib-thingspeak

7. Torna a posar en marxa node-red.

8. Ara dissenyarem una encesa automàtica de receptors.

 

Home