<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ca">
	<id>http://wiki.joanillo.org/index.php?action=history&amp;feed=atom&amp;title=Curs_4._0004990600_Internet_de_les_coses_%28IoT%29</id>
	<title>Curs 4. 0004990600 Internet de les coses (IoT) - Historial de revisió</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.joanillo.org/index.php?action=history&amp;feed=atom&amp;title=Curs_4._0004990600_Internet_de_les_coses_%28IoT%29"/>
	<link rel="alternate" type="text/html" href="http://wiki.joanillo.org/index.php?title=Curs_4._0004990600_Internet_de_les_coses_(IoT)&amp;action=history"/>
	<updated>2026-08-30T14:25:38Z</updated>
	<subtitle>Historial de revisió per a aquesta pàgina del wiki</subtitle>
	<generator>MediaWiki 1.34.2</generator>
	<entry>
		<id>http://wiki.joanillo.org/index.php?title=Curs_4._0004990600_Internet_de_les_coses_(IoT)&amp;diff=257576&amp;oldid=prev</id>
		<title>Joan: /* Jornada 4 */</title>
		<link rel="alternate" type="text/html" href="http://wiki.joanillo.org/index.php?title=Curs_4._0004990600_Internet_de_les_coses_(IoT)&amp;diff=257576&amp;oldid=prev"/>
		<updated>2018-07-03T00:08:17Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Jornada 4&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Pàgina nova&lt;/b&gt;&lt;/p&gt;&lt;div&gt;__TOC__&lt;br /&gt;
=Introducció=&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
jordibinefa@electronics.cat&lt;br /&gt;
25/6/2018 - 29/6/2018 (32 hores) de 9:00h a 14:00h&lt;br /&gt;
	INS Rambla Prim&lt;br /&gt;
