DAM 2021-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
- 1 Algunes classes
- 1.1 20220610 Examen M07UF1 d'avaluació extraordinària
- 1.2 20220523 Presentació del projecte Final
- 1.3 20220520 Projecte Final
- 1.4 20220516 Projecte Final
- 1.5 20220513 Projecte Final
- 1.6 20220509 Projecte Final
- 1.7 20220506 Projecte Final
- 1.8 20220502 Projecte Final
- 1.9 20220425 Projecte Final
- 1.10 20220422 Examen ordinària M09UF2, M09UF3 i M15UF1 (4h)
- 1.11 20220408 (4h)
- 1.12 20220404 (2h)
- 1.13 20220401 (4h)
- 1.14 20220328 (2h)
- 1.15 20220325 (4h)
- 1.16 20220321 (2h)
- 1.17 20220318 (4h)
- 1.18 20220314 (2h)
- 1.19 20220311 (4h)
- 1.20 20220307 (2h)
- 1.21 20220304 Examen ordinària (4h)
- 1.22 20220225 (4h)
- 1.23 20220221 (2h)
- 1.24 20220218 (4h)
- 1.25 20220214 (2h)
- 1.26 20220211 (4h)
- 1.27 20220207 (2h)
- 1.28 20220204 (4h)
- 1.29 20220131 (2h)
- 1.30 20220128 (4h)
- 1.31 20220124 (2h)
- 1.32 20220121 (Baixa professor) (2h)
- 1.33 20220117 (2h)
- 1.34 20220114 (Baixa professor) (4h)
- 1.35 20220110 (Baixa professor) (2h)
- 1.36 20211217 (4h)
- 1.37 20211213 (2h)
- 1.38 20211210 (4h)
- 1.39 20211203 (4h)
- 1.40 20211129 (2h)
- 1.41 20211126 (4h)
- 1.42 20211122 (2h)
- 1.43 20211119 (4h)
- 1.44 20211115 (2h)
- 1.45 20211112 (4h)
- 1.46 20211108 (2h)
- 1.47 20211105 (4h)
- 1.48 20211029 (4h)
- 1.49 20211025 (2h)
- 1.50 20211021 (4h)
- 1.51 20211018 (2h)
- 1.52 20211015 (4h)
- 1.53 20211011 (2h)
- 1.54 20211008 (4h)
- 1.55 20211004 (2h)
- 1.56 20211001 (4h)
- 1.57 20210927 (2h)
- 2 Repositori de codis fet a classe durant el curs
- 3 Documentació
Algunes classes
Teleconferència provisional per a compartir pantalla i confinats
20220610 Examen M07UF1 d'avaluació extraordinària
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
- Seguim fent el Recull de pràctiques de 2n de DAM. Curs 2021-2022
20220404 (2h)
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 codificador / descodificador IEEE 754 en línia
20220401 (4h)
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
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
- 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)
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
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
- 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)
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 màquina virtual Linux
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!
- En cas de no tenir-ho instal·lat, feu aquesta actrualització de l'aplicació web de visualització de dades a la Actualització de la màquina virtual.
- 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
- Ús de les dades d'InfluxDB a 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
- 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 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
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
- 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
2a Part - Qt
20220225 (4h)
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 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
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
- Seguim fent els exercicis del Recull de pràctiques de 2n de DAM. Curs 2021-2022
20220218 (4h)
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)
Recull de codis comentats avui
- Downlink LoRaWAN OTAA
- 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)
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
- Downlink LoRaWAN OTAA
- Seguim fent els exercicis del Recull de pràctiques de 2n de DAM. Curs 2021-2022
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
LoRaWAN OTAA
1r exercici de LoRa al Recull de pràctiques de 2n de DAM. Curs 2021-2022
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
- 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)
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)
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
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
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
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
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.
Microprogramari que implementa el protocol UDP per a la placa IoT-02.
unsigned int udpPortRx = 3334; unsigned int udpPortTx = 3333;
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
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
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
Qt5 Cadaques! A Book about Qt5
Qt Quick tutorial de Jan Bodnar
PyQt5 de Jan Bodnar
Qt for WebAssembly
json
How To Manipulate JSON With C++ and Qt
QProcess
Qt5 tutorial FFmpeg converter using QProcess - 2020
IoT
TCP/UDP Capa de transport d'Ethernet
Afegint la targeta ESP8266 a l'IDE d'Arduino (NodeMCU1.0)
Micropython and the Internet of Things
SCADA fent servir Python QML i Arduino
LoRaWAN
Consola de The Things Stack (Community Edition) de The Things Network
Presentació LoRaWAN (esborrany v0.4)
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