Diferència entre revisions de la pàgina «DAM 2021-2022»

De binefa.com
Salta a la navegació Salta a la cerca
m
 
(Hi ha 251 revisions intermèdies del mateix usuari que no es mostren)
Línia 6: Línia 6:
 
[https://docs.google.com/spreadsheets/d/1Bar_uwkB30Z8wKWxieTwwDLkOlyb3xcAUNSVm90glhs/ Llista de 2n de DAM]
 
[https://docs.google.com/spreadsheets/d/1Bar_uwkB30Z8wKWxieTwwDLkOlyb3xcAUNSVm90glhs/ Llista de 2n de DAM]
  
== 20211001 ==
+
[https://meet.google.com/wwr-knez-ukp Teleconferència provisional per a compartir pantalla i confinats]
 +
 
 +
== 20220610 '''Examen M07UF1 d'avaluació extraordinària''' ==
 +
[https://www.binefa.cat/dam2122xtra/20220610_exM07Uf1_xtra.pdf Examen en format pdf]
 +
 
 +
[https://www.binefa.cat/dam2122xtra/20220610_exM07Uf1_xtra.zip Material per a fer l'examen]
 +
 
 +
== 20220523 '''Presentació del projecte Final''' ==
 +
[https://docs.google.com/spreadsheets/d/1NLlDl_UYBDxUSHgUplF_pQwiUtkEfSEy/edit#gid=1296317876 Relació de projectes DAM 2021-2022]
 +
 
 +
== 20220520 '''Projecte Final''' ==
 +
[https://docs.google.com/spreadsheets/d/1NLlDl_UYBDxUSHgUplF_pQwiUtkEfSEy/edit#gid=1296317876 Relació de projectes DAM 2021-2022]
 +
 
 +
== 20220516 '''Projecte Final''' ==
 +
[https://docs.google.com/spreadsheets/d/1NLlDl_UYBDxUSHgUplF_pQwiUtkEfSEy/edit#gid=1296317876 Relació de projectes DAM 2021-2022]
 +
== 20220513 '''Projecte Final''' ==
 +
[https://docs.google.com/spreadsheets/d/1NLlDl_UYBDxUSHgUplF_pQwiUtkEfSEy/edit#gid=1296317876 Relació de projectes DAM 2021-2022]
 +
 
 +
== 20220509 '''Projecte Final''' ==
 +
[https://docs.google.com/spreadsheets/d/1NLlDl_UYBDxUSHgUplF_pQwiUtkEfSEy/edit#gid=1296317876 Relació de projectes DAM 2021-2022]
 +
 
 +
== 20220506 '''Projecte Final''' ==
 +
[https://docs.google.com/spreadsheets/d/1NLlDl_UYBDxUSHgUplF_pQwiUtkEfSEy/edit#gid=1296317876 Relació de projectes DAM 2021-2022]
 +
 
 +
== 20220502 '''Projecte Final''' ==
 +
[https://docs.google.com/spreadsheets/d/1NLlDl_UYBDxUSHgUplF_pQwiUtkEfSEy/edit#gid=1296317876 Relació de projectes DAM 2021-2022]
 +
 
 +
== 20220425 '''Projecte Final''' ==
 +
[https://docs.google.com/spreadsheets/d/1NLlDl_UYBDxUSHgUplF_pQwiUtkEfSEy/edit#gid=1296317876 Relació de projectes DAM 2021-2022]
 +
 
 +
== 20220422 '''Examen ordinària M09UF2, M09UF3 i M15UF1''' (4h) ==
 +
[https://recull.binefa.cat/files/20220422_ex/ Notes provisionals de les pràctiques a dia d'avui]
 +
 
 +
[https://www.binefa.cat/damEx2122/ 20220422_ExOrd_2DAM_M09UF2_M09UF3_M15UF1]
 +
 
 +
[http://formacio.things.cat/snap/snap.html#open:../codisSnap/elevador.xml Accés directe a l'exemple de l'elevador per Snap!]
 +
 
 +
[https://www.binefa.cat/damEx2122/IoT-02_mqtt_elevador_Clot.zip Microprogramari per a l'elevador amb la contrasenya WiFi de classe]
 +
 
 +
== 20220408 (4h) ==
 +
[https://recull.binefa.cat/files/20220408/ Recull de codis comentats avui]
 +
 
 +
* Dubtes pendents
 +
 
 +
* Fils
 +
 
 +
* Seguim fent el [[Recull de pràctiques de 2n de DAM. Curs 2021-2022]]
 +
 
 +
== 20220404 (2h) ==
 +
[https://recull.binefa.cat/files/20220404/ Recull de codis comentats avui]
 +
 
 +
* Dubtes pendents
 +
 
 +
* Seguim fent el [[Recull de pràctiques de 2n de DAM. Curs 2021-2022]]
 +
 
 +
* Nombres de tipus ''float'' a les Qt:
 +
    union uFloat{
 +
      float f;
 +
      unsigned char uc[4];
 +
    };
 +
 
 +
    qDebug () << "MIDA D'UN FLOAT: " << sizeof(float);
 +
    union uFloat uf1;
 +
    uf1.f = 1.2f;
 +
 +
    qDebug() << QString("uf1.f: %1").arg(uf1.f);
 +
    qDebug() << "uf1.uc[3]: " << '''Qt::hex''' << uf1.uc[3]; // '''Qt::hex''' és per a visulatitzar en hexadecimal el valor de després (''uf1.uc[3]'' al codi).
 +
    qDebug() << "uf1.uc[2]: " << Qt::hex << uf1.uc[2];
 +
    qDebug() << "uf1.uc[1]: " << Qt::hex << uf1.uc[1];
 +
    qDebug() << "uf1.uc[0]: " << Qt::hex << uf1.uc[0];
 +
 
 +
Sembla que l'ordre hexadecimal és a l'inrevès. podeu fer la prova amb aquest [https://www.binefa.cat/training/codes/js/ieee754/ieee754.html codificador / descodificador IEEE 754 en línia]
 +
 
 +
== 20220401 (4h) ==
 +
[https://recull.binefa.cat/files/20220401/ Recull de codis comentats avui]
 +
 
 +
* Dubtes pendents
 +
 
 +
* Seguim fent el [[Recull de pràctiques de 2n de DAM. Curs 2021-2022]]
 +
 
 +
=== Explicació de formatació de dades per a fer un ''downlink'' LoRaWAN ===
 +
[https://recull.binefa.cat/files/20220401/exempleFormatDownlink.json exempleFormatDownlink.json]
 +
 
 +
=== '''FreeRTOS''' ===
 +
[https://github.com/jordibinefa/IoT-02/tree/master/codes/freeRTOS Alguns codis funcionant amb FreeRTOS per a la placa IoT-02 basada en ESP32]
 +
 
 +
[https://techtutorialsx.com/2017/05/06/esp32-arduino-creating-a-task/ Explicació d'un codi bàsic en FreeRTOS]
 +
 
 +
[https://www.freertos.org/Documentation/RTOS_book.html '''Manual de referència per al FreeRTOS''']
 +
 
 +
== 20220328 (2h) ==
 +
[https://recull.binefa.cat/files/20220328/ Recull de codis comentats avui]
 +
 
 +
* Dubtes pendents
 +
 
 +
* Seguim fent el [[Recull de pràctiques de 2n de DAM. Curs 2021-2022]]
 +
 
 +
Codi comentat a classe:
 +
    ''fTc = ((float)nTx100_bme()) / 100;''
 +
    json_IoT["T"] = nTx100_bme();
 +
    ''float fRH = ((float)nRHx100_bme()) / 100;''
 +
    json_IoT["RH"] = nRHx100_bme();
 +
    ''float fP = ((float)nPx100_bme()) / 100;''
 +
    json_IoT["P"] = nPx100_bme();
 +
 
 +
== 20220325 (4h) ==
 +
[https://recull.binefa.cat/files/20220325/ Recull de codis comentats avui]
 +
 
 +
* Dubtes pendents
 +
 
 +
* Seguim fent el [[Recull de pràctiques de 2n de DAM. Curs 2021-2022]]
 +
 
 +
* Paho Mqtt
 +
 
 +
=== MQTT i Python ===
 +
A una cel·la del jupyter-lab:
 +
# pip install paho-mqtt
 +
 +
import random
 +
 +
import paho.mqtt.subscribe as subscribe
 +
import paho.mqtt.client as mqtt
 +
import paho.mqtt.properties as properties
 +
 +
mqttc = mqtt.Client('idClient-'+str(random.randrange(100000,999999)))
 +
 +
mqttc.connect("broker.emqx.io", 1883)
 +
 +
def on_message(clientId, userdata, message):
 +
    msg = str(message.payload.decode("utf-8"))
 +
    print('topic = ', message.topic)
 +
    print('payload = ', msg)
 +
 +
mqttc.on_message = on_message
 +
mqttc.subscribe('topicName')
 +
 
 +
A una altra cel·la del jupyter-lab:
 +
mqttc.loop_start()
 +
 
 +
=== MQTT i JS ===
 +
[http://formacio.things.cat/mac_IoT-02/ Control de la placa IoT-02 des de client web]
 +
 
 +
== 20220321 (2h) ==
 +
'''Informació important''': Excepcionalment, avui s'acaba la classe a 1/4 de 6 (17.15). La propera classe, M08, començarà a 3/4 de 6 (17.45, no a 1/4 de 7).
 +
 
 +
[https://recull.binefa.cat/files/20220321/ Recull de codis comentats avui]
 +
 
 +
* Dubtes pendents
 +
 
 +
* Seguim fent el [[Recull de pràctiques de 2n de DAM. Curs 2021-2022]]
 +
 
 +
=== MQTT i Python ===
 +
A una cel·la del jupyter-lab:
 +
 
 +
import paho.mqtt.subscribe as subscribe
 +
import paho.mqtt.client as mqtt
 +
import paho.mqtt.properties as properties
 +
 +
mqttc = mqtt.Client('idClient-'+str(random.randrange(100000,999999)))
 +
 +
mqttc.connect("broker.emqx.io", 1883)
 +
 +
def on_message(clientId, userdata, message):
 +
    msg = str(message.payload.decode("utf-8"))
 +
    print('topic = ', message.topic)
 +
    print('payload = ', msg)
 +
 +
mqttc.on_message = on_message
 +
mqttc.subscribe('topicName')
 +
 
 +
A una altra cel·la del jupyter-lab:
 +
mqttc.loop_start()
 +
 
 +
==20220318 (4h) ==
 +
[https://recull.binefa.cat/files/20220318/ Recull de codis comentats avui]
 +
 
 +
=== InfluxDB v2.0 ===
 +
'''Verifiqueu si realment no ho tenia instal·lat ja!'''
 +
 
 +
* Instal·lació de la base de dades temporal a la [http://www.binefa.com/index.php?title=DAM_2020-2021#Actualitzaci.C3.B3_de_la_m.C3.A0quina_virtual màquina virtual Linux]
 +
[https://docs.influxdata.com/influxdb/v2.0/get-started/ Instal·lació d'InfluxDB 2.0] i [https://portal.influxdata.com/downloads/ lloc de descàrregues]
 +
 
 +
curl -s https://repos.influxdata.com/influxdb2.key | gpg --import -
 +
wget -qO- https://repos.influxdata.com/influxdb2.key | sudo apt-key add -
 +
wget https://dl.influxdata.com/influxdb/releases/influxdb2-2.0.4-linux-amd64.tar.gz.asc
 +
wget https://dl.influxdata.com/influxdb/releases/influxdb2-2.0.4-amd64.deb
 +
sudo dpkg -i influxdb2-2.0.4-amd64.deb
 +
 
 +
Un cop instal·lat ha de sortir:
 +
...
 +
Setting up influxdb2 (2.0.4) ...
 +
Created symlink /etc/systemd/system/influxd.service → /lib/systemd/system/influxdb.service.
 +
Created symlink /etc/systemd/system/multi-user.target.wants/influxdb.service → /lib/systemd/system/influxdb.service.
 +
 
 +
 
 +
* Configuració a la nova màquina virtual:
 +
InfluxDB : ecat / clotfje1234
 +
Organization Name: Clot
 +
Bucket Name: api/v2/query
 +
 
 +
* Escriptura i lectura de dades des del NodeRed a Influx DB v2.0
 +
[https://www.binefa.cat/training/nodered/influxDB_2.0/escripturaInfluxDB.nodered.txt Escriptura de dades múltiple des del NodeRed]
 +
 
 +
[https://www.binefa.cat/training/nodered/influxDB_2.0/lecturaInfluxDB.nodered.txt Lectura de dades múltiple des del NodeRed]
 +
 
 +
=== Grafana ===
 +
'''Verifiqueu si realment no ho tenia instal·lat ja!'''
 +
 
 +
* En cas de no tenir-ho instal·lat, feu aquesta actrualització de l'aplicació web de visualització de dades a la [https://www.binefa.com/index.php/DAM_2021-2022#Actualitzaci.C3.B3_de_la_m.C3.A0quina_virtual Actualització de la màquina virtual].
 +
[https://grafana.com/grafana/download?platform=linux Descàrrega de Grafana]
 +
 
 +
* Posada en marxa
 +
Recàrrega dels serveis dimoni:
 +
'''sudo systemctl daemon-reload'''
 +
 
 +
Feu que arrenqui el servei quan poseu en marxa la màquina virtual:
 +
'''sudo systemctl enable grafana-server'''
 +
 
 +
Poseu el servei en marxa:
 +
'''sudo systemctl start grafana-server'''
 +
 
 +
Verifiqueu l'estat del servei:
 +
'''systemctl status grafana-server'''
 +
 
 +
* Primer accés
 +
admin / admin
 +
 
 +
Us demanarà un canvi de la contrasenya d'administració. A la nova màquina virtual és:
 +
admin / clotfje1234
 +
 
 +
* Configuració de Grafana per rebre dades d'InfluxDB mitjançant Flux
 +
[https://docs.influxdata.com/influxdb/v2.0/tools/grafana/ Configure Grafana to use Flux]
 +
 
 +
* Ús de les dades d'InfluxDB a Grafana
 +
[https://grafana.com/docs/grafana/latest/datasources/influxdb/ Using InfluxDB in Grafana]
 +
 
 +
from(bucket: "api/v2/query")
 +
|> range(start: v.timeRangeStart, stop: v.timeRangeStop)
 +
 
 +
=== Exercici de prova  ===
 +
[https://www.binefa.cat/training/nodered/influxDB_2.0/escripturaUnaDadaAleatoriaInfluxDB.nodered.txt Flux NodeRED d'escriptura d'una dada aleatòria a InfluxDB] a l'organització '''Clot''' al ''bucket'' '''aleatori/v1'''
 +
 
 +
Codi Flux per a la graficació a Grafana:
 +
from(bucket: "aleatori/v1")
 +
|> range(start: v.timeRangeStart, stop: v.timeRangeStop)
 +
 
 +
=== Serveis (Processos) ===
 +
* Per saber si el servei està en marxa:
 +
systemctl status influxd
 +
 
 +
* Per a engegar un servei
 +
sudo systemctl start influxd
 +
 
 +
* Per a aturar un servei
 +
sudo systemctl stop influxd
 +
 
 +
* Per a fer que el servei s'engegui a l'iniciar el sistema:
 +
sudo systemctl enable influxd
 +
 
 +
* Per a fer que el servei deixi d'engeggar-se a l'iniciar el sistema:
 +
sudo systemctl disable influxd
 +
 
 +
* Llista els serveis que arrenquen (enable) a l'iniciar el sistema:
 +
systemctl list-unit-files --type=service | grep influx
 +
 
 +
* Per a veure els ports TCP / UDP dels serveis:
 +
sudo netstat -aputn
 +
Sense sudo no es veu el nom del procés.
 +
 
 +
=== Més teoria ===
 +
[https://www.grafanacon.org/2019/presentations/Grafana_Flux_JTL.pdf Grafana & Flux. New Flux support in Grafana] by Jacob Lisi @JacobLisi
 +
 
 +
=== Actualització de la màquina virtual ===
 +
'''Verifiqueu si realment no ho tenia instal·lat ja!'''
 +
 
 +
* [https://www.digitalocean.com/community/tutorials/how-to-install-and-secure-the-mosquitto-mqtt-messaging-broker-on-debian-10 Instal·lació de MQTT amb contrasenya]
 +
 
 +
* [https://github.com/nodesource/distributions/blob/master/README.md Instal·lació de node i npm]
 +
ecat@iot-ecat:~$ '''sudo bash'''
 +
root@iot-ecat:/home/ecat# '''curl -sL https://deb.nodesource.com/setup_14.x | bash -'''
 +
root@iot-ecat:/home/ecat# '''apt install -y nodejs'''
 +
root@iot-ecat:/home/ecat# '''exit'''
 +
ecat@iot-ecat:~$ '''node --version'''
 +
v14.15.4
 +
ecat@iot-ecat:~$ '''npm -- version'''
 +
6.14.10
 +
 
 +
* Instal·lació i funcionament del NodeRed autònom:
 +
ecat@iot-ecat:~$ '''mkdir bin'''
 +
ecat@iot-ecat:~$ '''cd bin'''
 +
ecat@iot-ecat:~/bin$ '''sudo apt install unzip'''
 +
ecat@iot-ecat:~/bin$ '''mkdir nodered-ui'''
 +
ecat@iot-ecat:~/bin$ '''cd nodered-ui'''
 +
ecat@iot-ecat:~/bin/nodered-ui$ '''wget https://www.binefa.cat/IoT/nodeRed/node_red_ui.zip'''
 +
ecat@iot-ecat:~/bin/nodered-ui$ '''unzip node_red_ui.zip'''
 +
ecat@iot-ecat:~/bin/nodered-ui$ '''node node_modules/node-red/red.js --userDir node_modules/node-red/data --settings node_modules/node-red/settings.js -v --port 2222 --title elmeuTitol --safe flows_meuTitol.json'''
 +
 
 +
== 20220314 (2h) ==
 +
[https://recull.binefa.cat/files/20220314/ Recull de codis comentats avui]
 +
 
 +
* Dubtes pendents
 +
 
 +
* Seguim fent els exercicis pendents del [[Recull de pràctiques de 2n de DAM. Curs 2021-2022]]
 +
 
 +
=== '''Deures per al proper dia''' ===
 +
Porteu una màquina virtual basada en Debian instal·lada al vostre ordinador (Per exemple [http://rebost.binefa.cat/iot/maqVirt/IoT%20-%20eCat%20-%20Debian%2011.x%2064-bit_v20210304_00.zip aquesta màquina virtual de 22GB]. '''Baixeu-la a casa''').
 +
 
 +
L'objectiu d'aquesta màquina virtual és poder treballar amb la base de dades temporal ''InfluxDB'' i el visualitzador de dades ''Grafana''.
 +
 
 +
== 20220311 (4h) ==
 +
[https://recull.binefa.cat/files/20220311/ Recull de codis comentats avui]
 +
 
 +
[[Recull de pràctiques de 2n de DAM. Curs 2021-2022]]
 +
 
 +
=== '''Mastodon''' ===
 +
* Mastodon, una alternativa lliure a Twitter
 +
 
 +
No totes les instàncies de [https://ca.wikipedia.org/wiki/Mastodon_(xarxa_social) Mastodon] faciliten la instal·lació de ''bots''. Per a fer els primers passos us recomano aquesta [https://botsin.space/ instància pensada per a hostatjar ''bots'' de Mastodon] ('''tal i com es va demanar el dia anterior, heu d'haver demanat les credencials a la instància de Mastodon [https://botsin.space/ botsin.space] amb molta antelació. Si ho sol·liciteu avui mateix no podreu seguir la classe''').
 +
 
 +
 
 +
[https://botsin.space/@siarq_sensors Exemple de bot de Mastodon] per a fer lectures de sensors cada hora.
 +
 
 +
<!--[https://gist.github.com/aparrish/661fca5ce7b4882a8c6823db12d42d26 Getting credentials for the Mastodon API with Mastodon.py, step by step]
 +
 
 +
[[Getting credentials for the Mastodon API with Mastodon.py, step by step]] -->
 +
[[Obtenció de les credencials per a l'API de Mastodon amb Mastodon.py, pas per pas]]
 +
 
 +
== 20220307 (2h) ==
 +
[https://recull.binefa.cat/files/20220307/ Recull de codis comentats avui]
 +
 
 +
[[Recull de pràctiques de 2n de DAM. Curs 2021-2022]]
 +
 
 +
=== Autenticació d'accés a NodeRED ===
 +
[https://nodered.org/docs/user-guide/runtime/securing-node-red Securing NodeRED]
 +
 
 +
Generació de la contrasenya d'accés en mode hash des de la carpeta d'execució del NodeRED:
 +
node node_modules/node-red/red.js admin hash-pw
 +
 
 +
En aquest exemple fem servir aquesta contrasenya en mode hash:
 +
'''$2a$08$PbYFpiQSnoVaOfD1daCelU2Kvcg19KElO1DbVtE8GAJXacD6ABq'''
 +
 
 +
Edició de '''settings.js''':
 +
toni@vps-10d8edcd:~/bin/nodered$ nano ./node_modules/node-red/settings.js
 +
 
 +
    // Securing Node-RED
 +
    // -----------------
 +
    // To password protect the Node-RED editor and admin API, the following
 +
    // property can be used. See http://nodered.org/docs/security.html for details.
 +
    adminAuth: {
 +
        type: "credentials",
 +
        users: [{
 +
            username: "'''toni'''",
 +
            password: "'''$2a$08$PbYFpiQSnoVaOfD1daCelU2Kvcg19KElO1DbVtE8GAJXacD6ABq'''",
 +
            permissions: "*"
 +
        }]
 +
    },
 +
 
 +
Un cop fets el canvis '''cal reiniciar el NodeRED'''.
 +
 
 +
=== '''Telegram''' ===
 +
[https://wiki.binefa.cat/index.php?title=Bot_de_Telegram Bot de Telegram]
 +
 
 +
* Creació de bots amb BotFather
 +
 
 +
* Instal·lació de nodes de Telegram a NodeRED (afegiu els nodes '''node-red-contrib-telegrambot''')
 +
 
 +
* Interacció amb un usuari de Telegram
 +
 
 +
* Interacció amb un grup de Telegram
 +
 
 +
[https://recull.binefa.cat/files/doc/bots Material per a fer el bot i flux de prova per al bot de Telegram]
 +
 
 +
=== '''Deures pel proper dia''' ===
 +
 
 +
Feu-vos membres d'aquesta instància de Mastodon: [https://botsin.space/ botsin.space]
 +
 
 +
'''Feu-ho amb prou antelació''', és possible que trigui més de tres hores a donar-vos accés.
 +
 
 +
== 20220304 '''Examen ordinària''' (4h) ==
 +
=== 1a Part - QML ===
 +
<!-- [http://rebost.binefa.cat/dam2122/m07uf1_Qml/20220304_m07uf1_qml_exOrd.zip 20220304_m07uf1_qml_exOrd.zip] -->
 +
[https://recull.binefa.cat/files/20220304exM07uf1Ord/1aPart-QML/ m07uf1_qml_exOrd]
 +
 
 +
=== 2a Part - Qt ===
 +
[https://recull.binefa.cat/files/20220304exM07uf1Ord/2aPart-Qt/ m07uf1_qt_exOrd]
 +
 
 +
== 20220225 (4h) ==
 +
[https://recull.binefa.cat/files/20220225/ Recull de codis comentats avui]
 +
 
 +
* Seguim fent els exercicis del [[Recull de pràctiques de 2n de DAM. Curs 2021-2022]]
 +
 
 +
=== Codificació i descodificació en '''base64''' a les Qt ===
 +
Exemple [https://recull.binefa.cat/files/20220225/01_json_01.zip '''01_json_01.zip'''] al recull del dia d'avui. (Primer premeu el botó ''Llegiu'' i després el botó ''Escriu'')
 +
 
 +
==== Codificació en '''base64''' ====
 +
    '''qsText''' = "2n de DAM";
 +
    ui->lbText->setText('''qsText''');
 +
    ui->lbNum->setText('''qsText.toUtf8().toBase64()''');
 +
 +
    '''qsText''' = "Escola del Clot";
 +
    ui->letext->setText('''qsText''');
 +
    ui->leNum->setText('''qsText.toUtf8().toBase64()''');
 +
 
 +
==== Descodificació des de '''base64''' ====
 +
    QByteArray '''qbaCodificat''' = qjoL["base64"].toString().toLatin1();
 +
 +
    QString '''qsDescodificat''' = QByteArray::fromBase64('''qbaCodificat''', QByteArray::Base64Encoding);
 +
 +
    qDebug() << "qjoL[\"base64\"].toString(): " << qjoL["base64"].toString()
 +
            << " --> descodificat en base64 --> " << '''qsDescodificat''';
 +
 
 +
=== Lectura del valors presents a un QByteArray ===
 +
    QByteArray qba = "123";
 +
 +
    for(int i = 0; i < qba.length(); i++){
 +
        char cC = qba.at(i);
 +
        qDebug() << QString("0x%1").arg(uint8_t(cC), 0, 16);
 +
        //qDebug() << QString("%1").arg(uint8_t(cC), 0, 10);
 +
    }
 +
 
 +
=== Float a 4 bytes i 4 bytes a float en C ===
 +
[https://recull.binefa.cat/files/20220225/float2bytes2float.c float2bytes2float.c]
 +
 
 +
=== Float a 4 bytes i 4 bytes a float en Qt/C++ ===
 +
* A l'arxiu .h:
 +
union uFloat{
 +
    float f;
 +
    unsigned char uc[4];
 +
};
 +
 
 +
* A l'arxiu .cpp:
 +
    union uFloat uFA,uFB;
 +
 +
    uFA.f = 3.24f;
 +
    qDebug() << "*****************";
 +
    for(int i = 0; i <4; i++){
 +
        qDebug() << QString("0x%1").arg(uint8_t(uFA.uc[i]), 0, 16);
 +
    }
 +
    qDebug() << "*****************";
 +
    //uFB.uc[0] = 0x29;
 +
    uFB.uc[0] = 41;
 +
    //uFB.uc[1] = 0x5c;
 +
    uFB.uc[1] = 92;
 +
    //uFB.uc[2] = 0x4f;
 +
    uFB.uc[2] = 79;
 +
    //uFB.uc[3] = 0x40;
 +
    uFB.uc[3] = 64;
 +
    qDebug() << QString("%1").arg(uFB.f);
 +
 +
    uFB.uc[0] = 215;
 +
    uFB.uc[1] = 215;
 +
    uFB.uc[2] = 171;
 +
    uFB.uc[3] = 65;
 +
    qDebug() << QString("%1").arg(uFB.f);
 +
 
 +
== 20220221 (2h) ==
 +
[https://recull.binefa.cat/files/20220221/ Recull de codis comentats avui]
 +
 
 +
* Seguim fent els exercicis del [[Recull de pràctiques de 2n de DAM. Curs 2021-2022]]
 +
 
 +
== 20220218 (4h) ==
 +
[https://recull.binefa.cat/files/20220218/ Recull de codis comentats avui]
 +
 
 +
* Seguim fent els exercicis del [[Recull de pràctiques de 2n de DAM. Curs 2021-2022]]
 +
 
 +
* Codi ''IoT-02-22_ttn-otaa_dam_03_floats_BME280.zip'' que integra LoRaWAN i lectura del sensor BME280. (Desat al recull d'avui)
 +
 
 +
== 20220214 (2h) ==
 +
[https://recull.binefa.cat/files/20220214/ Recull de codis comentats avui]
 +
 
 +
* Downlink LoRaWAN OTAA
 +
 
 +
* [https://www.binefa.com/index.php/DAM_2021-2022#LoRaWAN_ABP LoRaWAN ABP]
 +
 
 +
* Seguim fent els exercicis del [[Recull de pràctiques de 2n de DAM. Curs 2021-2022]]
 +
 
 +
Exemple de gestió de dos caràcters rebuts a la placa IoT-02: ''gestioCadenaRebudaESP32_00.c'' (al recull d'avui)
 +
 
 +
== 20220211 (4h) ==
 +
[https://recull.binefa.cat/files/20220211/ Recull de codis comentats avui]
 +
 
 +
* Codi d'ajuda per a fer la pràctica 5 de QML del [[Recull de pràctiques de 2n de DAM. Curs 2021-2022#QML|Recull de pràctiques de 2n de DAM. Curs 2021-2022]]
 +
 
 +
* Downlink LoRaWAN OTAA
 +
 
 +
* [https://www.binefa.com/index.php/DAM_2021-2022#LoRaWAN_ABP LoRaWAN ABP]
 +
 
 +
* Seguim fent els exercicis del [[Recull de pràctiques de 2n de DAM. Curs 2021-2022]]
 +
 
 +
== 20220207 (2h) ==
 +
[https://recull.binefa.cat/files/20220207/ Recull de codis comentats avui]
 +
 
 +
=== Tramesa de nombres reals emprant LoRa ===
 +
Ajuda a l'exercici ''Lora-3'' del [[Recull de pràctiques de 2n de DAM. Curs 2021-2022]]:
 +
 
 +
* [[Transmissió d'un número real de tipus IEEE-754 (4 bytes) i llur recuperació a NodeRED]]
 +
 
 +
=== Missatges ''downlink'' LoRaWAN ===
 +
* [[Downlink LoRaWAN fent servir TTSv3]]
 +
 
 +
Nous exercicis del [[Recull de pràctiques de 2n de DAM. Curs 2021-2022]]: Lora-4, Qt-9 i QML-8.
 +
 
 +
=== LoRaWAN '''ABP''' ===
 +
Per a fer les pràctiques amb LoRa ABP haurem de desactivar el comptador de trames (cada cop que es reprograma la placa IoT-02 el comptador torna a zero. TTSv3 verifica que el comptatge de trames sigui correcta. Si no es desactiva el comptador de trames semblarà que no es rep la trama). Per a fer-ho, aneu al dispositiu, seleccioneu la pestanya ''General Settings'', premeu el botó ''EXPAND'' a la secció ''Network layer'', desplegueu l'enllaç ''Advanced MAC settings'' i seleccioneu ''Enabled'' a ''Resets frame counters''. Al final deseu els canvis prement el botó ''Save changes''.
 +
 
 +
[https://www.binefa.cat/training/codes/esp32/lora/IoT-02-23_ttn-abp_dam_01.zip Exemple de microprogramari emprant ABP]
 +
 
 +
  // TTN uses SF9 for its RX2 window.
 +
  '''LMIC.dn2Dr = DR_SF9;'''
 +
 
 +
  // Set data rate and transmit power for uplink (note: txpow seems to be ignored by the library)
 +
  '''LMIC_setDrTxpow(''DR_SF7'', 14);'''
 +
 
 +
Nou exercici del [[Recull de pràctiques de 2n de DAM. Curs 2021-2022]]: Lora-5.
 +
 
 +
== 20220204 (4h) ==
 +
[https://recull.binefa.cat/files/20220204/ Recull de codis comentats avui]
 +
 
 +
Fem els exercicis ''Lora-2'' i ''Lora-3'' del [[Recull de pràctiques de 2n de DAM. Curs 2021-2022]]
 +
 
 +
== 20220131 (2h) ==
 +
Al [https://recull.binefa.cat/files/20220131/ recull del 31 de gener de 2022] teniu un exemple de conversió bidireccional de ''float'' a cadena ''unsigned char'' fent servir ''union''.
 +
 
 +
Acabem la pràctica 1 de LoRaWAN i comencem la 2 i la 3.
 +
 
 +
== 20220128 (4h) ==
 +
=== '''LoRaWAN''' ===
 +
[[LoRa 2021-2022]]
 +
 
 +
==== LoRaWAN '''OTAA''' ====
 +
[https://www.binefa.com/index.php/Recull_de_pr%C3%A0ctiques_de_2n_de_DAM._Curs_2021-2022#LoRa-1.29 1r exercici de LoRa] al [[Recull de pràctiques de 2n de DAM. Curs 2021-2022]]
 +
 
 +
[[LoRa 2020-2021]]
 +
 
 +
== 20220124 (2h) ==
 +
[https://recull.binefa.cat/files/20220124/ Recull d'avui] Captura del conjunt final de control
 +
 
 +
MqttBasic::~MqttBasic(){
 +
    if (m_client->state() == QMqttClient::Connected)
 +
        m_client->disconnectFromHost();
 +
    delete ui;
 +
}
 +
 
 +
void IndicadorLed::on_cbR_clicked(bool checked){
 +
    vSetLabelColor(ui->lbR,(checked)?Qt::red:Qt::darkRed,Qt::darkRed);
 +
    (*qjoJson)["ledR"] = (checked)?1:0;
 +
    vActualitzaJson(*qjoJson);
 +
}
 +
 
 +
void IndicadorLed::vActualitzaJson(QJsonObject qjsObj){
 +
    QString strFromObj = QJsonDocument(qjsObj).toJson(QJsonDocument::Compact).toStdString().c_str();
 +
    ui->etJson->setText(strFromObj);
 +
    emit vTrametJsonLeds(strFromObj);
 +
}
 +
 
 +
== 20220121 (Baixa professor) (2h) ==
 +
[https://recull.binefa.cat/files/20220117/ Recull de codis pujats el 17 de gener]. Avui s'han afegit un parell d'exercicis.
 +
 
 +
=== Dades '''JSON''' ===
 +
==== Qt ====
 +
[https://erickveil.github.io/2016/04/06/How-To-Manipulate-JSON-With-C++-and-Qt.html How To Manipulate JSON With C++ and Qt]
 +
 
 +
Exemple d'us del format JSON a les Qt: '''01_json_00.zip''' del [https://recull.binefa.cat/files/20220117/ recull]
 +
==== NodeRed ====
 +
'''json00.nodered.txt''' al [https://recull.binefa.cat/files/20220117/ recull]
 +
 
 +
==== ESP32 / placa IoT-02 ====
 +
Biblioteca '''Arduino_JSON''' al [https://recull.binefa.cat/files/20220117/ recull]
 +
 
 +
Codi d'exemple emprant JSON a la placa IoT-02: Codi de microprogramari '''IoT-02_mqtt_10_dam.zip''' al [https://recull.binefa.cat/files/20220117/ recull]
 +
 
 +
=== Visualització de formes i colors a etiquetes QLabel ===
 +
Visualització de led de color: [https://www.binefa.cat/training/qt/dam/00_botonsToggle05.zip '''00_botonsToggle05.zip'''] ([https://youtu.be/hg_YQht6OjA Vídeo explicatiu del codi 00_botonsToggle05]) i [https://www.binefa.cat/training/qt/dam/00_botonsToggle06.zip '''00_botonsToggle06.zip'''] ([https://youtu.be/fymZUDARnK8 Vídeo explicatiu del codi 00_botonsToggle06])
 +
 
 +
Visualització d'un botó físic: '''04_indicadorBotons00.zip''' del [https://recull.binefa.cat/files/20220117/ recull]
 +
 
 +
=== Exercicis ===
 +
Resoldre els exercicis [https://www.binefa.com/index.php/Recull_de_pr%C3%A0ctiques_de_2n_de_DAM._Curs_2021-2022#Qt-3.29 Qt-3, Qt-4, Qt-5, Qt-6 i Qt-7]
 +
 
 +
== 20220117 (2h) ==
 +
[https://recull.binefa.cat/files/20220117/ Recull de codis comentats avui]
 +
 
 +
=== Dades '''JSON''' ===
 +
==== Qt ====
 +
[https://erickveil.github.io/2016/04/06/How-To-Manipulate-JSON-With-C++-and-Qt.html How To Manipulate JSON With C++ and Qt]
 +
 
 +
Exemple d'us del format JSON a les Qt: '''01_json_00.zip''' del [https://recull.binefa.cat/files/20220117/ recull]
 +
==== NodeRed ====
 +
'''json00.nodered.txt''' al [https://recull.binefa.cat/files/20220117/ recull]
 +
 
 +
==== ESP32 / placa IoT-02 ====
 +
Biblioteca '''Arduino_JSON''' al [https://recull.binefa.cat/files/20220117/ recull]
 +
 
 +
Codi d'exemple emprant JSON a la placa IoT-02: Codi de microprogramari '''IoT-02_mqtt_10_dam.zip''' al [https://recull.binefa.cat/files/20220117/ recull]
 +
 
 +
=== Visualització de formes i colors a etiquetes QLabel ===
 +
Visualització de led de color: [https://www.binefa.cat/training/qt/dam/00_botonsToggle05.zip '''00_botonsToggle05.zip'''] ([https://youtu.be/hg_YQht6OjA Vídeo explicatiu del codi 00_botonsToggle05]) i [https://www.binefa.cat/training/qt/dam/00_botonsToggle06.zip '''00_botonsToggle06.zip'''] ([https://youtu.be/fymZUDARnK8 Vídeo explicatiu del codi 00_botonsToggle06])
 +
 
 +
Visualització d'un botó físic: '''04_indicadorBotons00.zip''' del [https://recull.binefa.cat/files/20220117/ recull]
 +
 
 +
=== Exercicis ===
 +
Resoldre els exercicis [https://www.binefa.com/index.php/Recull_de_pr%C3%A0ctiques_de_2n_de_DAM._Curs_2021-2022#Qt-3.29 Qt-3, Qt-4 i Qt-5]
 +
 
 +
== 20220114 (Baixa professor) (4h) ==
 +
Al [https://recull.binefa.cat/files/notes/ recull provisional de notes] podeu consultar l'avaluació de les pràctiques que m'heu fet arribar. En cas de no estar al dia, feu l'esforç de posar-vos-hi avui (un cop finalitzeu les tasques encomanades per cada bloc de dues hores, que són prioritàries).
 +
 
 +
=== IoT (1r bloc) ===
 +
'''Pugeu la pràctica a la carpeta compartida'''. Tant el document amb pdf com els codis comprimits en format .zip o .tar.gz (ni .rar ni .7z). Un cop ho trameteu, feu-me arribar un correu electrònic indicant que ja heu pujat la pràctica.
 +
 
 +
Per a fer aquesta pràctica, el professor posarà en marxa el punt d'accés que fem servir per a les pràctiques IoT. Altrament, podeu emprar com a punt d'accés un telèfon mòbil capaç de servir una xarxa sense fils de 2,4GHz (tot sovint, a Android es pot seleccionar la banda de punt d'accés: 2,4GHz o 5GHz). La connectivitat de l'ESP32 de la placa IoT-02 a la xarxa sense fils '''tan sols pot ser a 2,4GHz''' i no a 5GHz. Una eina Android que us pot ajudar és [https://play.google.com/store/apps/details?id=com.farproc.wifi.analyzer&hl=es&gl=US WiFiAnalyzer].
 +
 
 +
A la placa IoT-02 implementeu l'exercici [https://www.binefa.com/index.php/Recull_de_pr%C3%A0ctiques_de_2n_de_DAM._Curs_2021-2022#Servint_p.C3.A0gina_web_per_a_canviar_contrasenya Servint pàgina web per a canviar contrasenya] ('''hi ha 4 apartats''').
 +
 
 +
=== Qt / QML (2n bloc) ===
 +
'''Pugeu la pràctica a la carpeta compartida'''. Tant el document amb pdf com els codis comprimits en format .zip o .tar.gz (ni .rar ni .7z). Un cop ho trameteu, feu-me arribar un correu electrònic indicant que ja heu pujat la pràctica.
 +
 
 +
A la carpeta d'[https://recull.binefa.cat/files/examensAntics/ exàmens antics del recull] hi teniu '''material_20210225ex_M07UF1.zip''' amb material per a fer un examen del curs passat (en .pdf i en .odt per a que pugueu fer el vostre document. I arxius .zip que us ajudaran a resoldre-ho).
 +
 
 +
== 20220110 (Baixa professor) (2h) ==
 +
=== IoT ===
 +
Per a fer aquesta pràctica, podeu demanar al professor que posi en marxa el punt d'accés que fem servir per a les pràctiques IoT. Altrament, podeu emprar com a punt d'accés un telèfon mòbil capaç de servir una xarxa sense fils de 2,4GHz (tot sovint, a Android es pot seleccionar la banda de punt d'accés: 2,4GHz o 5GHz). La connectivitat de l'ESP32 de la placa IoT-02 a la xarxa sense fils '''tan sols pot ser a 2,4GHz''' i no a 5GHz. Una eina Android que us pot ajudar és [https://play.google.com/store/apps/details?id=com.farproc.wifi.analyzer&hl=es&gl=US WiFiAnalyzer].
 +
 
 +
A la placa IoT-02 implementeu l'exercici [https://www.binefa.com/index.php/Recull_de_pr%C3%A0ctiques_de_2n_de_DAM._Curs_2021-2022#Servint_p.C3.A0gina_web_per_a_canviar_contrasenya Servint pàgina web per a canviar contrasenya]
 +
 
 +
== 20211217 (4h) ==
 +
[https://recull.binefa.cat/files/20211217/ Recull de codis del dia d'avui] usuari: ''dam'' / contrasenya: ''dam2122''
 +
 
 +
* 1a hora
 +
 
 +
- Hem plantejat l'exercici 5 del [[Recull de pràctiques de 2n de DAM. Curs 2021-2022]]
 +
 
 +
- Hem repassat [https://recull.binefa.cat/files/20211217/ codis introductoris de QML]
 +
 
 +
- Seguim acabant el [[Recull de pràctiques de 2n de DAM. Curs 2021-2022]]
 +
 
 +
- Per a l'exercici Qt-2c del [[Recull de pràctiques de 2n de DAM. Curs 2021-2022]] hem vist que per a maximitzar el giny en execució es pot posar al constructor:
 +
 
 +
showMaximized();
 +
 
 +
- Anul·lat l'exercici Qt-2d (degut que a les noves versions els ginys dels contenidors no són seleccionables)
 +
 
 +
* 2a hora
 +
 
 +
- Seguim acabant el [[Recull de pràctiques de 2n de DAM. Curs 2021-2022]]
 +
 
 +
== 20211213 (2h) ==
 +
[https://recull.binefa.cat/files/20211213/ Recull de codis del dia d'avui] usuari: ''dam'' / contrasenya: ''dam2122''
 +
 
 +
* Integreu les Qt amb l'SDK i l'NDK de l'Android Studio que teniu instal·lat. Feu una prova de funcionament amb el vostre mòbil, real o emulat. Exercici '''Qt-2''' del [[Recull de pràctiques de 2n de DAM. Curs 2021-2022]]
 +
 
 +
* Fem revisió del contingut a les carpetes compartides.
 +
 
 +
* Anem acabant els exercicis pendents del [[Recull de pràctiques de 2n de DAM. Curs 2021-2022]]
 +
 
 +
== 20211210 (4h) ==
 +
[https://recull.binefa.cat/files/20211210/ Recull de codis del dia d'avui] usuari: ''dam'' / contrasenya: ''dam2122''
 +
 
 +
Fem revisió del contingut a les carpetes compartides.
 +
 
 +
Anem acabant els exercicis pendents del [[Recull de pràctiques de 2n de DAM. Curs 2021-2022]]
 +
 
 +
== 20211203 (4h) ==
 +
[https://recull.binefa.cat/files/20211203/ Recull de codis del dia d'avui] usuari: ''dam'' / contrasenya: ''dam2122''
 +
 
 +
=== IoT ===
 +
==== Wokwi ====
 +
Aneu a aquest [https://wokwi.com/arduino/projects/316434364352168512 projecte de wokwi] i canvieu el codi ''sketch.ino'' pel que hi ha al recull de codis d'avui. Canvieu el text de ''ClientID'' per a que sigui únic.
 +
 
 +
Obriu ''minimMqttSnap.xml'', que hi ha al recull de codis d'avui, a un [http://extensions.snap.berkeley.edu/snap/snap.html Snap! sense SSL] (recordeu activar les extensions per a JavaScript)
 +
 
 +
==== UserLAnd ====
 +
Instal·leu-vos l'aplicació [https://userland.tech/ UserLAnd] al vostre telèfon mòbil (present a Google Play i aviat a App Store). Si no teniu mòbil disponible, feu servir un emulador d'Android.
 +
 
 +
Connecteu el vostre mòbil, real o emulat, a la xarxa sense fils per a IoT i poseu en marxa l'aplicació. Un cop a dins, instal·leu-vos un Debian (80MB). Us demanarà un nom d'usuari i contrasenya. Feu una instal·lació que permeti veure al navegador del vostre ordinador un NodeRED executant-se des del mòbil.
 +
 
 +
Per a fer-ho:
 +
 +
sudo apt update
 +
sudo apt upgrade
 +
sudo apt install aptitude openssh-server net-tools curl software-properties-common wget unzip screen
 +
A partir d'ara us podeu connectar remotament per SSH fent servir el '''port 2022''' ( ''ssh usuari@ipMobil -p 2022'' o ''ssh -o ServerAliveInterval=30 usuari@ipMobil -p 2022'' per a que hi hagi persistència en la comunicació)
 +
mkdir bin
 +
cd bin
 +
curl -sL https://deb.nodesource.com/setup_14.x | sudo bash -
 +
sudo apt-get install -y nodejs
 +
node -v
 +
npm -v
 +
mkdir nodered-ui
 +
cd nodered-ui
 +
wget --no-check-certificate https://www.binefa.cat/IoT/nodeRed/node_red_ui.zip
 +
unzip node_red_ui.zip
 +
screen
 +
node node_modules/node-red/red.js --userDir node_modules/node-red/data --settings node_modules/node-red/settings.js -v --port 2222 --title elmeuTitol --safe flows_meuTitol.json
 +
Premeu '''Ctrl A''' + '''D'''. I per a tornar a ''screen'' funcionant des del rerefons:
 +
screen -r
 +
 
 +
=== Qt i QML ===
 +
Seguim desenvolupant la pràctica 1 de Qt i l'exercici 4 de QML del [[Recull de pràctiques de 2n de DAM. Curs 2021-2022]].
 +
 
 +
== 20211129 (2h) ==
 +
[https://recull.binefa.cat/files/20211129/ Recull de codis del dia d'avui] usuari: ''dam'' / contrasenya: ''dam2122''
 +
 
 +
=== Qt ===
 +
Seguim desenvolupant la pràctica 1 del [[Recull de pràctiques de 2n de DAM. Curs 2021-2022]].
 +
 
 +
=== Connectant Qt i QML ===
 +
Exercici 4 de QML del [[Recull de pràctiques de 2n de DAM. Curs 2021-2022]].
 +
 
 +
A '''qmlLliscant_02.zip''', traieu les cometes dobles de:
 +
font.bold: '''"true"'''
 +
per a deixar-ho així:
 +
font.bold: '''true'''
 +
 
 +
 
 +
* Modificacions (arxiu '''01_qmlLliscant_10.zip''' actualitzat al recull d'avui):
 +
 
 +
A '''Lliscant01Form.ui.qml''':
 +
Item {
 +
    id: element
 +
    width: 400
 +
    height: 400
 +
    property alias text1: text1
 +
    property alias progressBar: progressBar
 +
 +
    ProgressBar {
 +
        id: progressBar
 +
        y: 189
 +
        '''value: 0.5'''
 +
        '''//maximumValue: 100'''
 +
        anchors.right: parent.right
 +
        anchors.rightMargin: 20
 +
        anchors.left: parent.left
 +
        anchors.leftMargin: 20
 +
    }
 +
 
 +
A '''main.qml''':
 +
 
 +
ApplicationWindow {
 +
    visible: true
 +
    width: 640
 +
    height: 480
 +
    title: qsTr("Exemple Lliscant")
 +
    RereFons{
 +
        id: rf
 +
 +
        onCmptChanged: {
 +
            console.log(nCmpt);
 +
            swipeView.actualitzaBarraDeProgres(nCmpt);
 +
        }
 +
    }
 +
    SwipeView{
 +
        id: swipeView
 +
        anchors.fill: parent
 +
        currentIndex: tabBar.currentIndex
 +
 +
        function actualitzaBarraDeProgres(n){
 +
            '''l01.progressBar.value = n/100;'''
 +
            l01.text1.text = n; // canvieu element1 per text1 a l'editor QML
 +
        }
 +
 +
        Lliscant00Form{
 +
            botoTramet.onClicked: {
 +
                console.log(textInputTE.text)
 +
                rf.szCadena = textInputTE.text;
 +
            }
 +
        }
 +
        Lliscant01Form{
 +
            id: l01
 +
        }
 +
    }
 +
 
 +
== 20211126 (4h) ==
 +
[https://recull.binefa.cat/files/20211126/ Recull de codis del dia d'avui] usuari: ''dam'' / contrasenya: ''dam2122''
 +
 
 +
=== Qt ===
 +
Seguim desenvolupant la pràctica 1 del [[Recull de pràctiques de 2n de DAM. Curs 2021-2022]].
 +
 
 +
=== Connectant Qt i QML ===
 +
Exercici 4 de QML del [[Recull de pràctiques de 2n de DAM. Curs 2021-2022]].
 +
 
 +
== 20211122 (2h) ==
 +
[https://recull.binefa.cat/files/20211122/ Recull de codis del dia d'avui] usuari: ''dam'' / contrasenya: ''dam2122''
 +
 
 +
Primer exercici de Qt al [[Recull de pràctiques de 2n de DAM. Curs 2021-2022]].
 +
 
 +
Conceptes nous:
 +
 
 +
* [https://stackoverflow.com/questions/2749798/qlabel-set-color-of-text-and-background QLabel a color]
 +
 
 +
QLabel* pLabel = new QLabel;
 +
pLabel->setStyleSheet("QLabel { background-color : red; color : blue; }");
 +
 
 +
* ''Radio buttons'' (Han de ser agrupats en contenidors. Per exemple: ''Group Box'' o ''Frame'')
 +
 
 +
* ''QTimer'' (Temporitzador que quan es desborda emet un senyal ''timeout()'' i s'ha de connectar a una osca)
 +
 
 +
== 20211119 (4h) ==
 +
[https://forum.qt.io/topic/61134/trying-to-link-with-openssl-libraries-in-windows OpenSSL Windows]
 +
 
 +
=== '''MQTTS i Qt''' ===
 +
Evolució de la classe GinyMqtt per a gestionar més còmodament el protocol TCP/IP MQTT. Analitzem '''contenidor_03.zip''' que permet la connexió '''MQTTS'''.
 +
 
 +
Provem aquest codi que funciona amb MQTTS emprant [http://extensions.snap.berkeley.edu/snap/snap.html#open:http://raw.githubusercontent.com/pixavier/mqtt4snap/master/HelloWorld_NoSSL.xml l'exemple HelloWorld_NoSSL.xml a Snap!] ('''Recordeu activar javaScript extensions'''). Paràmetres a canviar:
 +
 
 +
Servidor (''Broker''): ''iot.electronics.cat:9001''
 +
Usuari: ''ecat''
 +
Contrasenya: ''clotClot''
 +
Tema de subscripció: ''/ledW''
 +
Tema de publicació: ''/provaDAM''
 +
 
 +
Conceptes nous:
 +
* Certificats TLS (''ca.crt'')
 +
 
 +
* Arxiu de recursos ''.qrc'' (ens permet introduir fitxers dins del projecte per a que hi siguin dins de l'executable, sense haver de llegir-los a una ruta externa. Molt convenient per a projectes emprant Android)
 +
 
 +
[https://recull.binefa.cat/files/20211119/ Recull de codis del dia d'avui] usuari: ''dam'' / contrasenya: ''dam2122''
 +
<!-- openssl x509 -in mosquitto.org.crt -text -noout  -->
 +
 
 +
=== QML ===
 +
 
 +
[https://zetcode.com/gui/qtquick/ Qt Quick tutorial]
 +
 
 +
[https://qmlbook.github.io/ A Book about Qt5]
 +
 
 +
[[Introducció al QML. Curs 2021-2022]]
 +
 
 +
== 20211115 (2h) ==
 +
Desenvolupament de la classe GinyMqtt per a gestionar més còmodament el protocol TCP/IP MQTT
 +
 
 +
[https://recull.binefa.cat/files/20211115/ Recull de codis del dia d'avui] usuari: ''dam'' / contrasenya: ''dam2122''
 +
 
 +
[[Introducció al QML. Curs 2021-2022]]
 +
 
 +
== 20211112 (4h) ==
 +
[https://recull.binefa.cat/files/20211112/ Recull de codis del dia d'avui] usuari: ''dam'' / contrasenya: ''dam2122''
 +
 
 +
=== Control de la placa IoT-02 emprant QtMqtt ===
 +
Amb l'exemple [https://doc.qt.io/qt-6/qtmqtt-simpleclient-example.html Simple MQTT Client Example] provem la connectivitat amb el broker per defecte (amb usuari i contrasenya, que teniu a la màquina virtual) i la connectivitat amb el broker públic de test [https://test.mosquitto.org/ mosquitto] (sense usuari mi contrasenya).
 +
 
 +
Cal modificar el codi del microprogramari de la placa IoT-02 per a que el ''broker'' de test ''broker.emqx.io'' d'[https://www.emqx.io/ EMQ X]. Modifiqueu també el ''broker'' a l'exemple [https://doc.qt.io/qt-6/qtmqtt-simpleclient-example.html Simple MQTT Client Example] i feu subscripcions al vostre botó i35 de la placa IoT-02.
 +
 
 +
const char* mqtt_server = "broker.emqx.io";
 +
const int mqtt_port = 1883;
 +
const char* mqtt_user = "";
 +
const char* mqtt_password = "";
 +
 
 +
Proveu-lo també a aquest [http://extensions.snap.berkeley.edu/snap/snap.html#open:http://raw.githubusercontent.com/pixavier/mqtt4snap/master/HelloWorld_NoSSL.xml codi amb sòcols web MQTT d'Snap!]
 +
 
 +
Amb l'exemple [https://doc.qt.io/qt-6/qtmqtt-quicksubscription-example.html Quick MQTT Example] provem també la connectivitat amb un broker públic de test (sense usuari mi contrasenya). Teniu els codis ''quicksubscription'' i ''quickpublication'' al [https://recull.binefa.cat/files/20211112/ recull de codis del dia d'avui] usuari: ''dam'' / contrasenya: ''dam2122''
 +
 
 +
=== Introducció al QML ===
 +
[[Introducció al QML. Curs 2021-2022]]
 +
 
 +
[https://qmlbook.github.io/ Accés al llibre de Qt/QML en línia]
 +
 
 +
Execució de codis QML des del terminal:
 +
/home/jordi/Qt/5.15.2/gcc_64/bin/qmlscene showcase.qml
 +
 
 +
=== Instal·lació de la bibloteca QtMqtt a Linux ===
 +
 
 +
cd Qt/6.1.3/gcc_64/lib
 +
git clone git://code.qt.io/qt/qtmqtt.git
 +
cd qtmqtt/
 +
git checkout 6.1
 +
rm -r examples/
 +
 
 +
Mitjançant el '''Qt Creator''' obriu el projecte /home/jordi/Qt/6.1.3/gcc_64/lib/qtmqtt/'''qtmqtt.pro'''. Aneu al menú i seleccioneu '''Build / Run qmake'''
 +
 
 +
make
 +
sudo make install
 +
 
 +
== 20211108 (2h) ==
 +
[https://recull.binefa.cat/files/20211108/ Recull de codis del dia d'avui] usuari: ''dam'' / contrasenya: ''dam2122''
 +
 
 +
=== Barra d'estat ===
 +
Al recull del dia d'avui hi ha el codi ''principal_03.zip'' que incorpora la gestió de la barra d'estat d'un ''QMainWindow''
 +
 
 +
=== Ús de les màquines virtuals ===
 +
Posem en marxa la màquina virtual amb Debian 11:
 +
 
 +
* Posem en marxa el projecte d'exemple MQTT ''simpleClient''
 +
 
 +
* Executem sobre Android un projecte Qt
 +
 
 +
== 20211105 (4h) ==
 +
Al disc dur que us passaré hi ha dues màquines virtuals (''andro_8.1-r4-VM-32bit.7z'' de 543,8 MB i ''IoT - eCat - Debian 11.x 64-bit_v20210304_00.zip'' de 23,7 GB) al directori ''maquinesVirtuals/Android_i_Qt''
 +
 
 +
=== Màquina virtual amb emulador per a Android ===
 +
[https://www.osboxes.org/android-x86/ Emulador d'Android a una màquina virtual]
 +
 
 +
Aneu amb cura, malgrat és obsolet quelcom es pot fer servir en part: [https://visualgdb.com/tutorials/android/vmware/ Using VMWare to replace the slow Android Emulator]
 +
 
 +
És important que aquesta màquina virtual estigui configurada amb:
 +
* Connexió pont (''bridge'' i no ''NAT'')
 +
* Memòria mínima de 2GB
 +
 
 +
=== Màquina virtual amb Debian 11, Android Studio i Qt6 per a escriptori i Android ===
 +
[http://popotamo.binefa.cat/iot/maqVirt/IoT%20-%20eCat%20-%20Debian%2011.x%2064-bit%20_v20210202_00.zip Adreça de descàrrega de la màquina virtual amb Debian 11, Android Studio i Qt6 per a escriptori i Android]
 +
 
 +
Avui us passaré, comprimida a 19GB, una màquina virtual basada en Debian 11 (a hores d'ara, Debian 11 és en fase de ''testing'') amb els següents programes ja instal·lats i preparats per a funcionar:
 +
 
 +
* Android Studio
 +
* QtCreator amb la darrera Qt5 LTS i les Qt6
 +
* Biblioteca qtMqtt preparada per a funcionar a l'escriptori i a Android amb les Qt6
 +
 
 +
Configuració de la màquina virtual:
 +
* L'usuari per defecte és '''ecat''' (''eCat'')
 +
* La contrasenya de l'usuari '''ecat''' és '''clotfje''' (''ecat'' és membre del grup d'usuaris ''sudo'' i ''dialout''). Almenys a l'hora de passar-vos la màquina virtual. És aconsellable que canvieu la vostra contrasenya d'accés.
 +
* És aconsellable tenir la connexió de xarxa en connexió pont (''bridge''). Però no cal per a connectar-ho amb l'emulador d'Android amb màquina virtual. Sí que caldria per a tenir accés extern al ''broker'' MQTT i al NodeRED (no instal·lats en aquesta primera versió).
 +
* Memòria mínima de 4GB
 +
 
 +
=== Connectant les dues màquines virtuals ===
 +
* Trobeu quina IP té la màquina virtual amb l'emulador d'Android (a l'explicació faré servir com a IP de l'emulador '''172.20.''xy''.''xyz''''').
 +
* Obriu un terminal a la màquina virtual amb Debian 11:
 +
ecat@iot-ecat:~$ '''cd Android/Sdk/platform-tools/'''
 +
ecat@iot-ecat:~/Android/Sdk/platform-tools$ '''./adb connect 172.20.''xy''.''xyz'':5555'''
 +
* daemon not running; starting now at tcp:5037
 +
* daemon started successfully
 +
connected to 172.20.25.152:5555
 +
ecat@iot-ecat:~/Android/Sdk/platform-tools$ '''./adb shell'''
 +
x86:/ $
 +
* Obriu el Qt Creator (premeu la supertecla -aquella amb el símbol d'una finestra propietària- i escriviu-hi Qt). Feu un exemple simple de QML (per exemple el del ''swipe''). Seleccioneu les Qt6 per a escriptori i Android x86 (amb l'opció ''Release'' i sense ''Debug'' ni ''Profile''). Aneu a ''Tools'' / ''Options'' / ''Devices'' i verifiqueu que no hi dóna cap error de configuració (és possible que al principi surtin marques vermelles, però al cap de pocs segons se'n van). Assegureu-vos que compilareu per Android i feu ''Play'' al projecte de les Qt. Seleccioneu el dispositiu compatible ''VMware Virtual Platform''. I premeu al botó ''OK''.
 +
* Al cap de pocs segons hi apareix el programa bàsic ''swipe'' a l'emulador sobre màquina virtual. El podeu aturar prement el botó quadrat vermell d'''Application Output''.
 +
 
 +
=== qtMqtt ===
 +
 
 +
[https://code.qt.io/cgit/qt/qtmqtt.git/ qtMqtt oficial]
 +
 
 +
Feu un git clone i especifiqueu la versió amb un ''git checkout 6.0''. Després:
 +
cd qmqtt
 +
mkdir build
 +
cd build
 +
qmake -r ..
 +
make
 +
sudo make install
 +
 
 +
'''Instal·lació a Windows'''
 +
 
 +
- Si no teniu el llenguatge ''perl'' instal·lat, [https://strawberryperl.com/ instal·leu ''perl'']
 +
 
 +
- Obriu el CMD amb les variables d'entorn de les Qt6
 +
 
 +
git clone git://code.qt.io/qt/qtmqtt.git
 +
cd qmqtt
 +
git checkout 6.1
 +
mkdir build
 +
cd build
 +
qmake -r ..
 +
mingw32-make
 +
mingw32-make install
 +
 
 +
==== Instal·lació de '''QtMqtt per Android''' ====
 +
Malgrat que ja us funcioni la biblioteca QtMqtt en programes d'escriptori, heu de fer la compilació de la biblioteca QtMqtt per a la versió de Qt/QML que feu servir per a poder executar programes que duguin aquesta biblioteca a Android.
 +
 
 +
Hi ha diversos suggeriments de com fer-ho. Després de diversos intents, aquest és el sistema que a mi m'ha funcionat:
 +
 
 +
Cerqueu el directori '''lib''' de la vostra distribució Qt per a '''Android x86''':
 +
jordi@ecat-XPS13:~$ '''/home/jordi/Qt/6.0.0/android_x86/bin/qmake -query QT_INSTALL_LIBS'''
 +
/home/jordi/Qt/6.0.0/android_x86/lib
 +
o, per al dispositiu físic Android amb tecnologia '''Android ARM''':
 +
ecat@iot-ecat:~$ '''/home/ecat/Qt/6.0.0/android_armv7/bin/qmake -query QT_INSTALL_LIBS'''
 +
/home/ecat/Qt/6.0.0/android_armv7/lib
 +
Aneu a la carpeta que ens retorna l'ordre anterior ('''Android x86'''):
 +
jordi@ecat-XPS13:~$ '''cd /home/jordi/Qt/6.0.0/android_x86/lib'''
 +
o, per al dispositiu físic Android amb tecnologia '''Android ARM''':
 +
ecat@iot-ecat:~$ cd /home/ecat/Qt/6.0.0/android_armv7/lib
 +
I feu el procés d'instal·lació ('''Android x86'''):
 +
jordi@ecat-XPS13:~/Qt/6.0.0/android_x86/lib$ '''git clone git://code.qt.io/qt/qtmqtt.git'''
 +
jordi@ecat-XPS13:~/Qt/6.0.0/android_x86/lib$ '''cd qtmqtt/'''
 +
jordi@ecat-XPS13:~/Qt/6.0.0/android_x86/lib/qtmqtt$ '''git checkout 6.0'''
 +
jordi@ecat-XPS13:~/Qt/6.0.0/android_x86/lib/qtmqtt$ '''rm -r examples/'''
 +
o, per al dispositiu físic Android amb tecnologia '''Android ARM''':
 +
ecat@iot-ecat:~/Qt/6.0.0/android_armv7/lib$ '''git clone git://code.qt.io/qt/qtmqtt.git'''
 +
ecat@iot-ecat:~/Qt/6.0.0/android_armv7/lib$ '''cd qtmqtt/'''
 +
ecat@iot-ecat:~/Qt/6.0.0/android_armv7/lib/qtmqtt$ '''git checkout 6.0'''
 +
ecat@iot-ecat:~/Qt/6.0.0/android_armv7/lib/qtmqtt$ rm -r examples/
 +
Per a '''Android x86''', mitjançant el '''Qt Creator''' obriu el projecte /home/jordi/Qt/6.0.0/android_x86/lib/qtmqtt/'''qtmqtt.pro'''. Aneu al menú i seleccioneu '''Build / Run qmake'''
 +
 
 +
Per a '''Android ARM''', mitjançant el '''Qt Creator''' obriu el projecte /home/ecat/Qt/6.0.0/android_armv7/lib/qtmqtt/'''qtmqtt.pro'''. Aneu al menú i seleccioneu '''Build / Run qmake'''
 +
 
 +
Torneu al terminal d'abans i feu ('''Android x86'''):
 +
jordi@ecat-XPS13:~/Qt/6.0.0/android_x86/lib/qtmqtt$ '''make'''
 +
jordi@ecat-XPS13:~/Qt/6.0.0/android_x86/lib/qtmqtt$ '''sudo make install'''
 +
o, per al dispositiu físic Android amb tecnologia '''Android ARM''':
 +
ecat@iot-ecat:~/Qt/6.0.0/android_armv7/lib/qtmqtt$ '''make'''
 +
ecat@iot-ecat:~/Qt/6.0.0/android_armv7/lib/qtmqtt$ '''sudo make install'''
 +
Copieu, fora de la ruta de les Qt, els projectes d'exemple [https://binefa.cat/dam2021/20210121_qml/quickpublication.zip '''quickpublication'''] i [https://binefa.cat/dam2021/20210121_qml/quicksubscription.zip '''quicksubscription''']. Obriu els dos projectes per a que puguin ser executats des de l'escriptori i des del mòbil (emulat o no). Per a verificar llur funcionament, podeu executar un projecte al dispositiu mòbil i l'altre a l'escriptori.
 +
 
 +
== 20211029 (4h) ==
 +
[[Recull de pràctiques de 2n de DAM. Curs 2021-2022]]
 +
 
 +
1a) Feu un nou programa anomenat '''ginyCompost02''', a partir de l'anterior codi. Heu de posar un nou giny de botons a la dreta del giny de text. Quedaran tres ginys: Botons - Text - Botons.
 +
 
 +
1b) Feu que '''ginyCompost02''' tingui també connectades els senyals i les osques del nou giny.
 +
 
 +
== 20211025 (2h)  ==
 +
[[Recull de pràctiques de 2n de DAM. Curs 2021-2022]]
 +
 
 +
Pràctica amb MQTT (sense la S d'MQTTS). Heu de fer servir el port TCP 1883 i amb sócols web el port 9001 ( formacio.things.cat ) amb usuari ''ecat'' i contrasenya ''clotClot''.
 +
 
 +
[https://github.com/jordibinefa/ms-drivers-and-tools/blob/master/certToArduino_01.py Codi en python per a truaduir el text d'un certificat a codi encastable a l'IDE d'Arduino]
 +
 
 +
[[MQTT-Dash. Control del relé de enclavamiento y lectura de la LDR]]
 +
 
 +
* Pràctica amb MQTTS:
 +
 
 +
- Microprogramari amb MQTTS a la placa IoT-02
 +
 
 +
- Connexió mitjançant sòcols web (9001) a un [http://extensions.snap.berkeley.edu/snap/snap.html Snap! sense SSL]. I vam provar mqttSnap.xml.
 +
 
 +
- Connexió mitjançant NodeRED. Encenem i apaguem un led. Grafiquem el nivell de llum mitjançant el sensor LDR.
 +
 
 +
- [https://play.google.com/store/apps/details?id=net.routix.mqttdash&hl=es_419&gl=US Aplicació d'Android MQTT Dash]
 +
 
 +
* Pràctica amb MQTT:
 +
 
 +
Ha de ser el mateix que la pràctica anterior fent servir MQTT en comptes d'MQTTS.
 +
 
 +
== 20211021 (4h) ==
 +
[[Recull de pràctiques de 2n de DAM. Curs 2021-2022]]
 +
 
 +
Al codi mqttSnap.xml heu d'afegir una cancel·lació de subscripció un cop rebeu la vostra MAC.
 +
 
 +
[https://recull.binefa.cat/files/20211022/ Recull de codis del dia d'avui] usuari: ''dam'' / contrasenya: ''dam2122''
 +
 
 +
=== IoT ===
 +
Introducció als protocols TCP MQTT i MQTTS.
 +
 
 +
[https://www.luisllamas.es/que-es-mqtt-su-importancia-como-protocolo-iot/ ¿Qué es MQTT? Su importancia como protocolo IoT]
 +
 
 +
[https://wiki.binefa.cat/index.php?title=MQTT_i_MQTTS Més informació sobre MQTT i MQTTS]
 +
 
 +
==== Adreces comentades a classe ====
 +
 
 +
[https://mosquitto.org/ El broker gratuït més famós]
 +
 
 +
[https://test.mosquitto.org/ Ports emprats per ''mosquitto'']
 +
 
 +
[https://github.com/pixavier/mqtt4snap mqtt4snap] Fet per en Xavier Pi
 +
 
 +
[https://www.emqx.io/ ''Broker'' MQTT] que permet fer balanceig de servei de franc
 +
 
 +
[https://snap.berkeley.edu/snap/snap.html#open:https://raw.githubusercontent.com/pixavier/mqtt4snap/master/HelloWorld.xml Exemple ''Hola món'' amb Snap! amb SSL] Cal activar a la rodeta d'engranatge l'opció '''JavaScript extensions'''
 +
 
 +
[http://extensions.snap.berkeley.edu/snap/snap.html Snap! sense certificat SSL] Cal activar a la rodeta d'engranatge l'opció '''JavaScript extensions'''
 +
 
 +
== 20211018 (2h) ==
 +
[[Recull de pràctiques de 2n de DAM. Curs 2021-2022]]
 +
 
 +
=== Pseudoservidor UDP ===
 +
[https://youtu.be/lKNdgHVRal0 Pseudoservidor UDP emprant Qt5 (1/2)]
 +
 
 +
[https://youtu.be/ElYaaytNb0s Pseudoservidor UDP emprant Qt5 (2/2)]
 +
 
 +
== 20211015 (4h) ==
 +
* UDP
 +
** Al NodeRED
 +
** NodeRED + Placa IoT-02
 +
 
 +
Avui hem aconseguit controlar des del mòbil (tauler de control del NodeRED amb dos botons) l'estat del led blanc de la placa IoT-02.
 +
 
 +
=== IoT ===
 +
Introducció al protocol UDP.
 +
 
 +
[https://www.ionos.es/digitalguide/servidores/know-how/udp-user-datagram-protocol/ UDP: Què és el protocol UDP?]
 +
 
 +
[https://www.binefa.cat/training/upcSchool/20200516/IoT-02_wifi_04_udp.zip Microprogramari que implementa el protocol UDP per a la placa IoT-02].
 +
 
 +
unsigned int udpPortRx = 3334;
 +
unsigned int udpPortTx = 3333;
 +
 
 +
 
 +
[[Image:04wifiUdp.png|center|04_wifiUdp]]
 +
 
 +
[https://www.binefa.cat/training/upcSchool/20200516/IoT-02_wifi_04_udp.nodered.txt Codi per a importar al NodeRED fent servir el protocolo UDP]. El port de recepció de l'ordinador (3333) ha de ser el de transmissió a la placa, i el de recepció a la placa (3334) ha de ser el de transmissió de l'ordinador.
 +
Port Rx = 3333
 +
Port Tx = 3334
 +
 
 +
=== Qt ===
 +
* Concepte '''senyal / osca''' (''signal / slot'')
 +
[https://recull.binefa.cat/files/20211015/ Recull de codis del dia d'avui] usuari: ''dam'' / contrasenya: ''dam2122''
 +
 
 +
== 20211011 (2h) ==
 +
[https://recull.binefa.cat/files/20211011/ Recull de codis del dia d'avui] usuari: ''dam'' / contrasenya: ''dam2122''
 +
 
 +
=== Qt ===
 +
Seguim amb la introducció a les Qt.
 +
 
 +
==== Exercici 02_mesMenys ====
 +
Desenvolupeu una aplicació gràfica d'usuari, anomenada '''02_mesMenys''' amb la classe '''GinyMesMenys''' filla de QWidget, amb tres ginys encastats:
 +
 
 +
* Botó '''botoMes''' amb el signe  '''+'''. Incrementa el valor de l'atribut privat '''nN'''
 +
 
 +
* Botó '''botoMenys''' amb el signe  '''-'''. Decrementa el valor de l'atribut privat '''nN'''
 +
 
 +
* Etiqueta '''etNum''' que presenta el valor de l'atribut privat '''nN'''
 +
 
 +
[[Image:GinyMesMenys.png|center|GinyMesMenys]]
 +
 
 +
== 20211008 (4h) ==
 +
[https://recull.binefa.cat/files/20211008/ Recull de codis del dia d'avui] usuari: ''dam'' / contrasenya: ''dam2122''
 +
 
 +
Introducció a les Qt
 +
 
 +
== 20211004 (2h) ==
 +
Prova amb les plaques IoT-02
 +
 
 +
JESUITES_FP  - educanet01
 +
 
 +
== 20211001 (4h) ==
 
[https://meet.google.com/wwr-knez-ukp Teleconferència pel dia d'avui]
 
[https://meet.google.com/wwr-knez-ukp Teleconferència pel dia d'avui]
  
[http://popotamo.binefa.cat/iot/arduino/libraries_20210505.zip Bblioteques Arduino per a la placa IoT-02] (493M)
+
[http://popotamo.binefa.cat/iot/arduino/libraries_20210505.zip Biblioteques Arduino per a la placa IoT-02] (493M)
  
[https://github.com/jordibinefa/IoT-02/archive/refs/heads/master.zip Codis i disseny electrònic de la placa IoT-02 a Github] o ''git clone https://github.com/jordibinefa/IoT-02.git''
+
[https://github.com/jordibinefa/IoT-02/archive/refs/heads/master.zip Codis i disseny electrònic de la placa IoT-02 a Github] o '''git clone https://github.com/jordibinefa/IoT-02.git'''
  
 
Repartiment de [[Placa IoT-02]]. '''De moment, i fins que no es digui el contari, les tornareu el mateix dia'''.
 
Repartiment de [[Placa IoT-02]]. '''De moment, i fins que no es digui el contari, les tornareu el mateix dia'''.
Línia 17: Línia 1.126:
 
'''Heu de dur a classe una font d'alimentació ''microUSB''''', o un cable de connexió ''microUSB'' per connectar a l'ordinador. Tingueu en compte que us caldrà una altra boca per a connectar el cable ''miniUSB'' que us serà subministrat per a programar la placa IoT-02.
 
'''Heu de dur a classe una font d'alimentació ''microUSB''''', o un cable de connexió ''microUSB'' per connectar a l'ordinador. Tingueu en compte que us caldrà una altra boca per a connectar el cable ''miniUSB'' que us serà subministrat per a programar la placa IoT-02.
  
== 20210927 ==
+
== 20210927 (2h) ==
 
[https://meet.google.com/wwr-knez-ukp Teleconferència pel dia d'avui]
 
[https://meet.google.com/wwr-knez-ukp Teleconferència pel dia d'avui]
  
Línia 32: Línia 1.141:
 
[[Placa IoT-02]]
 
[[Placa IoT-02]]
  
[https://nodejs.org/en/download/ Instal·lació de Node.js]
+
[https://nodejs.org/en/download/ Instal·lació de Node.js] [https://tecadmin.net/install-latest-nodejs-npm-on-debian/ Guia d'instal·lació de node i npm]
  
 
Verificació:
 
Verificació:
Línia 47: Línia 1.156:
 
  ecat@iot-ecat:~/bin/nodered-ui$ '''unzip node_red_ui.zip'''
 
  ecat@iot-ecat:~/bin/nodered-ui$ '''unzip node_red_ui.zip'''
 
  ecat@iot-ecat:~/bin/nodered-ui$ '''node node_modules/node-red/red.js --userDir node_modules/node-red/data --settings node_modules/node-red/settings.js -v --port 2222 --title elmeuTitol --safe flows_meuTitol.json'''
 
  ecat@iot-ecat:~/bin/nodered-ui$ '''node node_modules/node-red/red.js --userDir node_modules/node-red/data --settings node_modules/node-red/settings.js -v --port 2222 --title elmeuTitol --safe flows_meuTitol.json'''
 +
 +
Si hi ha problemes de confiança amb el certificat al descarrega l'arxiu .zip, hi podeu afegir l'opció '''--no-check-certificate''':
 +
 +
wget --no-check-certificate https://www.binefa.cat/IoT/nodeRed/node_red_ui.zip
  
 
= Repositori de codis fet a classe durant el curs =
 
= Repositori de codis fet a classe durant el curs =
Línia 52: Línia 1.165:
  
 
= Documentació =
 
= Documentació =
 +
[[Distribució de M07UF1, M09UF2, M09UF3, M15UF1 i M13 al curs 2021-2022 de 2n de DAM]]
 +
 +
[[Recull de pràctiques de 2n de DAM. Curs 2021-2022]]
 +
 
== Qt/QML ==
 
== Qt/QML ==
 +
[https://youtu.be/b936UY3YZe4 Activació de l'editor QML al QtCreator 6]
 +
 
[http://zetcode.com/gui/qt5/ Qt5] de [https://twitter.com/janbodnar Jan Bodnar]
 
[http://zetcode.com/gui/qt5/ Qt5] de [https://twitter.com/janbodnar Jan Bodnar]
  
Línia 88: Línia 1.207:
  
 
[http://silanus.fr/sin/?p=1194 MQTT avec Qt]
 
[http://silanus.fr/sin/?p=1194 MQTT avec Qt]
 +
 +
=== '''LoRaWAN''' ===
 +
[[LoRa 2021-2022]]
 +
 +
[https://eu1.cloud.thethings.network/ Consola de The Things Stack (Community Edition)] de [https://www.thethingsnetwork.org/ The Things Network]
 +
 +
[https://www.binefa.cat/IoT/lora/lorawan/lorawan01d.pdf Presentació LoRaWAN (esborrany v0.4)]
 +
 +
[https://www.binefa.cat/IoT/05_lorawan_usPractic.pdf Ús pràctic de LoRaWAN TTNv2]
 +
 +
[https://recull.binefa.cat/files/lora/intro/ Recull introductori per a treballar amb LoRa] ( usuari: ''dam'' / contrasenya: ''dam2122'')
 +
 +
[[Recull de pràctiques de 2n de DAM. Curs 2021-2022]]
 +
 +
[[Transmissió d'un número real de tipus IEEE-754 (4 bytes) i llur recuperació a NodeRED]]
 +
 +
[[Downlink LoRaWAN fent servir TTSv3]]

Revisió de 14:34, 6 set 2022

Quan tingueu les credencials d'accés a la NET heu de compartir-me una carpeta amb aquest nom: 2122-DAM-1rCognom2nCognomNom (Per exemple, si el teu nom és Xavier López Pujol --> 2122-DAM-LopezPujolXavier). A aquest enllaç podreu veure si ja hi sou a la llista:

Carpetes compartides de 2n de DAM. Curs 2021-2022

Contingut

Algunes classes

Llista de 2n de DAM

Teleconferència provisional per a compartir pantalla i confinats

20220610 Examen M07UF1 d'avaluació extraordinària

Examen en format pdf

Material per a fer l'examen

20220523 Presentació del projecte Final

Relació de projectes DAM 2021-2022

20220520 Projecte Final

Relació de projectes DAM 2021-2022

20220516 Projecte Final

Relació de projectes DAM 2021-2022

20220513 Projecte Final

Relació de projectes DAM 2021-2022

20220509 Projecte Final

Relació de projectes DAM 2021-2022

20220506 Projecte Final

Relació de projectes DAM 2021-2022

20220502 Projecte Final

Relació de projectes DAM 2021-2022

20220425 Projecte Final

Relació de projectes DAM 2021-2022

20220422 Examen ordinària M09UF2, M09UF3 i M15UF1 (4h)

Notes provisionals de les pràctiques a dia d'avui

20220422_ExOrd_2DAM_M09UF2_M09UF3_M15UF1

Accés directe a l'exemple de l'elevador per Snap!

Microprogramari per a l'elevador amb la contrasenya WiFi de classe

20220408 (4h)

Recull de codis comentats avui

  • Dubtes pendents
  • Fils

20220404 (2h)

Recull de codis comentats avui

  • Dubtes pendents
  • Nombres de tipus float a les Qt:
   union uFloat{
      float f;
      unsigned char uc[4];
   };
   qDebug () << "MIDA D'UN FLOAT: " << sizeof(float);
   union uFloat uf1;
   uf1.f = 1.2f;

   qDebug() << QString("uf1.f: %1").arg(uf1.f);
   qDebug() << "uf1.uc[3]: " << Qt::hex << uf1.uc[3]; // Qt::hex és per a visulatitzar en hexadecimal el valor de després (uf1.uc[3] al codi).
   qDebug() << "uf1.uc[2]: " << Qt::hex << uf1.uc[2];
   qDebug() << "uf1.uc[1]: " << Qt::hex << uf1.uc[1];
   qDebug() << "uf1.uc[0]: " << Qt::hex << uf1.uc[0];

Sembla que l'ordre hexadecimal és a l'inrevès. podeu fer la prova amb aquest codificador / descodificador IEEE 754 en línia

20220401 (4h)

Recull de codis comentats avui

  • Dubtes pendents

Explicació de formatació de dades per a fer un downlink LoRaWAN

exempleFormatDownlink.json

FreeRTOS

Alguns codis funcionant amb FreeRTOS per a la placa IoT-02 basada en ESP32

Explicació d'un codi bàsic en FreeRTOS

Manual de referència per al FreeRTOS

20220328 (2h)

Recull de codis comentats avui

  • Dubtes pendents

Codi comentat a classe:

   fTc = ((float)nTx100_bme()) / 100;
   json_IoT["T"] = nTx100_bme();
   float fRH = ((float)nRHx100_bme()) / 100;
   json_IoT["RH"] = nRHx100_bme();
   float fP = ((float)nPx100_bme()) / 100;
   json_IoT["P"] = nPx100_bme();

20220325 (4h)

Recull de codis comentats avui

  • Dubtes pendents
  • Paho Mqtt

MQTT i Python

A una cel·la del jupyter-lab:

# pip install paho-mqtt

import random

import paho.mqtt.subscribe as subscribe
import paho.mqtt.client as mqtt
import paho.mqtt.properties as properties

mqttc = mqtt.Client('idClient-'+str(random.randrange(100000,999999)))

mqttc.connect("broker.emqx.io", 1883)

def on_message(clientId, userdata, message):
   msg = str(message.payload.decode("utf-8"))
   print('topic = ', message.topic)
   print('payload = ', msg)

mqttc.on_message = on_message
mqttc.subscribe('topicName')

A una altra cel·la del jupyter-lab:

mqttc.loop_start()

MQTT i JS

Control de la placa IoT-02 des de client web

20220321 (2h)

Informació important: Excepcionalment, avui s'acaba la classe a 1/4 de 6 (17.15). La propera classe, M08, començarà a 3/4 de 6 (17.45, no a 1/4 de 7).

Recull de codis comentats avui

  • Dubtes pendents

MQTT i Python

A una cel·la del jupyter-lab:

import paho.mqtt.subscribe as subscribe
import paho.mqtt.client as mqtt
import paho.mqtt.properties as properties

mqttc = mqtt.Client('idClient-'+str(random.randrange(100000,999999)))

mqttc.connect("broker.emqx.io", 1883)

def on_message(clientId, userdata, message):
   msg = str(message.payload.decode("utf-8"))
   print('topic = ', message.topic)
   print('payload = ', msg)

mqttc.on_message = on_message
mqttc.subscribe('topicName')

A una altra cel·la del jupyter-lab:

mqttc.loop_start()

20220318 (4h)

Recull de codis comentats avui

InfluxDB v2.0

Verifiqueu si realment no ho tenia instal·lat ja!

Instal·lació d'InfluxDB 2.0 i lloc de descàrregues

curl -s https://repos.influxdata.com/influxdb2.key | gpg --import -
wget -qO- https://repos.influxdata.com/influxdb2.key | sudo apt-key add -
wget https://dl.influxdata.com/influxdb/releases/influxdb2-2.0.4-linux-amd64.tar.gz.asc
wget https://dl.influxdata.com/influxdb/releases/influxdb2-2.0.4-amd64.deb
sudo dpkg -i influxdb2-2.0.4-amd64.deb

Un cop instal·lat ha de sortir:

...
Setting up influxdb2 (2.0.4) ...
Created symlink /etc/systemd/system/influxd.service → /lib/systemd/system/influxdb.service.
Created symlink /etc/systemd/system/multi-user.target.wants/influxdb.service → /lib/systemd/system/influxdb.service.


  • Configuració a la nova màquina virtual:
InfluxDB : ecat / clotfje1234
Organization Name: Clot
Bucket Name: api/v2/query
  • Escriptura i lectura de dades des del NodeRed a Influx DB v2.0

Escriptura de dades múltiple des del NodeRed

Lectura de dades múltiple des del NodeRed

Grafana

Verifiqueu si realment no ho tenia instal·lat ja!

Descàrrega de Grafana

  • Posada en marxa

Recàrrega dels serveis dimoni:

sudo systemctl daemon-reload

Feu que arrenqui el servei quan poseu en marxa la màquina virtual:

sudo systemctl enable grafana-server

Poseu el servei en marxa:

sudo systemctl start grafana-server

Verifiqueu l'estat del servei:

systemctl status grafana-server
  • Primer accés
admin / admin

Us demanarà un canvi de la contrasenya d'administració. A la nova màquina virtual és:

admin / clotfje1234
  • Configuració de Grafana per rebre dades d'InfluxDB mitjançant Flux

Configure Grafana to use Flux

  • Ús de les dades d'InfluxDB a Grafana

Using InfluxDB in Grafana

from(bucket: "api/v2/query")
|> range(start: v.timeRangeStart, stop: v.timeRangeStop)

Exercici de prova

Flux NodeRED d'escriptura d'una dada aleatòria a InfluxDB a l'organització Clot al bucket aleatori/v1

Codi Flux per a la graficació a Grafana:

from(bucket: "aleatori/v1")
|> range(start: v.timeRangeStart, stop: v.timeRangeStop)

Serveis (Processos)

  • Per saber si el servei està en marxa:
systemctl status influxd
  • Per a engegar un servei
sudo systemctl start influxd
  • Per a aturar un servei
sudo systemctl stop influxd
  • Per a fer que el servei s'engegui a l'iniciar el sistema:
sudo systemctl enable influxd
  • Per a fer que el servei deixi d'engeggar-se a l'iniciar el sistema:
sudo systemctl disable influxd
  • Llista els serveis que arrenquen (enable) a l'iniciar el sistema:
systemctl list-unit-files --type=service | grep influx
  • Per a veure els ports TCP / UDP dels serveis:
sudo netstat -aputn

Sense sudo no es veu el nom del procés.

Més teoria

Grafana & Flux. New Flux support in Grafana by Jacob Lisi @JacobLisi

Actualització de la màquina virtual

Verifiqueu si realment no ho tenia instal·lat ja!

ecat@iot-ecat:~$ sudo bash
root@iot-ecat:/home/ecat# curl -sL https://deb.nodesource.com/setup_14.x | bash -
root@iot-ecat:/home/ecat# apt install -y nodejs
root@iot-ecat:/home/ecat# exit
ecat@iot-ecat:~$ node --version
v14.15.4
ecat@iot-ecat:~$ npm -- version
6.14.10
  • Instal·lació i funcionament del NodeRed autònom:
ecat@iot-ecat:~$ mkdir bin
ecat@iot-ecat:~$ cd bin
ecat@iot-ecat:~/bin$ sudo apt install unzip
ecat@iot-ecat:~/bin$ mkdir nodered-ui
ecat@iot-ecat:~/bin$ cd nodered-ui
ecat@iot-ecat:~/bin/nodered-ui$ wget https://www.binefa.cat/IoT/nodeRed/node_red_ui.zip
ecat@iot-ecat:~/bin/nodered-ui$ unzip node_red_ui.zip
ecat@iot-ecat:~/bin/nodered-ui$ node node_modules/node-red/red.js --userDir node_modules/node-red/data --settings node_modules/node-red/settings.js -v --port 2222 --title elmeuTitol --safe flows_meuTitol.json

20220314 (2h)

Recull de codis comentats avui

  • Dubtes pendents

Deures per al proper dia

Porteu una màquina virtual basada en Debian instal·lada al vostre ordinador (Per exemple aquesta màquina virtual de 22GB. Baixeu-la a casa).

L'objectiu d'aquesta màquina virtual és poder treballar amb la base de dades temporal InfluxDB i el visualitzador de dades Grafana.

20220311 (4h)

Recull de codis comentats avui

Recull de pràctiques de 2n de DAM. Curs 2021-2022

Mastodon

  • Mastodon, una alternativa lliure a Twitter

No totes les instàncies de Mastodon faciliten la instal·lació de bots. Per a fer els primers passos us recomano aquesta instància pensada per a hostatjar bots de Mastodon (tal i com es va demanar el dia anterior, heu d'haver demanat les credencials a la instància de Mastodon botsin.space amb molta antelació. Si ho sol·liciteu avui mateix no podreu seguir la classe).


Exemple de bot de Mastodon per a fer lectures de sensors cada hora.

Obtenció de les credencials per a l'API de Mastodon amb Mastodon.py, pas per pas

20220307 (2h)

Recull de codis comentats avui

Recull de pràctiques de 2n de DAM. Curs 2021-2022

Autenticació d'accés a NodeRED

Securing NodeRED

Generació de la contrasenya d'accés en mode hash des de la carpeta d'execució del NodeRED:

node node_modules/node-red/red.js admin hash-pw

En aquest exemple fem servir aquesta contrasenya en mode hash:

$2a$08$PbYFpiQSnoVaOfD1daCelU2Kvcg19KElO1DbVtE8GAJXacD6ABq

Edició de settings.js:

toni@vps-10d8edcd:~/bin/nodered$ nano ./node_modules/node-red/settings.js
   // Securing Node-RED
   // -----------------
   // To password protect the Node-RED editor and admin API, the following
   // property can be used. See http://nodered.org/docs/security.html for details.
   adminAuth: {
       type: "credentials",
       users: [{
           username: "toni",
           password: "$2a$08$PbYFpiQSnoVaOfD1daCelU2Kvcg19KElO1DbVtE8GAJXacD6ABq",
           permissions: "*"
       }]
   },

Un cop fets el canvis cal reiniciar el NodeRED.

Telegram

Bot de Telegram

  • Creació de bots amb BotFather
  • Instal·lació de nodes de Telegram a NodeRED (afegiu els nodes node-red-contrib-telegrambot)
  • Interacció amb un usuari de Telegram
  • Interacció amb un grup de Telegram

Material per a fer el bot i flux de prova per al bot de Telegram

Deures pel proper dia

Feu-vos membres d'aquesta instància de Mastodon: botsin.space

Feu-ho amb prou antelació, és possible que trigui més de tres hores a donar-vos accés.

20220304 Examen ordinària (4h)

1a Part - QML

m07uf1_qml_exOrd

2a Part - Qt

m07uf1_qt_exOrd

20220225 (4h)

Recull de codis comentats avui

Codificació i descodificació en base64 a les Qt

Exemple 01_json_01.zip al recull del dia d'avui. (Primer premeu el botó Llegiu i després el botó Escriu)

Codificació en base64

   qsText = "2n de DAM";
   ui->lbText->setText(qsText);
   ui->lbNum->setText(qsText.toUtf8().toBase64());

   qsText = "Escola del Clot";
   ui->letext->setText(qsText);
   ui->leNum->setText(qsText.toUtf8().toBase64());

Descodificació des de base64

   QByteArray qbaCodificat = qjoL["base64"].toString().toLatin1();

   QString qsDescodificat = QByteArray::fromBase64(qbaCodificat, QByteArray::Base64Encoding);

   qDebug() << "qjoL[\"base64\"].toString(): " << qjoL["base64"].toString()
            << " --> descodificat en base64 --> " << qsDescodificat;

Lectura del valors presents a un QByteArray

   QByteArray qba = "123";

   for(int i = 0; i < qba.length(); i++){
       char cC = qba.at(i);
       qDebug() << QString("0x%1").arg(uint8_t(cC), 0, 16);
       //qDebug() << QString("%1").arg(uint8_t(cC), 0, 10);
   }

Float a 4 bytes i 4 bytes a float en C

float2bytes2float.c

Float a 4 bytes i 4 bytes a float en Qt/C++

  • A l'arxiu .h:
union uFloat{
   float f;
   unsigned char uc[4];
};
  • A l'arxiu .cpp:
   union uFloat uFA,uFB;

   uFA.f = 3.24f;
   qDebug() << "*****************";
   for(int i = 0; i <4; i++){
       qDebug() << QString("0x%1").arg(uint8_t(uFA.uc[i]), 0, 16);
   }
   qDebug() << "*****************";
   //uFB.uc[0] = 0x29;
   uFB.uc[0] = 41;
   //uFB.uc[1] = 0x5c;
   uFB.uc[1] = 92;
   //uFB.uc[2] = 0x4f;
   uFB.uc[2] = 79;
   //uFB.uc[3] = 0x40;
   uFB.uc[3] = 64;
   qDebug() << QString("%1").arg(uFB.f);

   uFB.uc[0] = 215;
   uFB.uc[1] = 215;
   uFB.uc[2] = 171;
   uFB.uc[3] = 65;
   qDebug() << QString("%1").arg(uFB.f);

20220221 (2h)

Recull de codis comentats avui

20220218 (4h)

Recull de codis comentats avui

  • Codi IoT-02-22_ttn-otaa_dam_03_floats_BME280.zip que integra LoRaWAN i lectura del sensor BME280. (Desat al recull d'avui)

20220214 (2h)

Recull de codis comentats avui

  • Downlink LoRaWAN OTAA

Exemple de gestió de dos caràcters rebuts a la placa IoT-02: gestioCadenaRebudaESP32_00.c (al recull d'avui)

20220211 (4h)

Recull de codis comentats avui

  • Downlink LoRaWAN OTAA

20220207 (2h)

Recull de codis comentats avui

Tramesa de nombres reals emprant LoRa

Ajuda a l'exercici Lora-3 del Recull de pràctiques de 2n de DAM. Curs 2021-2022:

Missatges downlink LoRaWAN

Nous exercicis del Recull de pràctiques de 2n de DAM. Curs 2021-2022: Lora-4, Qt-9 i QML-8.

LoRaWAN ABP

Per a fer les pràctiques amb LoRa ABP haurem de desactivar el comptador de trames (cada cop que es reprograma la placa IoT-02 el comptador torna a zero. TTSv3 verifica que el comptatge de trames sigui correcta. Si no es desactiva el comptador de trames semblarà que no es rep la trama). Per a fer-ho, aneu al dispositiu, seleccioneu la pestanya General Settings, premeu el botó EXPAND a la secció Network layer, desplegueu l'enllaç Advanced MAC settings i seleccioneu Enabled a Resets frame counters. Al final deseu els canvis prement el botó Save changes.

Exemple de microprogramari emprant ABP

 // TTN uses SF9 for its RX2 window.
 LMIC.dn2Dr = DR_SF9;
 // Set data rate and transmit power for uplink (note: txpow seems to be ignored by the library)
 LMIC_setDrTxpow(DR_SF7, 14);

Nou exercici del Recull de pràctiques de 2n de DAM. Curs 2021-2022: Lora-5.

20220204 (4h)

Recull de codis comentats avui

Fem els exercicis Lora-2 i Lora-3 del Recull de pràctiques de 2n de DAM. Curs 2021-2022

20220131 (2h)

Al recull del 31 de gener de 2022 teniu un exemple de conversió bidireccional de float a cadena unsigned char fent servir union.

Acabem la pràctica 1 de LoRaWAN i comencem la 2 i la 3.

20220128 (4h)

LoRaWAN

LoRa 2021-2022

LoRaWAN OTAA

1r exercici de LoRa al Recull de pràctiques de 2n de DAM. Curs 2021-2022

LoRa 2020-2021

20220124 (2h)

Recull d'avui Captura del conjunt final de control

MqttBasic::~MqttBasic(){
   if (m_client->state() == QMqttClient::Connected)
       m_client->disconnectFromHost();
   delete ui;
}
void IndicadorLed::on_cbR_clicked(bool checked){
   vSetLabelColor(ui->lbR,(checked)?Qt::red:Qt::darkRed,Qt::darkRed);
   (*qjoJson)["ledR"] = (checked)?1:0;
   vActualitzaJson(*qjoJson);
}
void IndicadorLed::vActualitzaJson(QJsonObject qjsObj){
   QString strFromObj = QJsonDocument(qjsObj).toJson(QJsonDocument::Compact).toStdString().c_str();
   ui->etJson->setText(strFromObj);
   emit vTrametJsonLeds(strFromObj);
}

20220121 (Baixa professor) (2h)

Recull de codis pujats el 17 de gener. Avui s'han afegit un parell d'exercicis.

Dades JSON

Qt

How To Manipulate JSON With C++ and Qt

Exemple d'us del format JSON a les Qt: 01_json_00.zip del recull

NodeRed

json00.nodered.txt al recull

ESP32 / placa IoT-02

Biblioteca Arduino_JSON al recull

Codi d'exemple emprant JSON a la placa IoT-02: Codi de microprogramari IoT-02_mqtt_10_dam.zip al recull

Visualització de formes i colors a etiquetes QLabel

Visualització de led de color: 00_botonsToggle05.zip (Vídeo explicatiu del codi 00_botonsToggle05) i 00_botonsToggle06.zip (Vídeo explicatiu del codi 00_botonsToggle06)

Visualització d'un botó físic: 04_indicadorBotons00.zip del recull

Exercicis

Resoldre els exercicis Qt-3, Qt-4, Qt-5, Qt-6 i Qt-7

20220117 (2h)

Recull de codis comentats avui

Dades JSON

Qt

How To Manipulate JSON With C++ and Qt

Exemple d'us del format JSON a les Qt: 01_json_00.zip del recull

NodeRed

json00.nodered.txt al recull

ESP32 / placa IoT-02

Biblioteca Arduino_JSON al recull

Codi d'exemple emprant JSON a la placa IoT-02: Codi de microprogramari IoT-02_mqtt_10_dam.zip al recull

Visualització de formes i colors a etiquetes QLabel

Visualització de led de color: 00_botonsToggle05.zip (Vídeo explicatiu del codi 00_botonsToggle05) i 00_botonsToggle06.zip (Vídeo explicatiu del codi 00_botonsToggle06)

Visualització d'un botó físic: 04_indicadorBotons00.zip del recull

Exercicis

Resoldre els exercicis Qt-3, Qt-4 i Qt-5

20220114 (Baixa professor) (4h)

Al recull provisional de notes podeu consultar l'avaluació de les pràctiques que m'heu fet arribar. En cas de no estar al dia, feu l'esforç de posar-vos-hi avui (un cop finalitzeu les tasques encomanades per cada bloc de dues hores, que són prioritàries).

IoT (1r bloc)

Pugeu la pràctica a la carpeta compartida. Tant el document amb pdf com els codis comprimits en format .zip o .tar.gz (ni .rar ni .7z). Un cop ho trameteu, feu-me arribar un correu electrònic indicant que ja heu pujat la pràctica.

Per a fer aquesta pràctica, el professor posarà en marxa el punt d'accés que fem servir per a les pràctiques IoT. Altrament, podeu emprar com a punt d'accés un telèfon mòbil capaç de servir una xarxa sense fils de 2,4GHz (tot sovint, a Android es pot seleccionar la banda de punt d'accés: 2,4GHz o 5GHz). La connectivitat de l'ESP32 de la placa IoT-02 a la xarxa sense fils tan sols pot ser a 2,4GHz i no a 5GHz. Una eina Android que us pot ajudar és WiFiAnalyzer.

A la placa IoT-02 implementeu l'exercici Servint pàgina web per a canviar contrasenya (hi ha 4 apartats).

Qt / QML (2n bloc)

Pugeu la pràctica a la carpeta compartida. Tant el document amb pdf com els codis comprimits en format .zip o .tar.gz (ni .rar ni .7z). Un cop ho trameteu, feu-me arribar un correu electrònic indicant que ja heu pujat la pràctica.

A la carpeta d'exàmens antics del recull hi teniu material_20210225ex_M07UF1.zip amb material per a fer un examen del curs passat (en .pdf i en .odt per a que pugueu fer el vostre document. I arxius .zip que us ajudaran a resoldre-ho).

20220110 (Baixa professor) (2h)

IoT

Per a fer aquesta pràctica, podeu demanar al professor que posi en marxa el punt d'accés que fem servir per a les pràctiques IoT. Altrament, podeu emprar com a punt d'accés un telèfon mòbil capaç de servir una xarxa sense fils de 2,4GHz (tot sovint, a Android es pot seleccionar la banda de punt d'accés: 2,4GHz o 5GHz). La connectivitat de l'ESP32 de la placa IoT-02 a la xarxa sense fils tan sols pot ser a 2,4GHz i no a 5GHz. Una eina Android que us pot ajudar és WiFiAnalyzer.

A la placa IoT-02 implementeu l'exercici Servint pàgina web per a canviar contrasenya

20211217 (4h)

Recull de codis del dia d'avui usuari: dam / contrasenya: dam2122

  • 1a hora

- Hem plantejat l'exercici 5 del Recull de pràctiques de 2n de DAM. Curs 2021-2022

- Hem repassat codis introductoris de QML

- Seguim acabant el Recull de pràctiques de 2n de DAM. Curs 2021-2022

- Per a l'exercici Qt-2c del Recull de pràctiques de 2n de DAM. Curs 2021-2022 hem vist que per a maximitzar el giny en execució es pot posar al constructor:

showMaximized();

- Anul·lat l'exercici Qt-2d (degut que a les noves versions els ginys dels contenidors no són seleccionables)

  • 2a hora

- Seguim acabant el Recull de pràctiques de 2n de DAM. Curs 2021-2022

20211213 (2h)

Recull de codis del dia d'avui usuari: dam / contrasenya: dam2122

  • Fem revisió del contingut a les carpetes compartides.

20211210 (4h)

Recull de codis del dia d'avui usuari: dam / contrasenya: dam2122

Fem revisió del contingut a les carpetes compartides.

Anem acabant els exercicis pendents del Recull de pràctiques de 2n de DAM. Curs 2021-2022

20211203 (4h)

Recull de codis del dia d'avui usuari: dam / contrasenya: dam2122

IoT

Wokwi

Aneu a aquest projecte de wokwi i canvieu el codi sketch.ino pel que hi ha al recull de codis d'avui. Canvieu el text de ClientID per a que sigui únic.

Obriu minimMqttSnap.xml, que hi ha al recull de codis d'avui, a un Snap! sense SSL (recordeu activar les extensions per a JavaScript)

UserLAnd

Instal·leu-vos l'aplicació UserLAnd al vostre telèfon mòbil (present a Google Play i aviat a App Store). Si no teniu mòbil disponible, feu servir un emulador d'Android.

Connecteu el vostre mòbil, real o emulat, a la xarxa sense fils per a IoT i poseu en marxa l'aplicació. Un cop a dins, instal·leu-vos un Debian (80MB). Us demanarà un nom d'usuari i contrasenya. Feu una instal·lació que permeti veure al navegador del vostre ordinador un NodeRED executant-se des del mòbil.

Per a fer-ho:

sudo apt update
sudo apt upgrade
sudo apt install aptitude openssh-server net-tools curl software-properties-common wget unzip screen

A partir d'ara us podeu connectar remotament per SSH fent servir el port 2022 ( ssh usuari@ipMobil -p 2022 o ssh -o ServerAliveInterval=30 usuari@ipMobil -p 2022 per a que hi hagi persistència en la comunicació)

mkdir bin
cd bin
curl -sL https://deb.nodesource.com/setup_14.x | sudo bash -
sudo apt-get install -y nodejs
node -v
npm -v
mkdir nodered-ui
cd nodered-ui
wget --no-check-certificate https://www.binefa.cat/IoT/nodeRed/node_red_ui.zip
unzip node_red_ui.zip
screen
node node_modules/node-red/red.js --userDir node_modules/node-red/data --settings node_modules/node-red/settings.js -v --port 2222 --title elmeuTitol --safe flows_meuTitol.json

Premeu Ctrl A + D. I per a tornar a screen funcionant des del rerefons:

screen -r

Qt i QML

Seguim desenvolupant la pràctica 1 de Qt i l'exercici 4 de QML del Recull de pràctiques de 2n de DAM. Curs 2021-2022.

20211129 (2h)

Recull de codis del dia d'avui usuari: dam / contrasenya: dam2122

Qt

Seguim desenvolupant la pràctica 1 del Recull de pràctiques de 2n de DAM. Curs 2021-2022.

Connectant Qt i QML

Exercici 4 de QML del Recull de pràctiques de 2n de DAM. Curs 2021-2022.

A qmlLliscant_02.zip, traieu les cometes dobles de:

font.bold: "true"

per a deixar-ho així:

font.bold: true


  • Modificacions (arxiu 01_qmlLliscant_10.zip actualitzat al recull d'avui):

A Lliscant01Form.ui.qml:

Item {
   id: element
   width: 400
   height: 400
   property alias text1: text1
   property alias progressBar: progressBar

   ProgressBar {
       id: progressBar
       y: 189
       value: 0.5
       //maximumValue: 100
       anchors.right: parent.right
       anchors.rightMargin: 20
       anchors.left: parent.left
       anchors.leftMargin: 20
   }

A main.qml:

ApplicationWindow {
   visible: true
   width: 640
   height: 480
   title: qsTr("Exemple Lliscant")
   RereFons{
       id: rf

       onCmptChanged: {
           console.log(nCmpt);
           swipeView.actualitzaBarraDeProgres(nCmpt);
       }
   }
   SwipeView{
       id: swipeView
       anchors.fill: parent
       currentIndex: tabBar.currentIndex

       function actualitzaBarraDeProgres(n){
           l01.progressBar.value = n/100;
           l01.text1.text = n; // canvieu element1 per text1 a l'editor QML
       }

       Lliscant00Form{
           botoTramet.onClicked: {
               console.log(textInputTE.text)
               rf.szCadena = textInputTE.text;
           }
       }
       Lliscant01Form{
           id: l01
       }
   }

20211126 (4h)

Recull de codis del dia d'avui usuari: dam / contrasenya: dam2122

Qt

Seguim desenvolupant la pràctica 1 del Recull de pràctiques de 2n de DAM. Curs 2021-2022.

Connectant Qt i QML

Exercici 4 de QML del Recull de pràctiques de 2n de DAM. Curs 2021-2022.

20211122 (2h)

Recull de codis del dia d'avui usuari: dam / contrasenya: dam2122

Primer exercici de Qt al Recull de pràctiques de 2n de DAM. Curs 2021-2022.

Conceptes nous:

QLabel* pLabel = new QLabel;
pLabel->setStyleSheet("QLabel { background-color : red; color : blue; }");
  • Radio buttons (Han de ser agrupats en contenidors. Per exemple: Group Box o Frame)
  • QTimer (Temporitzador que quan es desborda emet un senyal timeout() i s'ha de connectar a una osca)

20211119 (4h)

OpenSSL Windows

MQTTS i Qt

Evolució de la classe GinyMqtt per a gestionar més còmodament el protocol TCP/IP MQTT. Analitzem contenidor_03.zip que permet la connexió MQTTS.

Provem aquest codi que funciona amb MQTTS emprant l'exemple HelloWorld_NoSSL.xml a Snap! (Recordeu activar javaScript extensions). Paràmetres a canviar:

Servidor (Broker): iot.electronics.cat:9001
Usuari: ecat
Contrasenya: clotClot
Tema de subscripció: /ledW
Tema de publicació: /provaDAM

Conceptes nous:

  • Certificats TLS (ca.crt)
  • Arxiu de recursos .qrc (ens permet introduir fitxers dins del projecte per a que hi siguin dins de l'executable, sense haver de llegir-los a una ruta externa. Molt convenient per a projectes emprant Android)

Recull de codis del dia d'avui usuari: dam / contrasenya: dam2122

QML

Qt Quick tutorial

A Book about Qt5

Introducció al QML. Curs 2021-2022

20211115 (2h)

Desenvolupament de la classe GinyMqtt per a gestionar més còmodament el protocol TCP/IP MQTT

Recull de codis del dia d'avui usuari: dam / contrasenya: dam2122

Introducció al QML. Curs 2021-2022

20211112 (4h)

Recull de codis del dia d'avui usuari: dam / contrasenya: dam2122

Control de la placa IoT-02 emprant QtMqtt

Amb l'exemple Simple MQTT Client Example provem la connectivitat amb el broker per defecte (amb usuari i contrasenya, que teniu a la màquina virtual) i la connectivitat amb el broker públic de test mosquitto (sense usuari mi contrasenya).

Cal modificar el codi del microprogramari de la placa IoT-02 per a que el broker de test broker.emqx.io d'EMQ X. Modifiqueu també el broker a l'exemple Simple MQTT Client Example i feu subscripcions al vostre botó i35 de la placa IoT-02.

const char* mqtt_server = "broker.emqx.io";
const int mqtt_port = 1883; 
const char* mqtt_user = "";
const char* mqtt_password = "";

Proveu-lo també a aquest codi amb sòcols web MQTT d'Snap!

Amb l'exemple Quick MQTT Example provem també la connectivitat amb un broker públic de test (sense usuari mi contrasenya). Teniu els codis quicksubscription i quickpublication al recull de codis del dia d'avui usuari: dam / contrasenya: dam2122

Introducció al QML

Introducció al QML. Curs 2021-2022

Accés al llibre de Qt/QML en línia

Execució de codis QML des del terminal:

/home/jordi/Qt/5.15.2/gcc_64/bin/qmlscene showcase.qml

Instal·lació de la bibloteca QtMqtt a Linux

cd Qt/6.1.3/gcc_64/lib
git clone git://code.qt.io/qt/qtmqtt.git
cd qtmqtt/
git checkout 6.1
rm -r examples/

Mitjançant el Qt Creator obriu el projecte /home/jordi/Qt/6.1.3/gcc_64/lib/qtmqtt/qtmqtt.pro. Aneu al menú i seleccioneu Build / Run qmake

make
sudo make install

20211108 (2h)

Recull de codis del dia d'avui usuari: dam / contrasenya: dam2122

Barra d'estat

Al recull del dia d'avui hi ha el codi principal_03.zip que incorpora la gestió de la barra d'estat d'un QMainWindow

Ús de les màquines virtuals

Posem en marxa la màquina virtual amb Debian 11:

  • Posem en marxa el projecte d'exemple MQTT simpleClient
  • Executem sobre Android un projecte Qt

20211105 (4h)

Al disc dur que us passaré hi ha dues màquines virtuals (andro_8.1-r4-VM-32bit.7z de 543,8 MB i IoT - eCat - Debian 11.x 64-bit_v20210304_00.zip de 23,7 GB) al directori maquinesVirtuals/Android_i_Qt

Màquina virtual amb emulador per a Android

Emulador d'Android a una màquina virtual

Aneu amb cura, malgrat és obsolet quelcom es pot fer servir en part: Using VMWare to replace the slow Android Emulator

És important que aquesta màquina virtual estigui configurada amb:

  • Connexió pont (bridge i no NAT)
  • Memòria mínima de 2GB

Màquina virtual amb Debian 11, Android Studio i Qt6 per a escriptori i Android

Adreça de descàrrega de la màquina virtual amb Debian 11, Android Studio i Qt6 per a escriptori i Android

Avui us passaré, comprimida a 19GB, una màquina virtual basada en Debian 11 (a hores d'ara, Debian 11 és en fase de testing) amb els següents programes ja instal·lats i preparats per a funcionar:

  • Android Studio
  • QtCreator amb la darrera Qt5 LTS i les Qt6
  • Biblioteca qtMqtt preparada per a funcionar a l'escriptori i a Android amb les Qt6

Configuració de la màquina virtual:

  • L'usuari per defecte és ecat (eCat)
  • La contrasenya de l'usuari ecat és clotfje (ecat és membre del grup d'usuaris sudo i dialout). Almenys a l'hora de passar-vos la màquina virtual. És aconsellable que canvieu la vostra contrasenya d'accés.
  • És aconsellable tenir la connexió de xarxa en connexió pont (bridge). Però no cal per a connectar-ho amb l'emulador d'Android amb màquina virtual. Sí que caldria per a tenir accés extern al broker MQTT i al NodeRED (no instal·lats en aquesta primera versió).
  • Memòria mínima de 4GB

Connectant les dues màquines virtuals

  • Trobeu quina IP té la màquina virtual amb l'emulador d'Android (a l'explicació faré servir com a IP de l'emulador 172.20.xy.xyz).
  • Obriu un terminal a la màquina virtual amb Debian 11:
ecat@iot-ecat:~$ cd Android/Sdk/platform-tools/
ecat@iot-ecat:~/Android/Sdk/platform-tools$ ./adb connect 172.20.xy.xyz:5555
* daemon not running; starting now at tcp:5037
* daemon started successfully
connected to 172.20.25.152:5555
ecat@iot-ecat:~/Android/Sdk/platform-tools$ ./adb shell
x86:/ $
  • Obriu el Qt Creator (premeu la supertecla -aquella amb el símbol d'una finestra propietària- i escriviu-hi Qt). Feu un exemple simple de QML (per exemple el del swipe). Seleccioneu les Qt6 per a escriptori i Android x86 (amb l'opció Release i sense Debug ni Profile). Aneu a Tools / Options / Devices i verifiqueu que no hi dóna cap error de configuració (és possible que al principi surtin marques vermelles, però al cap de pocs segons se'n van). Assegureu-vos que compilareu per Android i feu Play al projecte de les Qt. Seleccioneu el dispositiu compatible VMware Virtual Platform. I premeu al botó OK.
  • Al cap de pocs segons hi apareix el programa bàsic swipe a l'emulador sobre màquina virtual. El podeu aturar prement el botó quadrat vermell d'Application Output.

qtMqtt

qtMqtt oficial

Feu un git clone i especifiqueu la versió amb un git checkout 6.0. Després:

cd qmqtt
mkdir build
cd build
qmake -r ..
make
sudo make install

Instal·lació a Windows

- Si no teniu el llenguatge perl instal·lat, instal·leu perl

- Obriu el CMD amb les variables d'entorn de les Qt6

git clone git://code.qt.io/qt/qtmqtt.git
cd qmqtt
git checkout 6.1
mkdir build
cd build
qmake -r ..
mingw32-make
mingw32-make install

Instal·lació de QtMqtt per Android

Malgrat que ja us funcioni la biblioteca QtMqtt en programes d'escriptori, heu de fer la compilació de la biblioteca QtMqtt per a la versió de Qt/QML que feu servir per a poder executar programes que duguin aquesta biblioteca a Android.

Hi ha diversos suggeriments de com fer-ho. Després de diversos intents, aquest és el sistema que a mi m'ha funcionat:

Cerqueu el directori lib de la vostra distribució Qt per a Android x86:

jordi@ecat-XPS13:~$ /home/jordi/Qt/6.0.0/android_x86/bin/qmake -query QT_INSTALL_LIBS
/home/jordi/Qt/6.0.0/android_x86/lib

o, per al dispositiu físic Android amb tecnologia Android ARM:

ecat@iot-ecat:~$ /home/ecat/Qt/6.0.0/android_armv7/bin/qmake -query QT_INSTALL_LIBS
/home/ecat/Qt/6.0.0/android_armv7/lib

Aneu a la carpeta que ens retorna l'ordre anterior (Android x86):

jordi@ecat-XPS13:~$ cd /home/jordi/Qt/6.0.0/android_x86/lib

o, per al dispositiu físic Android amb tecnologia Android ARM:

ecat@iot-ecat:~$ cd /home/ecat/Qt/6.0.0/android_armv7/lib

I feu el procés d'instal·lació (Android x86):

jordi@ecat-XPS13:~/Qt/6.0.0/android_x86/lib$ git clone git://code.qt.io/qt/qtmqtt.git
jordi@ecat-XPS13:~/Qt/6.0.0/android_x86/lib$ cd qtmqtt/
jordi@ecat-XPS13:~/Qt/6.0.0/android_x86/lib/qtmqtt$ git checkout 6.0
jordi@ecat-XPS13:~/Qt/6.0.0/android_x86/lib/qtmqtt$ rm -r examples/

o, per al dispositiu físic Android amb tecnologia Android ARM:

ecat@iot-ecat:~/Qt/6.0.0/android_armv7/lib$ git clone git://code.qt.io/qt/qtmqtt.git
ecat@iot-ecat:~/Qt/6.0.0/android_armv7/lib$ cd qtmqtt/
ecat@iot-ecat:~/Qt/6.0.0/android_armv7/lib/qtmqtt$ git checkout 6.0
ecat@iot-ecat:~/Qt/6.0.0/android_armv7/lib/qtmqtt$ rm -r examples/

Per a Android x86, mitjançant el Qt Creator obriu el projecte /home/jordi/Qt/6.0.0/android_x86/lib/qtmqtt/qtmqtt.pro. Aneu al menú i seleccioneu Build / Run qmake

Per a Android ARM, mitjançant el Qt Creator obriu el projecte /home/ecat/Qt/6.0.0/android_armv7/lib/qtmqtt/qtmqtt.pro. Aneu al menú i seleccioneu Build / Run qmake

Torneu al terminal d'abans i feu (Android x86):

jordi@ecat-XPS13:~/Qt/6.0.0/android_x86/lib/qtmqtt$ make
jordi@ecat-XPS13:~/Qt/6.0.0/android_x86/lib/qtmqtt$ sudo make install

o, per al dispositiu físic Android amb tecnologia Android ARM:

ecat@iot-ecat:~/Qt/6.0.0/android_armv7/lib/qtmqtt$ make
ecat@iot-ecat:~/Qt/6.0.0/android_armv7/lib/qtmqtt$ sudo make install

Copieu, fora de la ruta de les Qt, els projectes d'exemple quickpublication i quicksubscription. Obriu els dos projectes per a que puguin ser executats des de l'escriptori i des del mòbil (emulat o no). Per a verificar llur funcionament, podeu executar un projecte al dispositiu mòbil i l'altre a l'escriptori.

20211029 (4h)

Recull de pràctiques de 2n de DAM. Curs 2021-2022

1a) Feu un nou programa anomenat ginyCompost02, a partir de l'anterior codi. Heu de posar un nou giny de botons a la dreta del giny de text. Quedaran tres ginys: Botons - Text - Botons.

1b) Feu que ginyCompost02 tingui també connectades els senyals i les osques del nou giny.

20211025 (2h)

Recull de pràctiques de 2n de DAM. Curs 2021-2022

Pràctica amb MQTT (sense la S d'MQTTS). Heu de fer servir el port TCP 1883 i amb sócols web el port 9001 ( formacio.things.cat ) amb usuari ecat i contrasenya clotClot.

Codi en python per a truaduir el text d'un certificat a codi encastable a l'IDE d'Arduino

MQTT-Dash. Control del relé de enclavamiento y lectura de la LDR

  • Pràctica amb MQTTS:

- Microprogramari amb MQTTS a la placa IoT-02

- Connexió mitjançant sòcols web (9001) a un Snap! sense SSL. I vam provar mqttSnap.xml.

- Connexió mitjançant NodeRED. Encenem i apaguem un led. Grafiquem el nivell de llum mitjançant el sensor LDR.

- Aplicació d'Android MQTT Dash

  • Pràctica amb MQTT:

Ha de ser el mateix que la pràctica anterior fent servir MQTT en comptes d'MQTTS.

20211021 (4h)

Recull de pràctiques de 2n de DAM. Curs 2021-2022

Al codi mqttSnap.xml heu d'afegir una cancel·lació de subscripció un cop rebeu la vostra MAC.

Recull de codis del dia d'avui usuari: dam / contrasenya: dam2122

IoT

Introducció als protocols TCP MQTT i MQTTS.

¿Qué es MQTT? Su importancia como protocolo IoT

Més informació sobre MQTT i MQTTS

Adreces comentades a classe

El broker gratuït més famós

Ports emprats per mosquitto

mqtt4snap Fet per en Xavier Pi

Broker MQTT que permet fer balanceig de servei de franc

Exemple Hola món amb Snap! amb SSL Cal activar a la rodeta d'engranatge l'opció JavaScript extensions

Snap! sense certificat SSL Cal activar a la rodeta d'engranatge l'opció JavaScript extensions

20211018 (2h)

Recull de pràctiques de 2n de DAM. Curs 2021-2022

Pseudoservidor UDP

Pseudoservidor UDP emprant Qt5 (1/2)

Pseudoservidor UDP emprant Qt5 (2/2)

20211015 (4h)

  • UDP
    • Al NodeRED
    • NodeRED + Placa IoT-02

Avui hem aconseguit controlar des del mòbil (tauler de control del NodeRED amb dos botons) l'estat del led blanc de la placa IoT-02.

IoT

Introducció al protocol UDP.

UDP: Què és el protocol UDP?

Microprogramari que implementa el protocol UDP per a la placa IoT-02.

unsigned int udpPortRx = 3334;
unsigned int udpPortTx = 3333;


04_wifiUdp

Codi per a importar al NodeRED fent servir el protocolo UDP. El port de recepció de l'ordinador (3333) ha de ser el de transmissió a la placa, i el de recepció a la placa (3334) ha de ser el de transmissió de l'ordinador.

Port Rx = 3333
Port Tx = 3334

Qt

  • Concepte senyal / osca (signal / slot)

Recull de codis del dia d'avui usuari: dam / contrasenya: dam2122

20211011 (2h)

Recull de codis del dia d'avui usuari: dam / contrasenya: dam2122

Qt

Seguim amb la introducció a les Qt.

Exercici 02_mesMenys

Desenvolupeu una aplicació gràfica d'usuari, anomenada 02_mesMenys amb la classe GinyMesMenys filla de QWidget, amb tres ginys encastats:

  • Botó botoMes amb el signe +. Incrementa el valor de l'atribut privat nN
  • Botó botoMenys amb el signe -. Decrementa el valor de l'atribut privat nN
  • Etiqueta etNum que presenta el valor de l'atribut privat nN
GinyMesMenys

20211008 (4h)

Recull de codis del dia d'avui usuari: dam / contrasenya: dam2122

Introducció a les Qt

20211004 (2h)

Prova amb les plaques IoT-02

JESUITES_FP - educanet01

20211001 (4h)

Teleconferència pel dia d'avui

Biblioteques Arduino per a la placa IoT-02 (493M)

Codis i disseny electrònic de la placa IoT-02 a Github o git clone https://github.com/jordibinefa/IoT-02.git

Repartiment de Placa IoT-02. De moment, i fins que no es digui el contari, les tornareu el mateix dia.

Heu de dur a classe una font d'alimentació microUSB, o un cable de connexió microUSB per connectar a l'ordinador. Tingueu en compte que us caldrà una altra boca per a connectar el cable miniUSB que us serà subministrat per a programar la placa IoT-02.

20210927 (2h)

Teleconferència pel dia d'avui

Distribució de M07UF1, M09UF2, M09UF3, M15UF1 i M13 al curs 2021-2022 de 2n de DAM

Recull del dia 20210927 usuari: dam | contrasenya: dam2122

Qt

El Qt Creator serà l'IDE que farem servir per a desenvolupar el disseny d'aplicacions gràfiques d'usuari:

Aneu a la pàgina Qt for Open Source Development i cerqueu Download the Qt Online Installer. Baixeu-vos-ho i instal·leu-ho (us demana registrar-vos per a poder-ho instal·lar).

IoT

Placa IoT-02

Instal·lació de Node.js Guia d'instal·lació de node i npm

Verificació:

node --version
npm --version

Instal·lació i funcionament del NodeRed autònom

ecat@iot-ecat:~$ mkdir bin
ecat@iot-ecat:~$ cd bin
ecat@iot-ecat:~/bin$ sudo apt install unzip
ecat@iot-ecat:~/bin$ mkdir nodered-ui
ecat@iot-ecat:~/bin$ cd nodered-ui
ecat@iot-ecat:~/bin/nodered-ui$ wget https://www.binefa.cat/IoT/nodeRed/node_red_ui.zip
ecat@iot-ecat:~/bin/nodered-ui$ unzip node_red_ui.zip
ecat@iot-ecat:~/bin/nodered-ui$ node node_modules/node-red/red.js --userDir node_modules/node-red/data --settings node_modules/node-red/settings.js -v --port 2222 --title elmeuTitol --safe flows_meuTitol.json

Si hi ha problemes de confiança amb el certificat al descarrega l'arxiu .zip, hi podeu afegir l'opció --no-check-certificate:

wget --no-check-certificate https://www.binefa.cat/IoT/nodeRed/node_red_ui.zip

Repositori de codis fet a classe durant el curs

Codis fets a les classes de 2n de DAM usuari: dam | contrasenya: dam2122

Documentació

Distribució de M07UF1, M09UF2, M09UF3, M15UF1 i M13 al curs 2021-2022 de 2n de DAM

Recull de pràctiques de 2n de DAM. Curs 2021-2022

Qt/QML

Activació de l'editor QML al QtCreator 6

Qt5 de Jan Bodnar

Vídeos QML

Qt5 Cadaques! A Book about Qt5

Qt Quick tutorial de Jan Bodnar

PyQt5 de Jan Bodnar

Qt for WebAssembly

Qt for WebAssembly

json

How To Manipulate JSON With C++ and Qt

QProcess

QProcess example

Qt5 tutorial FFmpeg converter using QProcess - 2020

IoT

Introducció al Node-RED

TCP/UDP Capa de transport d'Ethernet

Introducció a MQTT

Afegint la targeta ESP8266 a l'IDE d'Arduino (NodeMCU1.0)

Micropython and the Internet of Things

SCADA fent servir Python QML i Arduino

MQTT avec Qt

LoRaWAN

LoRa 2021-2022

Consola de The Things Stack (Community Edition) de The Things Network

Presentació LoRaWAN (esborrany v0.4)

Ús pràctic de LoRaWAN TTNv2

Recull introductori per a treballar amb LoRa ( usuari: dam / contrasenya: dam2122)

Recull de pràctiques de 2n de DAM. Curs 2021-2022

Transmissió d'un número real de tipus IEEE-754 (4 bytes) i llur recuperació a NodeRED

Downlink LoRaWAN fent servir TTSv3