C. Cristòbal de Moura, 223 (Barcelona) &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Continguts   	* Plaques amb microcontroladors&lt;br /&gt;
- Arduino Nano&lt;br /&gt;
- ESP8266&lt;br /&gt;
- ESP32&lt;br /&gt;
- Preparació de les eines de programació&lt;br /&gt;
* Sensors i actuadors&lt;br /&gt;
- Traductors bidireccionals dels nivells de senyal&lt;br /&gt;
- Sensors digitals d'entrada (teclats, tractament dels rebots)&lt;br /&gt;
- Actuadors (relés, motors de contínua, servomotors, motors pas a pas)&lt;br /&gt;
- BME280 (sensor de temperatura, humitat, pressió i altímetre)&lt;br /&gt;
- Pantalles LCD&lt;br /&gt;
- Pantalles OLED&lt;br /&gt;
* Protocols de comunicació entre els microcontroladors i els sensors i actuadors&lt;br /&gt;
- UART&lt;br /&gt;
- I2C (TWI)&lt;br /&gt;
- SPI&lt;br /&gt;
- One Wire Interface&lt;br /&gt;
* Sistemes operatius a Internet de les Coses&lt;br /&gt;
- Basats en Linux (Raspbian)&lt;br /&gt;
- Mongoose OS&lt;br /&gt;
* Comunicació entre dispositius&lt;br /&gt;
- Port sèrie&lt;br /&gt;
- RS485&lt;br /&gt;
- Bluetooth&lt;br /&gt;
- Ethernet (per cable i sense fils)&lt;br /&gt;
- Freqüències de ràdio lliures (SX1276 - xip LoRa)&lt;br /&gt;
* Transport de les dades&lt;br /&gt;
- ModBus RTU&lt;br /&gt;
- UDP&lt;br /&gt;
- TCP (telnet, HTTP, MQTT, ModBus TCP)&lt;br /&gt;
- LPWAN (SigFox, LoRaMAC, LoRaWAN)&lt;br /&gt;
- Seguretat (encriptació AES)&lt;br /&gt;
* Visualització i control&lt;br /&gt;
- Node-Red&lt;br /&gt;
- TheThingsNetwork&lt;br /&gt;
- IFTTT&lt;br /&gt;
- Serveis al núvol (AWS, plot.ly, thingspeak)&lt;br /&gt;
- Scada Indusoft&lt;br /&gt;
- Pantalles Nextion&lt;br /&gt;
- PyQt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Enllaços=&lt;br /&gt;
*https://aplicacions.ensenyament.gencat.cat/pls/soloas/pk_for_mod_ins.p_for_exhaustiu_activitat?p_header=Detall%20d%27activitat^pk_for_mod_ins.p_for_detall_activitat?p_codi=0004990600%26p_curs=2017-2018%26p_es_inscr=S&amp;amp;p_codi=0004990600&amp;amp;p_curs=2017-2018&amp;amp;p_es_inscr=S&lt;br /&gt;
*https://wiki.binefa.cat/index.php?title=Introducci%C3%B3_a_Internet_de_les_Coses_-_juny_2018&lt;br /&gt;
=Jornada 1=&lt;br /&gt;
[https://wiki.binefa.cat/index.php?title=Introducci%C3%B3_a_Internet_de_les_Coses_-_juny_2018#20180625]&lt;br /&gt;
&lt;br /&gt;
Per instal.lar el mòdul ESP32 a l'Ubuntu, seguim:&lt;br /&gt;
*https://github.com/espressif/arduino-esp32/blob/master/docs/arduino-ide/debian_ubuntu.md&lt;br /&gt;
A l'arrencar l'Arduino una altra vegada ja tindrem disponible la placa DOIT ESP32 DEVKIT V1 (aquesta és compatible amb la nostra placa ('''TTGO''' board), que no vol dir que sigui la única que funcioni).&lt;br /&gt;
*https://www.cnx-software.com/2017/10/13/this-ttgo-board-combines-esp32-lora-radio-and-oled-display-for-just-10/&lt;br /&gt;
&lt;br /&gt;
El github del Jordi Binefa:&lt;br /&gt;
*https://github.com/jordibinefa/&lt;br /&gt;
==esp32_BME280_WeatherStation_04==&lt;br /&gt;
És la primera prova de compilar la placa ESP32 (amb el sensor de temperatura BME280)&lt;br /&gt;
==esp32_lorawan_ttnEsp32_ttgo_multichannel_02b==&lt;br /&gt;
Primera prova per connectar-nos amb un gateway de Lorawan&lt;br /&gt;
&lt;br /&gt;
The Things Network:&lt;br /&gt;
*https://www.thethingsnetwork.org/&lt;br /&gt;
creem un usuari: joanillo / jq****&lt;br /&gt;
&lt;br /&gt;
Presa de contacte &amp;gt; Conjunt IoT. Prova de connectivitat a The Things Network&lt;br /&gt;
&lt;br /&gt;
El Jordi Binefa ha portat una antena (gateway a classe)&lt;br /&gt;
Anem a crear una nova app a TTN&lt;br /&gt;
&lt;br /&gt;
ADD APPLICATION&lt;br /&gt;
*Application ID: primera_app_joanillo&lt;br /&gt;
*Description: Node a Rambla Prim&lt;br /&gt;
Application EUI (end user interface)&lt;br /&gt;
EUI issued by The Things Network -&amp;gt; no posem res&lt;br /&gt;
Handler registration&lt;br /&gt;
&lt;br /&gt;
70B3D57ED00100ED&lt;br /&gt;
Hem de registrar un device:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
device id: dispositiu-07 (07 és el meu)&lt;br /&gt;
65/43/61/74/30/30/31/07 (07 és el meu)&lt;br /&gt;
Device EUI: 6543617430303107&lt;br /&gt;
Registrem el dispositiu: &lt;br /&gt;
Application ID: primera_app_joanillo&lt;br /&gt;
Device ID: dispositiu-07&lt;br /&gt;
Activation Method: OTAA -&amp;gt; canviar-ho per ABP a Settings. Frame Counter Checks ho desconnectem&lt;br /&gt;
Device EUI: 6543617430303107&lt;br /&gt;
&lt;br /&gt;
Application EUI: 70B3D57ED00100ED&lt;br /&gt;
Device Address: 2601149C&lt;br /&gt;
Network Session Key: 6CA585F5B6B2E8F9CB40D55504763975 -&amp;gt; { 0x6C, 0xA5, 0x85, 0xF5, 0xB6, 0xB2, 0xE8, 0xF9, 0xCB, 0x40, 0xD5, 0x55, 0x04, 0x76, 0x39, 0x75 }&lt;br /&gt;
App Session Key: 048AD239AB661D2D894B7AA5157B195D -&amp;gt; { 0x04, 0x8A, 0xD2, 0x39, 0xAB, 0x66, 0x1D, 0x2D, 0x89, 0x4B, 0x7A, 0xA5, 0x15, 0x7B, 0x19, 0x5D }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Canvio el codi al fitxer ''credentials.h'':&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  static const PROGMEM u1_t NWKSKEY[16] = { 0x6C, 0xA5, 0x85, 0xF5, 0xB6, 0xB2, 0xE8, 0xF9, 0xCB, 0x40, 0xD5, 0x55, 0x04, 0x76, 0x39, 0x75 };&lt;br /&gt;
  static const u1_t PROGMEM APPSKEY[16] = { 0x04, 0x8A, 0xD2, 0x39, 0xAB, 0x66, 0x1D, 0x2D, 0x89, 0x4B, 0x7A, 0xA5, 0x15, 0x7B, 0x19, 0x5D };&lt;br /&gt;
  static const u4_t DEVADDR = 0x2601149C ;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Aquest codi envia la informació del sensor BME280. Fixar-se que no utilitza la llibreria per al sensor d'Adafruit, sinó que ho fa a pèl.&lt;br /&gt;
&lt;br /&gt;
M'he registrat a TTN, i s'envien les dades del ESP32 a l'antena, i l'antena està connectada al núvol (a TTN). I per tant, veuré les dades del meu sensor a la capa d'aplicació i visualització que representa TTN.&lt;br /&gt;
&lt;br /&gt;
=Jornada 2=&lt;br /&gt;
[https://wiki.binefa.cat/index.php?title=Introducci%C3%B3_a_Internet_de_les_Coses_-_juny_2018#20180626]&lt;br /&gt;
*la meva IP 192.168.1.129&lt;br /&gt;
*IP de la RPi: 192.168.1.103&lt;br /&gt;
Ens connectem per SSH&lt;br /&gt;
&lt;br /&gt;
Si comprem una ESP32, és millor ficar-hi una antena una mica més bona extra, una antena 868Mhz (a Europa).&lt;br /&gt;
&lt;br /&gt;
'''nota''': he comprat la '''TTGO LoRa32 V2.0 868 MHz'''&lt;br /&gt;
&lt;br /&gt;
El professor ha configurat una xarxa inal·làmbrica ad-hoc que es diu IoT_eCat_RPi (és un punt d'accés basat en raspberry) (fer-ho com a pràctica).&lt;br /&gt;
&lt;br /&gt;
En la Raspberry tenim una petita pantalla OLED que ens diu la IP. Això és molt pràctic. Ens connectem a la xarxa wireless de la RPi, i això és molt pràctic perquè independitzem la xarxa que farem servir de l'institut, no ens barregem amb l'institut. I així no tindrem problemes. Com fer-ho?&lt;br /&gt;
&lt;br /&gt;
Si estiguéssim en Windows instal.laríem el Filezilla per tenir accés als arxius de la raspberry pi. Nosaltres ho fem amb ssh i scp.&lt;br /&gt;
&lt;br /&gt;
'''PCF8574''' (www.ti.com/lit/ds/symlink/pcf8574.pdf): 8-bit input/output (I/O) expander for the two-line bidirectional bus (I2C) is designed for 2.5-V to 6-V.&lt;br /&gt;
*Imatge: https://i.ebayimg.com/images/g/m9oAAOSwWnFV-S7M/s-l300.jpg&lt;br /&gt;
&lt;br /&gt;
Es tracta de ficar a la RPi, en la llista de wifis conegudes, la de l'institut (SSID: Robotica)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ sudo cat /etc/wpa_supplicant/wpa_supplicant.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Afegim la xarxa de l'institut&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
country=ES&lt;br /&gt;
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev&lt;br /&gt;
update_config=1&lt;br /&gt;
network={&lt;br /&gt;
  ssid=&amp;quot;IoT-eCat_RPi&amp;quot;&lt;br /&gt;
  psk=&amp;quot;clotClot&amp;quot;&lt;br /&gt;
  priority=3&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
network={&lt;br /&gt;
  ssid=&amp;quot;IoT-eCat&amp;quot;&lt;br /&gt;
  psk=&amp;quot;clotClot&amp;quot;&lt;br /&gt;
  priority=5&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
network={&lt;br /&gt;
  ssid=&amp;quot;Robotica2018&amp;quot;&lt;br /&gt;
  psk=&amp;quot;1123prim2018&amp;quot;&lt;br /&gt;
  priority=10&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
la que té el número més gros de priority la que guanya&lt;br /&gt;
&lt;br /&gt;
En la RPi tinc funcionant dos serveis: '''nodered''' i '''mosquitto''':&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ service nodered status&lt;br /&gt;
● nodered.service - Node-RED graphical event wiring tool&lt;br /&gt;
   Loaded: loaded (/lib/systemd/system/nodered.service; enabled; vendor preset: &lt;br /&gt;
   Active: active (running) since Mon 2018-06-25 12:07:05 UTC; 19h ago&lt;br /&gt;
&lt;br /&gt;
pi@raspberrypi:~ $ service nodered mosquitto&lt;br /&gt;
nodered: unrecognized service&lt;br /&gt;
$ service mosquitto status&lt;br /&gt;
● mosquitto.service - LSB: mosquitto MQTT v3.1 message broker&lt;br /&gt;
   Loaded: loaded (/etc/init.d/mosquitto; generated; vendor preset: enabled)&lt;br /&gt;
   Active: active (running) since Mon 2018-06-25 12:07:07 UTC; 19h ago&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
A IoT és útil el programa/servei '''screen''', que pot posar serveis en segon pla, i que són immunes als talls de xarxa. És una manera de què si perdo &lt;br /&gt;
la connexió (a IoT això pot passar sovint), després recupero el funcionament.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ screen&lt;br /&gt;
$ ping 1.1.1.1 -&amp;gt; fa un ping indefinit&lt;br /&gt;
ctrl-A D -&amp;gt; sortim de la sessió de la RPi (o posa el procés en segon pla)&lt;br /&gt;
exit&lt;br /&gt;
Tornem a entrar a la RPi&lt;br /&gt;
$ screen -r -&amp;gt; recuperem el ping que estava fent. El ping ha estat funcionant en segon pla.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
El nodered (a la RPi) funciona pel port 1880:&lt;br /&gt;
*http://192.168.1.103:1880/&lt;br /&gt;
'''nodered''': Flow-based programming for the Internet of Things&lt;br /&gt;
*https://nodered.org/&lt;br /&gt;
&lt;br /&gt;
*https://binefa.cat/IoT/02_ttncat_taller_presentacio_mkrwan1300.pdf&lt;br /&gt;
*https://binefa.cat/IoT/03_introLoRaWAN.pdf&lt;br /&gt;
&lt;br /&gt;
Gateway és l'antena. Es diu ''gateway'' (passarel.la) perquè de fet passa d'un medi (antena, air) a un altre medi (connexió Ethernet que es connecta al núvol).&lt;br /&gt;
&lt;br /&gt;
Placa '''witty ESP8266''' (val 3-8 e a eBay)&lt;br /&gt;
*https://wiki.binefa.cat/index.php?title=Posada_en_marxa_de_la_placa_witty_ESP8266&lt;br /&gt;
És una placa petiteta. Codi de prova:&lt;br /&gt;
*https://github.com/jordibinefa/arduino-IDE-codes/tree/master/esp8266_TestPins&lt;br /&gt;
Va a 3,3V, i això és important.&lt;br /&gt;
&lt;br /&gt;
A Arduino és habitual fer ''delays'', però en aquesta mena de dispositius connectats per wifi és desaconsellable, i s'utilitza '''yield()'''.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
delayESP8266(3);&lt;br /&gt;
&lt;br /&gt;
void delayESP8266(unsigned long ulMilliseconds){&lt;br /&gt;
  unsigned long ulPreviousMillis = millis();&lt;br /&gt;
&lt;br /&gt;
  do{&lt;br /&gt;
    yield();&lt;br /&gt;
  }while(millis() - ulPreviousMillis &amp;lt;= ulMilliseconds);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Per programar la placa witty amb l'Arduino es pot programar amb la placa NodeMCU1.0 (igual que la placa NodeMCU que tinc).&lt;br /&gt;
&lt;br /&gt;
Utilitza com a xip de comunicacions serial el CH340 (no el FT232)&lt;br /&gt;
&lt;br /&gt;
Em connectaré amb el ''gtkterm'' (sèrie), i enviaré comandes. Per ex, un tros del codi:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  if(szMsg == &amp;quot;a&amp;quot; || szMsg == &amp;quot;A&amp;quot;){&lt;br /&gt;
    Serial.print(&amp;quot;LDR level (0..1024): &amp;quot;);&lt;br /&gt;
    Serial.println(analogRead(A0));&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Em conencto pel gtkterm, i li puc enviar comandes:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ gtkterm -p /dev/ttyUSB0 -s 9600&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ProvesUDP. Escoltarem per exemple pel port 5555&lt;br /&gt;
&lt;br /&gt;
A nodered es fa servir el port 1880&lt;br /&gt;
netstat per saber els ports que estan oberts&lt;br /&gt;
$ sudo netstat -putan&lt;br /&gt;
en la RPi miro els ports que estan oberts, i escullo un port lliure&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
tcp        0      0 0.0.0.0:1880            0.0.0.0:*               LISTEN      229/node-red        &lt;br /&gt;
tcp        0      0 0.0.0.0:1883            0.0.0.0:*               LISTEN      299/mosquitto       &lt;br /&gt;
i altres coses&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Posem al nodered un ''escoltador'' UDP, i diem que escolti pel port 5555 (ha de ser inferior a 64000)&lt;br /&gt;
Ouput fico un debug, i els uneixo&lt;br /&gt;
&lt;br /&gt;
També fico un ''injector'' (en el payload fico String), i fico ''hola a tots'', que també connecto amb el debug (msg.payload). L'injector té un botonet per ''injectar'' i veure com funciona el flux.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
També fico un output de udp, per a un port. M'ho puc enviar a mi mateix, o puc enviar  a la ip (i port) d'un company.&lt;br /&gt;
També podem enviar missatges UDP per línia de comandes. Els missatges UDP es poden perdre, no està garantit el rebre'l. Amb TCP sí que està garantida la connexió.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ echo -n &amp;quot;hello&amp;quot; | nc -4u 192.168.1.103 5555&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anem a fer aquest exemple: esp8266_udpClient_01.ino&lt;br /&gt;
&lt;br /&gt;
En el codi fico la informació correcta:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
const char* ssid     = &amp;quot;IoT-eCat&amp;quot;;&lt;br /&gt;
const char* password = &amp;quot;clotClot&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
const char * udpAddress = &amp;quot;192.168.1.103&amp;quot;;&lt;br /&gt;
const int udpPortTx = 5555;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
I per tant el que farem ara és que el ESP8266 enviarà un paquet UDP, i el nostre nodered (a la RPi) tenim un escoltador de UDPs.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El codi que hem pujat al ESP8266 (''esp8266_udpClient_01.ino'') és el següent:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;ESP8266WiFi.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFiUdp.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#ifdef ESP8266&lt;br /&gt;
extern &amp;quot;C&amp;quot; {&lt;br /&gt;
  #include &amp;quot;user_interface.h&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
const char* ssid     = &amp;quot;IoT-eCat&amp;quot;;&lt;br /&gt;
const char* password = &amp;quot;clotClot&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
const char * udpAddress = &amp;quot;192.168.1.103&amp;quot;;&lt;br /&gt;
const int udpPortTx = 5555;&lt;br /&gt;
&lt;br /&gt;
WiFiUDP Udp;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  delay(10);&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;\n\r\n\rConnecting to &amp;quot;);&lt;br /&gt;
  Serial.println(ssid);&lt;br /&gt;
  &lt;br /&gt;
  WiFi.begin(ssid, password);&lt;br /&gt;
  &lt;br /&gt;
  while (WiFi.status() != WL_CONNECTED) {&lt;br /&gt;
    delay(500);&lt;br /&gt;
    Serial.print(&amp;quot;.&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;&amp;quot;);&lt;br /&gt;
  Serial.println(&amp;quot;WiFi connected&amp;quot;);  &lt;br /&gt;
  Serial.println(&amp;quot;IP address: &amp;quot;);&lt;br /&gt;
  Serial.println(WiFi.localIP());&lt;br /&gt;
  &lt;br /&gt;
  Udp.beginPacket(udpAddress, udpPortTx);  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void vGetMac(char *temp){&lt;br /&gt;
  static int i = 0;&lt;br /&gt;
  &lt;br /&gt;
#ifdef ESP8266&lt;br /&gt;
  uint8_t macaddr[6];   // array that will receive the MAC address from the chip&lt;br /&gt;
  wifi_get_macaddr(0x00, macaddr);&lt;br /&gt;
  os_sprintf(temp, &amp;quot;%05d) %02x:%02x:%02x:%02x:%02x:%02x\r\n&amp;quot;, i, macaddr[0],&lt;br /&gt;
      macaddr[1], macaddr[2], macaddr[3], macaddr[4], macaddr[5]);&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
  i = (++i &amp;gt;= 0) ? i : 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  char temp[28];      // buffer for formatting the output (xx:xx:xx:xx:xx:xx\r\n) = 20 bytes&lt;br /&gt;
&lt;br /&gt;
  vGetMac(temp);&lt;br /&gt;
&lt;br /&gt;
  Udp.write(temp);&lt;br /&gt;
  Udp.endPacket();&lt;br /&gt;
&lt;br /&gt;
  Serial.print(temp);&lt;br /&gt;
  Serial.println(&amp;quot; sent to UDP server&amp;quot;);&lt;br /&gt;
    &lt;br /&gt;
  delay(5000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
I el que fa és avariguar la MAC del dispositiu, i enviar-la per UDP (''Udp.write(temp);''). Aquest missatge el rep el nodered de la RPi (i ho estic visualitzant en el portàtil).&lt;br /&gt;
&lt;br /&gt;
=Jornada 3=&lt;br /&gt;
*https://wiki.binefa.cat/index.php?title=Guia_de_presentaci%C3%B3_pel_dia_27_de_juny_de_2018&lt;br /&gt;
&lt;br /&gt;
=Jornada 4=&lt;br /&gt;
Presentació TCP/UDP:&lt;br /&gt;
*https://binefa.cat/IoT/teoria/ethernetTcpUdp_00.pdf&lt;br /&gt;
&lt;br /&gt;
Aplicació d'android: wifi analyzer, per veure el nivell que tenim de les diferents xarxes inal·làmbriques disponibles.&lt;br /&gt;
&lt;br /&gt;
La diferència entre TCP i UDP és que el TCP es preocupa de què la trama hagi arribat, i si no arriba dóna error. A més, en TCP les trames van numerades i es reordenen en el destí. UDP és una sola trama.&lt;br /&gt;
&lt;br /&gt;
Presentació Node-RED:&lt;br /&gt;
*https://binefa.cat/IoT/nodeRed/nodeRed01.pdf&lt;br /&gt;
Exemples Node-RED:&lt;br /&gt;
*http://noderedguide.com/examples/&lt;br /&gt;
&lt;br /&gt;
'''payload''' vol dir la part útil de la informació.&lt;br /&gt;
&lt;br /&gt;
'''TODO''': fer la pràctica d'Openweathermap i Node-RED. Em connecto a OpenweatherMap, i envio un correu electrònic.&lt;br /&gt;
*https://binefa.cat/IoT/nodeRed/02_nodeRed_01.txt&lt;br /&gt;
Si el node de OpenWeatherMap no el tenim, s'ha d'instal·lar:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
npm install node-red-node-openweathermap&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
*https://www.npmjs.com/package/node-red-node-openweathermap&lt;br /&gt;
&lt;br /&gt;
Settings &amp;gt; Pallette &amp;gt; Install (amb el pip no m'ha funcionat). He d'anar a la pàgina web, donar-me d'alta, i aconseguir la API key.&lt;br /&gt;
*API de openweathermap: ''e2aec1bc0914a482546efb1b491a6f2a''&lt;br /&gt;
&lt;br /&gt;
==Coses per mirar==&lt;br /&gt;
Mirar el tema de Node-RED i JSON, switch, dashboards&lt;br /&gt;
&lt;br /&gt;
*influxdb + grafana&lt;br /&gt;
*modBus&lt;br /&gt;
*Wemos espurna&lt;br /&gt;
&lt;br /&gt;
==MQTT==&lt;br /&gt;
[[Fitxer:Gauge.png|thumbnail]]&lt;br /&gt;
Per veure les gauges i dashboards he d'anar a:&lt;br /&gt;
*http://192.168.1.186:1880/ui&lt;br /&gt;
[[Fitxer:Mqtt nodered.png|thumbnail]]&lt;br /&gt;
Presentació MQTT:&lt;br /&gt;
*https://binefa.cat/IoT/teoria/mqtt_00.pdf&lt;br /&gt;
[[Fitxer:Exemple mqtt nodered witty.png|thumbnail]]&lt;br /&gt;
Farem aquest exemple: ''esp8266_MQTT_pub_sub_01.ino'', que carreguem en la placa ''witty'', on hi ha un led rgb integrat:&lt;br /&gt;
*https://binefa.cat/IoT/nodeRed/prj/mqtt_esp8266_esp32/ex00/esp8266_MQTT_pub_sub_01/esp8266_MQTT_pub_sub_01.ino&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Based on https://www.baldengineer.com/mqtt-tutorial.html&lt;br /&gt;
//&lt;br /&gt;
// https://wiki.binefa.cat&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;EEPROM.h&amp;gt;&lt;br /&gt;
#include &amp;lt;ESP8266WiFi.h&amp;gt;&lt;br /&gt;
#include &amp;lt;PubSubClient.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define EXTERNAL_BUTTON 4&lt;br /&gt;
&lt;br /&gt;
// Connect to the WiFi&lt;br /&gt;
const char* ssid = &amp;quot;Robotica2018&amp;quot;;&lt;br /&gt;
const char* password = &amp;quot;1123prim2018&amp;quot;;&lt;br /&gt;
const char* mqtt_server = &amp;quot;popotamo.binefa.cat&amp;quot;;&lt;br /&gt;
const int mqtt_port = 1888; // normally 1883&lt;br /&gt;
//const char* mqtt_server = &amp;quot;test.mosquitto.org&amp;quot;; //broker&lt;br /&gt;
//const int mqtt_port = 1883; // normally 1883&lt;br /&gt;
&lt;br /&gt;
#define TEMA_PUBLICA_ESTAT_BOTO &amp;quot;/joan/witty/boto&amp;quot;&lt;br /&gt;
#define TEMA_SUBSCRIPCIO_ESTAT_LEDS &amp;quot;/joan/witty/leds&amp;quot;&lt;br /&gt;
&lt;br /&gt;
WiFiClient espClient;&lt;br /&gt;
PubSubClient client(espClient);&lt;br /&gt;
&lt;br /&gt;
const byte ledPin = 2, ledRed = 15, ledGreen = 12, ledBlue = 13;&lt;br /&gt;
const byte button = EXTERNAL_BUTTON;&lt;br /&gt;
&lt;br /&gt;
void callback(char* topic, byte* payload, unsigned int length) {&lt;br /&gt;
  String szRx = &amp;quot;&amp;quot;, szTema(topic);&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;Message arrived [&amp;quot;);&lt;br /&gt;
  Serial.print(topic);&lt;br /&gt;
  Serial.print(&amp;quot;] &amp;quot;);&lt;br /&gt;
  for (int i = 0; i &amp;lt; length; i++) {&lt;br /&gt;
    char receivedChar = (char)payload[i];&lt;br /&gt;
    szRx += receivedChar;&lt;br /&gt;
  }&lt;br /&gt;
  Serial.println(szRx);&lt;br /&gt;
  if (szTema == TEMA_SUBSCRIPCIO_ESTAT_LEDS) {&lt;br /&gt;
    if (szRx == &amp;quot;2L&amp;quot;) digitalWrite(ledPin, LOW);&lt;br /&gt;
    if (szRx == &amp;quot;2H&amp;quot;) digitalWrite(ledPin, HIGH);&lt;br /&gt;
    if (szRx == &amp;quot;12L&amp;quot;) digitalWrite(ledBlue, LOW);&lt;br /&gt;
    if (szRx == &amp;quot;12H&amp;quot;) digitalWrite(ledBlue, HIGH);&lt;br /&gt;
    if (szRx == &amp;quot;13L&amp;quot;) digitalWrite(ledGreen, LOW);&lt;br /&gt;
    if (szRx == &amp;quot;13H&amp;quot;) digitalWrite(ledGreen, HIGH);&lt;br /&gt;
    if (szRx == &amp;quot;15L&amp;quot;) digitalWrite(ledRed, LOW);&lt;br /&gt;
    if (szRx == &amp;quot;15H&amp;quot;) digitalWrite(ledRed, HIGH);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void reconnect() {&lt;br /&gt;
  // Loop until we're reconnected&lt;br /&gt;
  while (!client.connected()) {&lt;br /&gt;
    Serial.print(&amp;quot;Attempting MQTT connection...&amp;quot;);&lt;br /&gt;
    // Attempt to connect&lt;br /&gt;
    //if (client.connect(&amp;quot;ESP8266 Client &amp;lt;- Canvieu aquest nom&amp;quot;)) {&lt;br /&gt;
    if (client.connect(&amp;quot;joan&amp;quot;)) {&lt;br /&gt;
      Serial.println(&amp;quot;connected&amp;quot;);&lt;br /&gt;
      // ... and subscribe to topic&lt;br /&gt;
      client.subscribe(TEMA_SUBSCRIPCIO_ESTAT_LEDS);&lt;br /&gt;
    } else {&lt;br /&gt;
      Serial.print(&amp;quot;failed, rc=&amp;quot;);&lt;br /&gt;
      Serial.print(client.state());&lt;br /&gt;
      Serial.println(&amp;quot; try again in 5 seconds&amp;quot;);&lt;br /&gt;
      // Wait 5 seconds before retrying&lt;br /&gt;
      delay(5000);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup_wifi() {&lt;br /&gt;
  delay(10);&lt;br /&gt;
  // We start by connecting to a WiFi network&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  Serial.print(&amp;quot;Connecting to &amp;quot;);&lt;br /&gt;
  Serial.println(ssid);&lt;br /&gt;
&lt;br /&gt;
  WiFi.begin(ssid, password);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(ledRed, HIGH);&lt;br /&gt;
  digitalWrite(ledBlue, LOW);&lt;br /&gt;
  while (WiFi.status() != WL_CONNECTED) {&lt;br /&gt;
    delay(500);&lt;br /&gt;
    Serial.print(&amp;quot;.&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  digitalWrite(ledRed, LOW);&lt;br /&gt;
  digitalWrite(ledBlue, HIGH);&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;&amp;quot;);&lt;br /&gt;
  Serial.println(&amp;quot;WiFi connected&amp;quot;);&lt;br /&gt;
  Serial.println(&amp;quot;IP address: &amp;quot;);&lt;br /&gt;
  Serial.println(WiFi.localIP());&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  pinMode(ledPin, OUTPUT);&lt;br /&gt;
  pinMode(ledRed, OUTPUT);&lt;br /&gt;
  pinMode(ledGreen, OUTPUT);&lt;br /&gt;
  pinMode(ledBlue, OUTPUT);&lt;br /&gt;
  pinMode(button, INPUT);&lt;br /&gt;
&lt;br /&gt;
  setup_wifi();&lt;br /&gt;
  client.setServer(mqtt_server, mqtt_port);&lt;br /&gt;
  client.setCallback(callback);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  boolean bButtonState = !digitalRead(EXTERNAL_BUTTON);&lt;br /&gt;
  static boolean bLastButtonState = bButtonState;&lt;br /&gt;
&lt;br /&gt;
  if (!client.connected()) {&lt;br /&gt;
    reconnect();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (bButtonState != bLastButtonState) {&lt;br /&gt;
    bLastButtonState = bButtonState;&lt;br /&gt;
    delay(50); //pels rebots&lt;br /&gt;
    //quan cliquem el boto farem una publicacio&lt;br /&gt;
    if (bButtonState)&lt;br /&gt;
      client.publish(TEMA_PUBLICA_ESTAT_BOTO, &amp;quot;Boto GPIO4 NO premut&amp;quot;);&lt;br /&gt;
    else&lt;br /&gt;
      client.publish(TEMA_PUBLICA_ESTAT_BOTO, &amp;quot;Boto GPIO4 ES premut&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  client.loop();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Amb aquesta pràctica fem l'exemple de subscriure (llegim l'estat dels botons) i publicar (podem canviar l'estat del led)&lt;br /&gt;
&lt;br /&gt;
També fem la prova amb el MQTT Dash (aplicació del mòbil), per encendre/apagar els leds de la witty.&lt;br /&gt;
&lt;br /&gt;
Ampliació de la pràctica: tenir en el DasH MQTT un gauge del nivell del sensor analògic de la witty. Hem de modificar el codi, similar a:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
itoa(analogRead(A0),cstr,10);&lt;br /&gt;
if (szRx==&amp;quot;a&amp;quot; || szRx==&amp;quot;A&amp;quot;) client.publish(TEMA_PUBLICAT_ESTAT_LDR, cstr);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
i aleshores des de la witty publiquem el valor de la LDR, i el podrem recollir en un msg.payload (debug) o una visualització.&lt;br /&gt;
'''IDEES''': Amb '''blynk''' o '''appInventor''' podem fer un desenvolupament ràpid d'aplicacions per mòbil, relacionades amb IoT. El blynk també es pot connectar a Node-RED, i el servidor de blynk també el podem instal·lar a la RPi.&lt;br /&gt;
&lt;br /&gt;
=Jornada 5=&lt;br /&gt;
*https://wiki.binefa.cat/index.php?title=Guia_de_presentaci%C3%B3_pel_dia_29_de_juny_de_2018&lt;br /&gt;
&lt;br /&gt;
NodeRED: 192.168.1.138&lt;br /&gt;
&lt;br /&gt;
Codi Modbus TCP sobre l'ESP8266&lt;br /&gt;
script esp8266_modbus_estatBoto_LDR_i_led_02b_rPrim.ino&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
  20180523 - wiki.binefa.cat&lt;br /&gt;
&lt;br /&gt;
  Based on Modbus-Arduino Example - Test Holding Register (Modbus IP ESP8266)&lt;br /&gt;
  Read Switch Status on pin GPIO0&lt;br /&gt;
  Copyright by André Sarmento Barbosa&lt;br /&gt;
  http://github.com/andresarmento/modbus-arduino&lt;br /&gt;
&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;ESP8266WiFi.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Modbus.h&amp;gt;&lt;br /&gt;
#include &amp;lt;ModbusIP_ESP8266.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define N_WIFIS 2&lt;br /&gt;
#define MAX_STRING_SIZE 15&lt;br /&gt;
&lt;br /&gt;
struct stWifiList {&lt;br /&gt;
  String szSSID;&lt;br /&gt;
  String szPWD;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct stWifiList stWiFi[N_WIFIS] = {&lt;br /&gt;
  {&amp;quot;IoT-eCat&amp;quot; , &amp;quot;clotClot&amp;quot;},&lt;br /&gt;
  {&amp;quot;Robotica2018&amp;quot; , &amp;quot;1123prim2018&amp;quot;}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Modbus Registers Offsets (0-9999)&lt;br /&gt;
const int SENSOR_IREG = 100;&lt;br /&gt;
const int SWITCH_ISTS = 100;&lt;br /&gt;
const int LED_COIL = 100;&lt;br /&gt;
const int LED_VERMELL_COIL = 101;&lt;br /&gt;
&lt;br /&gt;
//Used Pins&lt;br /&gt;
const int switchPin = 4; //GPIO4&lt;br /&gt;
const int ledPin = 2; //GPIO2&lt;br /&gt;
const int ledVermell = 15; //GPIO15&lt;br /&gt;
&lt;br /&gt;
//ModbusIP object&lt;br /&gt;
ModbusIP mb;&lt;br /&gt;
&lt;br /&gt;
long ts;&lt;br /&gt;
&lt;br /&gt;
void vDelayESP8266(unsigned long ulMilliseconds) {&lt;br /&gt;
  unsigned long ulPreviousMillis = millis();&lt;br /&gt;
&lt;br /&gt;
  do {&lt;br /&gt;
    yield();&lt;br /&gt;
  } while (millis() - ulPreviousMillis &amp;lt;= ulMilliseconds);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
boolean bIsListed(String szSSID,int *nQuina) {&lt;br /&gt;
  for (int i = 0; i &amp;lt; N_WIFIS ; i++) {&lt;br /&gt;
    if (stWiFi[i].szSSID == szSSID){&lt;br /&gt;
      *nQuina = i;&lt;br /&gt;
      return true;&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
  return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
bool bConnectModbus() {&lt;br /&gt;
  //mb.config(&amp;quot;IoT-eCat&amp;quot;, &amp;quot;clotClot&amp;quot;);&lt;br /&gt;
  char ssid[MAX_STRING_SIZE],  pwd[MAX_STRING_SIZE];&lt;br /&gt;
  int n = WiFi.scanNetworks(), nWhichOne;&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;*&amp;quot;);&lt;br /&gt;
  if (n == 0) {&lt;br /&gt;
    Serial.println(&amp;quot;\nNo networks found&amp;quot;);&lt;br /&gt;
    vDelayESP8266(1000);&lt;br /&gt;
  } else {&lt;br /&gt;
    for (int i = 0; i &amp;lt; n; ++i) {&lt;br /&gt;
      if (bIsListed(WiFi.SSID(i), &amp;amp;nWhichOne)) {&lt;br /&gt;
        String szSsid = stWiFi[nWhichOne].szSSID;&lt;br /&gt;
        szSsid.toCharArray(ssid, szSsid.length() + 1);&lt;br /&gt;
        String szPwd = stWiFi[nWhichOne].szPWD;&lt;br /&gt;
        szPwd.toCharArray(pwd, szPwd.length() + 1);&lt;br /&gt;
&lt;br /&gt;
        mb.config(ssid,pwd);&lt;br /&gt;
        return true;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  int nSsidDetected;&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  //Config Modbus IP&lt;br /&gt;
  //mb.config(&amp;quot;IoT-eCat&amp;quot;, &amp;quot;clotClot&amp;quot;);&lt;br /&gt;
  bConnectModbus();&lt;br /&gt;
&lt;br /&gt;
  while (WiFi.status() != WL_CONNECTED) {&lt;br /&gt;
    delay(500);&lt;br /&gt;
    Serial.print(&amp;quot;.&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;&amp;quot;);&lt;br /&gt;
  Serial.println(&amp;quot;WiFi connected&amp;quot;);&lt;br /&gt;
  Serial.println(&amp;quot;IP address: &amp;quot;);&lt;br /&gt;
  Serial.println(WiFi.localIP());&lt;br /&gt;
&lt;br /&gt;
  pinMode(ledPin, OUTPUT);&lt;br /&gt;
  mb.addCoil(LED_COIL);&lt;br /&gt;
  pinMode(ledVermell, OUTPUT);&lt;br /&gt;
  mb.addCoil(LED_VERMELL_COIL);&lt;br /&gt;
&lt;br /&gt;
  //Set switchPin mode&lt;br /&gt;
  pinMode(switchPin, INPUT);&lt;br /&gt;
  // Add SWITCH_ISTS register - Use addIsts() for digital inputs&lt;br /&gt;
  mb.addIsts(SWITCH_ISTS);&lt;br /&gt;
&lt;br /&gt;
  // Add SENSOR_IREG register - Use addIreg() for analog Inputs&lt;br /&gt;
  mb.addIreg(SENSOR_IREG);&lt;br /&gt;
&lt;br /&gt;
  ts = millis();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  //Call once inside loop() - all magic here&lt;br /&gt;
  mb.task();&lt;br /&gt;
&lt;br /&gt;
  //Attach switchPin to SWITCH_ISTS register&lt;br /&gt;
  mb.Ists(SWITCH_ISTS, digitalRead(switchPin));&lt;br /&gt;
&lt;br /&gt;
  //Read each two seconds&lt;br /&gt;
  if (millis() &amp;gt; ts + 2000) {&lt;br /&gt;
    ts = millis();&lt;br /&gt;
    //Setting raw value (0-1024)&lt;br /&gt;
    mb.Ireg(SENSOR_IREG, analogRead(A0));&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  //Attach ledPin to LED_COIL register&lt;br /&gt;
  digitalWrite(ledPin, mb.Coil(LED_COIL));&lt;br /&gt;
  digitalWrite(ledVermell, mb.Coil(LED_VERMELL_COIL));&lt;br /&gt;
  //digitalWrite(ledVermell,digitalRead(switchPin));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
El programa compila i es puja bé, i el Witty agafa la IP de 192.168.1.110.&lt;br /&gt;
&lt;br /&gt;
I el code de Node-RED que hem provat i ha funcionat és: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;41131db2.796494&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;tab&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;Flow 1&amp;quot;,&lt;br /&gt;
        &amp;quot;disabled&amp;quot;: false,&lt;br /&gt;
        &amp;quot;info&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;77abe6fd.72879&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;debug&amp;quot;,&lt;br /&gt;
        &amp;quot;z&amp;quot;: &amp;quot;41131db2.796494&amp;quot;,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;active&amp;quot;: true,&lt;br /&gt;
        &amp;quot;tosidebar&amp;quot;: true,&lt;br /&gt;
        &amp;quot;console&amp;quot;: false,&lt;br /&gt;
        &amp;quot;tostatus&amp;quot;: false,&lt;br /&gt;
        &amp;quot;complete&amp;quot;: &amp;quot;false&amp;quot;,&lt;br /&gt;
        &amp;quot;x&amp;quot;: 510,&lt;br /&gt;
        &amp;quot;y&amp;quot;: 120,&lt;br /&gt;
        &amp;quot;wires&amp;quot;: []&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;df76097c.8517f8&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;inject&amp;quot;,&lt;br /&gt;
        &amp;quot;z&amp;quot;: &amp;quot;41131db2.796494&amp;quot;,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;topic&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;payload&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
        &amp;quot;payloadType&amp;quot;: &amp;quot;num&amp;quot;,&lt;br /&gt;
        &amp;quot;repeat&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;crontab&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;once&amp;quot;: false,&lt;br /&gt;
        &amp;quot;onceDelay&amp;quot;: 0.1,&lt;br /&gt;
        &amp;quot;x&amp;quot;: 130,&lt;br /&gt;
        &amp;quot;y&amp;quot;: 100,&lt;br /&gt;
        &amp;quot;wires&amp;quot;: [&lt;br /&gt;
            [&lt;br /&gt;
                &amp;quot;e7add653.1e6668&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
        ]&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;e7add653.1e6668&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;modbustcp-no-pooling-write&amp;quot;,&lt;br /&gt;
        &amp;quot;z&amp;quot;: &amp;quot;41131db2.796494&amp;quot;,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;Led petit&amp;quot;,&lt;br /&gt;
        &amp;quot;dataType&amp;quot;: &amp;quot;Coil&amp;quot;,&lt;br /&gt;
        &amp;quot;adr&amp;quot;: &amp;quot;100&amp;quot;,&lt;br /&gt;
        &amp;quot;server&amp;quot;: &amp;quot;167db306.72106d&amp;quot;,&lt;br /&gt;
        &amp;quot;x&amp;quot;: 280,&lt;br /&gt;
        &amp;quot;y&amp;quot;: 80,&lt;br /&gt;
        &amp;quot;wires&amp;quot;: [&lt;br /&gt;
            [&lt;br /&gt;
                &amp;quot;77abe6fd.72879&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            []&lt;br /&gt;
        ]&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;4a21dd39.9e228c&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;inject&amp;quot;,&lt;br /&gt;
        &amp;quot;z&amp;quot;: &amp;quot;41131db2.796494&amp;quot;,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;topic&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;payload&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
        &amp;quot;payloadType&amp;quot;: &amp;quot;num&amp;quot;,&lt;br /&gt;
        &amp;quot;repeat&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;crontab&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;once&amp;quot;: false,&lt;br /&gt;
        &amp;quot;onceDelay&amp;quot;: 0.1,&lt;br /&gt;
        &amp;quot;x&amp;quot;: 130,&lt;br /&gt;
        &amp;quot;y&amp;quot;: 60,&lt;br /&gt;
        &amp;quot;wires&amp;quot;: [&lt;br /&gt;
            [&lt;br /&gt;
                &amp;quot;e7add653.1e6668&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
        ]&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;4c77e299.840d9c&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;inject&amp;quot;,&lt;br /&gt;
        &amp;quot;z&amp;quot;: &amp;quot;41131db2.796494&amp;quot;,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;topic&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;payload&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
        &amp;quot;payloadType&amp;quot;: &amp;quot;num&amp;quot;,&lt;br /&gt;
        &amp;quot;repeat&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;crontab&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;once&amp;quot;: false,&lt;br /&gt;
        &amp;quot;onceDelay&amp;quot;: 0.1,&lt;br /&gt;
        &amp;quot;x&amp;quot;: 130,&lt;br /&gt;
        &amp;quot;y&amp;quot;: 160,&lt;br /&gt;
        &amp;quot;wires&amp;quot;: [&lt;br /&gt;
            [&lt;br /&gt;
                &amp;quot;5e84f9c7.ca0a3&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
        ]&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;5e84f9c7.ca0a3&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;modbustcp-no-pooling-write&amp;quot;,&lt;br /&gt;
        &amp;quot;z&amp;quot;: &amp;quot;41131db2.796494&amp;quot;,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;Led vermell&amp;quot;,&lt;br /&gt;
        &amp;quot;dataType&amp;quot;: &amp;quot;Coil&amp;quot;,&lt;br /&gt;
        &amp;quot;adr&amp;quot;: &amp;quot;101&amp;quot;,&lt;br /&gt;
        &amp;quot;server&amp;quot;: &amp;quot;167db306.72106d&amp;quot;,&lt;br /&gt;
        &amp;quot;x&amp;quot;: 290,&lt;br /&gt;
        &amp;quot;y&amp;quot;: 180,&lt;br /&gt;
        &amp;quot;wires&amp;quot;: [&lt;br /&gt;
            [&lt;br /&gt;
                &amp;quot;77abe6fd.72879&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            []&lt;br /&gt;
        ]&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;c523a62e.625cb8&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;inject&amp;quot;,&lt;br /&gt;
        &amp;quot;z&amp;quot;: &amp;quot;41131db2.796494&amp;quot;,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;topic&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;payload&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
        &amp;quot;payloadType&amp;quot;: &amp;quot;num&amp;quot;,&lt;br /&gt;
        &amp;quot;repeat&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;crontab&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;once&amp;quot;: false,&lt;br /&gt;
        &amp;quot;onceDelay&amp;quot;: 0.1,&lt;br /&gt;
        &amp;quot;x&amp;quot;: 130,&lt;br /&gt;
        &amp;quot;y&amp;quot;: 200,&lt;br /&gt;
        &amp;quot;wires&amp;quot;: [&lt;br /&gt;
            [&lt;br /&gt;
                &amp;quot;5e84f9c7.ca0a3&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
        ]&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;515289c4.4deb78&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;modbustcp-no-pooling-read&amp;quot;,&lt;br /&gt;
        &amp;quot;z&amp;quot;: &amp;quot;41131db2.796494&amp;quot;,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;Botó GPIO4&amp;quot;,&lt;br /&gt;
        &amp;quot;dataType&amp;quot;: &amp;quot;Input&amp;quot;,&lt;br /&gt;
        &amp;quot;adr&amp;quot;: &amp;quot;100&amp;quot;,&lt;br /&gt;
        &amp;quot;quantity&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
        &amp;quot;server&amp;quot;: &amp;quot;167db306.72106d&amp;quot;,&lt;br /&gt;
        &amp;quot;x&amp;quot;: 290,&lt;br /&gt;
        &amp;quot;y&amp;quot;: 260,&lt;br /&gt;
        &amp;quot;wires&amp;quot;: [&lt;br /&gt;
            [&lt;br /&gt;
                &amp;quot;cfebf5e1.18a7b8&amp;quot;,&lt;br /&gt;
                &amp;quot;388349fa.c3ca66&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            []&lt;br /&gt;
        ]&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;130ac89c.dc3337&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;inject&amp;quot;,&lt;br /&gt;
        &amp;quot;z&amp;quot;: &amp;quot;41131db2.796494&amp;quot;,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;topic&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;payload&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
        &amp;quot;payloadType&amp;quot;: &amp;quot;num&amp;quot;,&lt;br /&gt;
        &amp;quot;repeat&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;crontab&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;once&amp;quot;: false,&lt;br /&gt;
        &amp;quot;onceDelay&amp;quot;: 0.1,&lt;br /&gt;
        &amp;quot;x&amp;quot;: 130,&lt;br /&gt;
        &amp;quot;y&amp;quot;: 380,&lt;br /&gt;
        &amp;quot;wires&amp;quot;: [&lt;br /&gt;
            [&lt;br /&gt;
                &amp;quot;a150fda4.1ca258&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
        ]&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;a150fda4.1ca258&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;modbustcp-no-pooling-read&amp;quot;,&lt;br /&gt;
        &amp;quot;z&amp;quot;: &amp;quot;41131db2.796494&amp;quot;,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;LDR&amp;quot;,&lt;br /&gt;
        &amp;quot;dataType&amp;quot;: &amp;quot;InputRegister&amp;quot;,&lt;br /&gt;
        &amp;quot;adr&amp;quot;: &amp;quot;100&amp;quot;,&lt;br /&gt;
        &amp;quot;quantity&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
        &amp;quot;server&amp;quot;: &amp;quot;167db306.72106d&amp;quot;,&lt;br /&gt;
        &amp;quot;x&amp;quot;: 290,&lt;br /&gt;
        &amp;quot;y&amp;quot;: 380,&lt;br /&gt;
        &amp;quot;wires&amp;quot;: [&lt;br /&gt;
            [&lt;br /&gt;
                &amp;quot;77abe6fd.72879&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            []&lt;br /&gt;
        ]&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;c0564630.d3673&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;inject&amp;quot;,&lt;br /&gt;
        &amp;quot;z&amp;quot;: &amp;quot;41131db2.796494&amp;quot;,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;topic&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;payload&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
        &amp;quot;payloadType&amp;quot;: &amp;quot;num&amp;quot;,&lt;br /&gt;
        &amp;quot;repeat&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;crontab&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;once&amp;quot;: false,&lt;br /&gt;
        &amp;quot;onceDelay&amp;quot;: 0.1,&lt;br /&gt;
        &amp;quot;x&amp;quot;: 130,&lt;br /&gt;
        &amp;quot;y&amp;quot;: 260,&lt;br /&gt;
        &amp;quot;wires&amp;quot;: [&lt;br /&gt;
            [&lt;br /&gt;
                &amp;quot;515289c4.4deb78&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
        ]&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;cfebf5e1.18a7b8&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;delay&amp;quot;,&lt;br /&gt;
        &amp;quot;z&amp;quot;: &amp;quot;41131db2.796494&amp;quot;,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pauseType&amp;quot;: &amp;quot;delay&amp;quot;,&lt;br /&gt;
        &amp;quot;timeout&amp;quot;: &amp;quot;500&amp;quot;,&lt;br /&gt;
        &amp;quot;timeoutUnits&amp;quot;: &amp;quot;milliseconds&amp;quot;,&lt;br /&gt;
        &amp;quot;rate&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
        &amp;quot;nbRateUnits&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
        &amp;quot;rateUnits&amp;quot;: &amp;quot;second&amp;quot;,&lt;br /&gt;
        &amp;quot;randomFirst&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
        &amp;quot;randomLast&amp;quot;: &amp;quot;5&amp;quot;,&lt;br /&gt;
        &amp;quot;randomUnits&amp;quot;: &amp;quot;seconds&amp;quot;,&lt;br /&gt;
        &amp;quot;drop&amp;quot;: false,&lt;br /&gt;
        &amp;quot;x&amp;quot;: 310,&lt;br /&gt;
        &amp;quot;y&amp;quot;: 320,&lt;br /&gt;
        &amp;quot;wires&amp;quot;: [&lt;br /&gt;
            [&lt;br /&gt;
                &amp;quot;a150fda4.1ca258&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
        ]&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;388349fa.c3ca66&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;function&amp;quot;,&lt;br /&gt;
        &amp;quot;z&amp;quot;: &amp;quot;41131db2.796494&amp;quot;,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;arr(0) --&amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;func&amp;quot;: &amp;quot;msg.payload = msg.payload[0];\nreturn msg;&amp;quot;,&lt;br /&gt;
        &amp;quot;outputs&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;noerr&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;x&amp;quot;: 460,&lt;br /&gt;
        &amp;quot;y&amp;quot;: 240,&lt;br /&gt;
        &amp;quot;wires&amp;quot;: [&lt;br /&gt;
            [&lt;br /&gt;
                &amp;quot;77abe6fd.72879&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
        ]&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;167db306.72106d&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;modbustcp-no-pooling-server&amp;quot;,&lt;br /&gt;
        &amp;quot;z&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;host&amp;quot;: &amp;quot;192.168.1.110&amp;quot;,&lt;br /&gt;
        &amp;quot;port&amp;quot;: &amp;quot;502&amp;quot;,&lt;br /&gt;
        &amp;quot;unit_id&amp;quot;: &amp;quot;1&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Donat un projecte de Node-RED, el podem exportar en aquest format JSON, i de la mateixa manera, també el podem importar.&lt;br /&gt;
&lt;br /&gt;
Hem fet aquesta pràctica i ha funcionat. Controlem els leds de la witty a través d'un script del Node-RED, i els controlem amb el protocol modbus.&lt;br /&gt;
&lt;br /&gt;
El bloc del Node-RED per treballar amb modbus és ''modbustcp no pooling''.&lt;br /&gt;
&lt;br /&gt;
Ara farem el mateix amb el simulador de Indusoft. Es tracta de fer una interfície gràfica amb botons, per encendre i apagar els leds de la witty (ESP8266).&lt;br /&gt;
&lt;br /&gt;
==Indusoft==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cicles.info/oncloud&lt;br /&gt;
user: jclua/jclua&lt;br /&gt;
INDUSOFT&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
*https://binefa.cat/training/indusoft/InduSoft%20Web%20Studio%20Educational%20-%20Installation%20and%20Licensing.pdf&lt;br /&gt;
&lt;br /&gt;
Indusoft web Studio is a powerful collection of automation tools that include all the building block needed to develop Human Machine Interfaces (HMIs) , SCADA systems, OEE/Dashboards, embedded applications and IoT solutions.&lt;br /&gt;
&lt;br /&gt;
Drivers de comunicació: MOTCP&lt;br /&gt;
==Pantalles tàctils Nextion==&lt;br /&gt;
Objectiu: connectar una pantalla Nextion amb l'Arduino, i comunicar-se com a entrada/sortida. Com a entrada per exemple podem tenin un dashboard/gauge per mesurar el valor d'un sensor; com a sortida podem definir un botó per tancar/obrir un relé.&lt;br /&gt;
&lt;br /&gt;
costen uns 12e a Aliexpress&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2.4&amp;quot; 	240 x 320&lt;br /&gt;
2.8&amp;quot; 	240 x 320&lt;br /&gt;
3.2&amp;quot; 	240 x 400&lt;br /&gt;
3.5&amp;quot; 	320 x 480&lt;br /&gt;
4.3&amp;quot; 	480 x 272 &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
*https://wiki.binefa.cat/index.php?title=Pantalles_t%C3%A0ctils_NEXTION&lt;br /&gt;
*https://wiki.binefa.cat/index.php?title=Pr%C3%A0ctica_1_amb_les_pantalles_Nextion&lt;br /&gt;
&lt;br /&gt;
Hi ha el programa del Nextion Editor (Windows). És possible que funcioni amb wine. Si no, necessitem una màquina virtual de Windows.&lt;br /&gt;
&lt;br /&gt;
Per programar amb Arduino fem servir la llibre '''ITEADLIB_Arduino_Nextion'''&lt;br /&gt;
&lt;br /&gt;
L'Arduino Nano no té ports sèries.&lt;br /&gt;
S'ha de fer una modificació al fitxer NexConfig.h:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Define nexSerial for communicate with Nextion touch panel. &lt;br /&gt;
 */&lt;br /&gt;
//#define nexSerial Serial2&lt;br /&gt;
#ifndef ESP32&lt;br /&gt;
	#include &amp;lt;SoftwareSerial.h&amp;gt;&lt;br /&gt;
	extern SoftwareSerial HMISerial;&lt;br /&gt;
#else&lt;br /&gt;
	extern HardwareSerial HMISerial;&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
La capçalera del meu fitxer és:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;quot;Nextion.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// https://www.reddit.com/r/arduino/comments/4b6jfi/nexconfigh_for_nextion_display_on_arduino_uno/&lt;br /&gt;
#define ESP32&lt;br /&gt;
HardwareSerial HMISerial(2); // UART2. U2_RXD:GPIO16, U2_TXD:GPIO17&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;PCF8574.h&amp;quot; // https://github.com/RobTillaart/Arduino/tree/master/libraries/PCF8574&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;quot;SSD1306.h&amp;quot; // alias for `#include &amp;quot;SSD1306Wire.h&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Com es veu amb la sentència ''#define ESP32'' veig el tros de codi que s'ha d'executar en el NexConfig.h.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Funciona per callbacks (esdeveniments). En un release, deixa anar un event.&lt;br /&gt;
&lt;br /&gt;
Fem aquest codi:&lt;br /&gt;
*https://github.com/jordibinefa/arduino-IDE-codes/blob/master/esp32_Nextion_02b_/esp32_Nextion_02b_.ino&lt;br /&gt;
&lt;br /&gt;
Les pantalles Nextion funcionen amb una microSD, on dins hem de tenir el fitxer compilat del funcionament de la pantalla. Les Nexion tenen un processador propi. La gràcia de tot això és que un sistema com l'Arduino treballa amb aquesta pantalla, que va molt ràpida perquè la potència de processament és independent de l'Arduino.&lt;br /&gt;
&lt;br /&gt;
Primer pas: instal.lar l'editor per Windows,&lt;br /&gt;
&lt;br /&gt;
Segon pas: cerquem a Google ''Nextion arduino library'', on trobarem el codi d'exemple que volem trobar.&lt;br /&gt;
*https://github.com/itead/ITEADLIB_Arduino_Nextion&lt;br /&gt;
Anem a examples &amp;gt; CompGauge. Hi ha tres fitxers: el .ino és el de l'Arduino; el HMI (Human Machine Interface), és el que podem obrir amb l'editor (també està en binari); i el .tft és el compilat. Nosaltres agafem el HMI i l'obrim amb l'editor, el podem modificar, i el compilarem. El compilat l'haurem de ficar en una targeta SSD que ficarem en la pantalla Nextion.&lt;br /&gt;
&lt;br /&gt;
Formatar la targeta SSD en FAT32, per no tenir problemes. Per ex, des d'una màquina de Windows. Un cop tenim el programa tft en la targeta microSSD, la fiquem, connectem la pantalla Nextion, la reconeix, i ho grava a la memòria de forma permanent. Quan hagi acabat ja podem treure la targeta i no la necessitarem més.&lt;br /&gt;
&lt;br /&gt;
En el fitxer CompGauge_v0_32.ino he hagut d'afegir les línies d'abans:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#define ESP32&lt;br /&gt;
HardwareSerial HMISerial(2); // UART2. U2_RXD:GPIO16, U2_TXD:GPIO17&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ha compilat i ha funcionat després de comentar en dos llocs la línia:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;SoftwareSerial.h&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
que deia que no la trobava, però per sort sembla ser que no la necessitava per funcionar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''todo'':&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
salvier@gmail.com&lt;br /&gt;
Xavier Gallego&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Autor}}, juny 2018&lt;/div&gt;</summary>
		<author><name>Joan</name></author>
		
	</entry>
</feed>