Recull de pràctiques de 2n de DAM. Curs 2023-2024

De binefa.com
Salta a la navegació Salta a la cerca

Contingut

M07UF1[modifica]

M00[modifica]

M00.1[modifica]

Proveu el putty amb la placa vermell de la placa IoT-02. En Linux és gtkterm, instal·lable amb l'apt.

M00.2[modifica]

Instal·leu la biblioteca QSerialPort per a fer-la servir al vostre entorn de programació en Qt. Proveu el codi terminal sèrie. Feu servir la placa vermella de la placa IoT-02.

M01[modifica]

M01.1[modifica]

Feu un microprogramari a la placa IoT-02 per a que tregui dos senyals pel port sèrie, una quadrada i una de triangular. L'heu de poder visualitzar al Serial Plotter de l'IDE d'Arduino.

M01.2[modifica]

Feu un programa en Python capaç de llegir els valors tramesos per la placa IoT-02 pel port sèrie. (Codi en Python que fa servir el port sèrie)

M01.3[modifica]

Feu un programa emprant la classe QSerialPort capaç de llegir els valors tramesos per la placa IoT-02 pel port sèrie. (Exemple de QSerialPort)

M02[modifica]

Proveu el codi mb_IoT_00.py present al GitHub connectant la placa IoT-02 mitjançant el ModBus RTU. Expliqueu llur funcionament.

M03[modifica]

Desenvolupeu un codi per a la placa IoT-02 per a que faci de mestre (master) ModBus RTU. Feu servir d'esclau el codi mb_IoT_slave_00.py present al GitHub. Heu de presentar la temperatura llegida des de l'ordinador a la pantalla OLED de la placa IoT-02.

M04[modifica]

M04.1[modifica]

Basant-vos en M01.2 i M01.3 desenvolupeu una aplicació GUI feta en Qt. Ha de tenir dos botons: Set i Reset. Aquests dos botons han de controlar l'estat del relé de la placa mitjançant el protocol ModBus RTU. (Exemple per a calcular el CRC del ModBus)

M04.2[modifica]

Basant-vos en M04.1 desenvolupeu una aplicació GUI feta en Qt. Ha de tenir tres botons: Set, Reset i Temperatura. Els primers dos botons han de controlar l'estat del relé de la placa mitjançant el protocol ModBus RTU. El tercer botó ha de preguntar la temperatura a la placa i l'heu de mostrar a una etiqueta.

M04.3[modifica]

Acabeu d'implementar totes les funcions ModBus RTU del codi en Python mb_IoT_00.py a una GUI en Qt.

M05[modifica]

M05.1[modifica]

Basant-vos en M01.2 i M01.3 desenvolupeu una aplicació GUI feta en QML. Ha de tenir dos botons: Set i Reset. Aquests dos botons han de controlar l'estat del relé de la placa mitjançant el protocol ModBus RTU. (Exemple per a calcular el CRC del ModBus)

M05.2[modifica]

Basant-vos en M05.1 desenvolupeu una aplicació GUI feta en QML. Ha de tenir tres botons: Set, Reset i Temperatura. Els primers dos botons han de controlar l'estat del relé de la placa mitjançant el protocol ModBus RTU. El tercer botó ha de preguntar la temperatura a la placa i l'heu de mostrar a una etiqueta.

M05.3[modifica]

Acabeu d'implementar totes les funcions ModBus RTU del codi en Python mb_IoT_00.py a una GUI en QML.

Cronograma i carpetes compartides[modifica]

caption

Carpetes compartides de 2n de DAM. Curs 2023-2024

Activitats[modifica]

A00 - Creació de grups[modifica]

Dins de la carpeta compartida feu una subcarpeta amb el nom activitats. I a dins de la subcarpeta A00. Deseu a la subcarpeta A00 l'activitat feta amb el professor transversal en format .odt i .pdf

A03 - Què sabem?[modifica]

Dins de la carpeta compartida feu una subcarpeta amb el nom activitats. I a dins de la subcarpeta A03. Deseu a la subcarpeta A03 l'activitat feta amb el professor transversal en format .odt i .pdf

A05 - Identificació dels rols[modifica]

Feu la subcarpeta A05 dins de la subcarpeta activitats de la carpeta compartida. Deseu a la subcarpeta A05 l'activitat feta amb el professor transversal en format .odt i .pdf

A06 - POO en C++ i Qt[modifica]

A06.01 - Ginys encastats[modifica]

  • a0601a. Feu una interfície gràfica (GUI) amb dos botons (+ i -) i una etiqueta numèrica.
  • a0601b. Feu una interfície gràfica (GUI) amb una barra lliscant (slider) i un giny LCD de dos números. La barra lliscant controla l'LCD.
  • a0601c. Feu una interfície gràfica (GUI) que integri els dos projectes anteriors. La botonera també controla la barra lliscant i l'LCD. La barra lliscant també controla el valor de l'etiqueta numèrica.

Exercici A06.01. (Heu de desar a la carpeta A06 un document 2324-DAM-A06.01-1rCognom2nCognomNom.pdf amb les solucions explicades i un arxiu 2324-DAM-A06.01-1rCognom2nCognomNom.zip amb els codis comprimits, sense el .pro.user).

A06.02 - Interfícies gràfiques[modifica]

Enunciat A06.02

Exercici A06.02. (Heu de desar a la carpeta A06 un document 2324-DAM-A06.02-1rCognom2nCognomNom.pdf amb les solucions explicades i un arxiu 2324-DAM-A06.02-1rCognom2nCognomNom.zip amb els codis comprimits, sense el .pro.user).

A06.03 - Instal·lació de QtMQtt a les Qt[modifica]

Instal·lació de QtMQtt a les Qt

Exercici A06.03. (Heu de desar a la carpeta A06 un document 2324-DAM-A06.03-1rCognom2nCognomNom.pdf ).

A06.04 - Interfícies gràfiques[modifica]

Enunciat A06.04

Exercici A06.04. (Heu de desar a la carpeta A06 un document 2324-DAM-A06.04-1rCognom2nCognomNom.pdf amb les solucions explicades i un arxiu 2324-DAM-A06.04-1rCognom2nCognomNom.zip amb els codis comprimits, sense el .pro.user).

A06.05 - Prova de QtMQtt a la placa IoT-02[modifica]

Un cop heu fet la Instal·lació de QtMQtt a les Qt proveu el funcionament de simplecient amb usuari i contrasenya. Provem llur funcionament interactuant bidireccionalment amb la placa IoT-02. Heu de subscriure-vos a un tema d'un botó i publicar 1 i 0 a un tema d'un led.

Exercici A06.05. (Heu de desar a la carpeta A06 un document 2324-DAM-A06.05-1rCognom2nCognomNom.pdf amb les solucions explicades i un arxiu 2324-DAM-A06.05-1rCognom2nCognomNom.zip amb els codis comprimits, sense el .pro.user).

A07 - Introducció a la placa IoT-02, Wokwi i protocols de comunicació[modifica]

A07.01 - Introducció al control de la placa Iot-02 mitjançant NodeRed[modifica]

Exercici A07.01 (Heu de desar a la carpeta A07 un document 2324-DAM-A07.01-1rCognom2nCognomNom.pdf amb l'explicació del procés de resolució de la pràctica, incloent-hi captures de pantalla i fotografies.

A07.01.1[modifica]

Feu un codi emprant el panell de control (Dashboard) de NodeRed que surtin quatre interruptors que controlin els quatre leds de la placa IoT-02, mitjançant comunicació MQTT.

A07.01.2[modifica]

Feu un codi emprant el panell de control (Dashboard) de NodeRed que mostri l'estat dels tres botons de la placa IoT-02, mitjançant comunicació MQTT.

A07.01.3[modifica]

Agrupeu a una sola pestanya A07.01.1 i A07.01.2.

A07.02 - Punt multicolor al NodeRED i variables de flux[modifica]

Feu una visualització d'un punt que representa un led multicolor. A la placa IoT-02:

  • Quan el botó IO0 sigui premut incorpora el color vermell al punt multicolor representat al panell de control del NodeRED
  • Quan el botó IO0 no sigui premut traieu el color vermell al punt multicolor representat al panell de control del NodeRED
  • Quan el botó I34 sigui premut incorpora el color verd al punt multicolor representat al panell de control del NodeRED
  • Quan el botó I34 no sigui premut traieu el color verd al punt multicolor representat al panell de control del NodeRED
  • Quan el botó I35 sigui premut incorpora el color blau al punt multicolor representat al panell de control del NodeRED
  • Quan el botó I35 no sigui premut traieu el color blau al punt multicolor representat al panell de control del NodeRED

A07.03 - Visualització amb un giny rellotge del nivell de llum[modifica]

Feu una visualització d'un giny rellotge que indiqui el nivell de llum a la LDR de la placa IoT-02.

A07.04 - Ús d'MQTT (no MQTTS)[modifica]

Feu una visualització d'un giny rellotge que indiqui el nivell de llum a la LDR de la placa IoT-02, emprant MQTT (no MQTTS)

A07.05 - Instal·lació del servei mosquitto[modifica]

How to Install The Mosquitto MQTT Broker on Windows

Mosquitto Username and Password Authentication -Configuration and Testing

A07.06 - Ús del servei mosquitto[modifica]

Feu una visualització d'un punt que representa un led multicolor. Feu servir un broker MQTT (no MQTTS):

  • Quan el botó IO0 sigui premut incorpora el color vermell al punt multicolor representat al panell de control del NodeRED
  • Quan el botó IO0 no sigui premut traieu el color vermell al punt multicolor representat al panell de control del NodeRED
  • Quan el botó I34 sigui premut incorpora el color verd al punt multicolor representat al panell de control del NodeRED
  • Quan el botó I34 no sigui premut traieu el color verd al punt multicolor representat al panell de control del NodeRED
  • Quan el botó I35 sigui premut incorpora el color blau al punt multicolor representat al panell de control del NodeRED
  • Quan el botó I35 no sigui premut traieu el color blau al punt multicolor representat al panell de control del NodeRED
  • Afegiu quatre selectors (switch) o vuit botons per a apagar i encendre cadascun dels quatre leds de la placa IoT-02

A07.07 - Introducció al micropython[modifica]

Heu de desar a la carpeta A07 un document 2324-DAM-A07.07-1rCognom2nCognomNom.pdf

  • L'explicació del procés de la instal·lació de microPython a la placa IoT-02
  • Feu servir ampy
  • Feu servir Thonny.
adc_pin = Pin(36, mode=Pin.IN) # adc_pin diu el canal ADC corresponent al pin 
adc = ADC(adc_pin) # adc_pin no és el número de pota, és el número d'ADC

A07.08 - Prova de QtMQtt a la placa IoT-02[modifica]

Un cop heu fet la Instal·lació de QtMQtt a les Qt proveu el funcionament de simplecient amb usuari i contrasenya. Provem llur funcionament interactuant bidireccionalment amb la placa IoT-02. Heu de subscriure-vos a un tema d'un botó i publicar 1 i 0 a un tema d'un led.

Exercici A07.08. (Heu de desar a la carpeta A07 un document 2324-DAM-A07.08-1rCognom2nCognomNom.pdf amb les solucions explicades i un arxiu 2324-DAM-A07.08-1rCognom2nCognomNom.zip amb els codis comprimits, sense el .pro.user).


A08 - QML, connexió a rerefons Qt i PureQML[modifica]

A08.00[modifica]

Feu un document explicant com fer un projecte emprant PureQML i llur migració a QML.

A08.01[modifica]

Feu un programa en QML que al principi hi surti un quadrat vermell centrat. Al prémer la tecla B hi sortirà de color blau, al prémer la tecla G hi sortirà de color verd i al prémer la tecla R torna a ser vermell.

A08.02[modifica]

Feu un programa en QML a on hi aparegui centrat, horitzontalment i vertical, ben gros i en negreta el nom Escola del Clot. Al prémer la tecla + la lletra es farà més grossa. I al prémer la tecla - la lletra es farà més petita.

A08.03[modifica]

Feu un programa que hi surti el text, centrat a la finestra, "Comptador: 0" de color vermell. Al prémer el botó + incrementarà el valor del comptador, i al prémer el botó '-' es decrementarà. Al prémer la tecla N el text serà de color negre i al prémer V tornarà a ser de color vermell.

A08.04[modifica]

Seguiu els Vídeos QML de l'apartat Connexió entre el frontal QML (frontend) i el rerefons en C++ (backend). Feu el vostre qmlLliscant que comunica el rerefons en C++ amb el frontal QML de forma bidireccional. Feu a08.04.pdf amb la captura de pantalla del vostre projecte funcionant. Heu d'explicar el funcionament de la comunicació bidireccional i definir que són les Q_PROPERTY. El vostre codi serà dins d'a08.04.zip.

Per afegir QMLDesigner a l'entorn del QtCreator: Aneu al menú Help / About pluggins / Seleccioneu QMLDesigner

Per afegir un nou formulari: nomForm.ui.qml

A08.05[modifica]

A partir del codi pingPong02, desenvolupeu el projecte a08_05 per a que mitjançant MQTT es pugui moure la raqueta de l'usuari. Hi haurà un tema per pujar la raqueta i un altra per a baixar-la.

A08.06[modifica]

Desenvolupeu el projecte a08_06 que controla els dos temes MQTT de control de la pràctica a08_05. Ha de funcionar per a escriptori, Android i WebAssembly.

A09 - FreeRTOS i MicroWorkers[modifica]

A09.01: fent servir Microworkers emprant MicroPython

A09.02: fent servir FreeRTOS emprant l'IDE d'Arduino

FreeRTOS i MicroWorkers[modifica]

fr-mw-1) Presa de contacte amb MicroWorkers i FreeRTOS[modifica]

Codi uPython_mqtt_01 amb el botó dibuixat (copieu l'arxiu .json)

Fent servir la placa IoT-02 feu un programa amb dues tasques. Una tasca farà que el led groc faci pampallugues (500ms encés i 500ms apagat). Una altra tasca llegirà el botó I35, fent que quan estigui premut el cicle del led groc sigui de 100ms encés i 100ms apagat.

Per a definir entrades i sortides a MicroPython:

from machine import Pin

btn = Pin(35,Pin.IN) # Botó connectat a l'entrada I35 del Wokwi i la placa IoT-02
ledIntern = Pin(2,Pin.OUT) # led intern a Wokwi i led groc a la placa IoT-02 és el 19

Per a controlar la lluminositat del led:

from time import sleep

while True:
   ledIntern.value(1) # Encés
   sleep(0.5)
   ledIntern.value(0) # Apagat
   sleep(0.5)

Per a llegir el botó:

currentBtn = btn()
lastBtn = currentBtn
while True:
   currentBtn = btn()
   if currentBtn != lastBtn:
       lastBtn = currentBtn
       if currentBtn == 1:
           print("Button released. ",end="")
       else:
           print("Button pressed. ",end="")

fr-mw-2) Connexió a WiFi i un broker MQTT[modifica]

Afegiu una tasca per a fer connexió a WiFi i MQTT.

  • Emprant MicroWorkers

Us podeu basar en el codi present a prj_mqtt_json. Feu servir també una variable booleana bSocConnectat (que serà certa quan hi hagi connexió i falsa quan no s'hagi establert la connexió o s'hagi perdut -quan es perd la IP que s'autollegeix és 0.0.0.0-).

  • Emprant FreeRTOS

Us podeu basar en el codi present a IoT-02_mqtts_freeRTOS_json_12. Afegiu-hi també un #define USING_WIFI per saber si cal que funcionin totes aquelles funcions que tenen relació amb la wifi. Feu servir també una variable booleana bSocConnectat (que serà certa quan hi hagi connexió i falsa quan no s'hagi establert la connexió o s'hagi perdut -quan es perd la IP que s'autollegeix és 0.0.0.0-).

- Publicació

Si bSocConnectat és certa, publica el canvi d'estat del botó quan es prem I35.

- Subscripció

Quan feu la connexió a MQTT, afegiu una subscripció al tema /MAC/led (essent MAC la MAC de la vostra placa). Si rebeu per aquest tema un '1', 'On','on' o 'ON' s'ha d'encendre el led blanc. Si rebeu '0', 'Off', 'off' o 'OFF' s'apaga el led blanc.

A10 - Paho + Telegram + Mastodon[modifica]

A10.1 - Telegram[modifica]

Desenvolupeu un exemple d'ús d'un bot de Telegram.

A10.2 - Mastodon[modifica]

Desenvolupeu un exemple d'ús d'un bot de Mastodon.

A10.3 - Paho[modifica]

Desenvolupeu un exemple d'ús de Paho fent servir Python (podeu fer servir Jupyter Lab).

A10.3.1 - Subscripció MQTT a Paho i publicació a Snap![modifica]

Exemple d'ús de Paho fent servir Python fent de subscriptor i publicant temes MQTT des d'Snap!.

Snap emprant http (existeix la llibreria MQTT)

A10.3.2 - Publicació MQTT a Paho i subscripció a Snap![modifica]

Exemple d'ús de Paho fent servir Python fent de publicador tenint la subscripció MQTT a Snap!.

Snap emprant http (existeix la llibreria MQTT)

A11 - Metacognició de síntesi[modifica]

Enunciat de la metacognició de síntesi en pdf

Enunciat de la metacognició de síntesi en format editable

A12 - Qt[modifica]

A12.01.1 - ginyMqtt amb QMake[modifica]

L'objectiu d'aquest exercici és fer una aplicació en Qt capaç de comunicar-se bidireccionalment amb la Placa IoT-02. A partir de simplecient amb usuari i contrasenya s'ha generat la classe mqttBasic. Heu de desenvolupar l'aplicació ginyMqtt que tingui aquest aspecte:

  • Pantalla inicial, quan encara no s'ha connectat al broker (el nom del broker MQTT, usuari i contrasenya s'escriuen al codi. És a dir, no es demana una personalització del broker):
Desconnectat del broker
  • Un cop s'ha connectat al broker:
Connectat del broker

La casella de selecció encén i apaga el led blanc de la placa IoT-02 publicant el tema i missatge corresponent. L'etiqueta s'ha de subscriure al tema MQTT del botó I35 i presenta llur missatge traduït al català.

  • Suggeriment de classe GinyMqtt:
Exemple de classe
  • Suggeriment de constructor:
Exemple de constructor i destructor
  • Suggeriment d'arxiu de projecte emprant qmake:
Exemple d'arxiu de projecte emprant qmake

Exercici A12.01.1 (Heu de desar a la carpeta A12 del Drive un document 2324-DAM-A12.01.1-1rCognom2nCognomNom.pdf amb les solucions explicades i un arxiu 2324-DAM-A12.01.1-1rCognom2nCognomNom.zip amb els codis comprimits, sense el .pro.user).

A12.01.2 - ginyMqtt amb CMake[modifica]

L'objectiu d'aquest exercici és fer una aplicació en Qt capaç de comunicar-se bidireccionalment amb la Placa IoT-02. El funcionament és exactament igual que a l'exercici anterior que heu fet emprant qmake, en aquest heu de fer servir CMake.

Connectat al broker. Desenvolupat amb CMake

Suggeriment d'arxiu de projecte emprant CMake:

Exemple d'arxiu de projecte emprant CMake i Mqtt

Afegiu Network i Mqtt a find_package():

find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets Network Mqtt)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets Network Mqtt)
Exemple d'arxiu de projecte emprant CMake i Mqtt

Afegiu Qt${QT_VERSION_MAJOR}::Network i Qt${QT_VERSION_MAJOR}::Mqtt a target_link_libraries():

target_link_libraries(ginyMqtt04_cmake PUBLIC Qt${QT_VERSION_MAJOR}::Widgets Qt${QT_VERSION_MAJOR}::Network Qt${QT_VERSION_MAJOR}::Mqtt)
Exemple d'arxiu de projecte emprant CMake i Mqtt

Exercici A12.01.2 (Heu de desar a la carpeta A12 del Drive un document 2324-DAM-A12.01.2-1rCognom2nCognomNom.pdf amb les solucions explicades i un arxiu 2324-DAM-A12.01.2-1rCognom2nCognomNom.zip amb els codis comprimits, sense el CMakeLists.txt.user).


A12.02 Mqtt_IoT02[modifica]

Desenvolupeu un projecte en Qt, capaç d'interaccionar amb la Placa IoT-02, amb aquest aspecte:

QtMqttIoT02
  • A12.02-1)

Prenent com a base els arxius 00_botonsToggle05.zip i 00_botonsToggle06.zip del recull, desenvolupeu el projecte 02_indicadorLed_00 per a que tingui aquest comportament:

02_indicadorLed_00


02_indicadorLed_00
  • A12.02-2)

Basant-vos en 02_indicadorLed_00 i 01_json_00.zip del recull, desenvolupeu el projecte 03_indicadorLed_01 per a que tingui aquest aspecte (els valors dels led R, G i B donen valors 0 i 1. Els valors del led W són true i false):

03_indicadorLed_01
  • A12.02-3)

Basant-vos en 04_indicadorBotons00.zip del recull, desenvolupeu el projecte 05_indicadorBotons_01 per a que tingui aquest aspecte:

05_indicadorBotons_01
  • A12.02-4)

Basant-vos en 03_indicadorLed_01, desenvolupeu 03_indicadorLed_01_mqtt que controli els quatre leds de la placa IoT-02. (Us pot ajudar l'exemple ginyMqtt04)

Mqtt_IoT02::Mqtt_IoT02(QWidget *parent)
   : QWidget(parent)
   , ui(new Ui::Mqtt_IoT02)
{
   ui->setupUi(this);

   mqttBasic = new MqttBasic;
   indicadorLed = new IndicadorLed;
   indicadorBotons = new IndicadorGrupBotonsEt;
   ui->hlAmunt->addWidget(mqttBasic);
   ui->hlCentre->addWidget(indicadorLed);
   ui->hlAvall->addWidget(indicadorBotons);
   connect(mqttBasic,SIGNAL(vSignalMqttConnected()),this,SLOT(vMqttConnectat()));
   connect(mqttBasic,SIGNAL(vSignalMqttDisconnected()),this,SLOT(vMqttDesconnectat()));
   connect(indicadorLed,SIGNAL(vTrametJsonLeds(QString)),this,SLOT(vTrametJsonLeds(QString)));

   indicadorBotons->vSetJsonText("");

   //showMaximized();
}
  • A12.02-5)

Basant-vos en 05_indicadorBotons_01, desenvolupeu 05_indicadorBotons_01_mqtt que llegeixi els tres botons de la placa IoT-02.

  • A12.02-6)

Feu l'integració per a que l'aspecte sigui semblant a la captura d'inici de l'activitat A12.02. Haureu d'afegir un QTimer per anar demanant periòdicament el JSON que conté el valor de l'LDR.

A13 - QML a l'escriptori, Android i WebAssembly[modifica]

A13.00 ginyMqtt en QML i qmake[modifica]

Desenvolupeu la versió per a QML de l'exercici A12.01.1 - ginyMqtt amb QMake. La comunicació MQTT s'ha de fer mitjançant un rerefons en C++.

A13.01[modifica]

Feu un exemple bàsic executant un codi QML al vostre dispositiu Android o a una màquina virtual funcionant amb Android.

Màquina virtual Android per a fer-la servir per a executar codis QML des de QtCreator

A13.02[modifica]

Feu un exemple bàsic executant un codi QML al vostre navegador emprant emscripten (webassemby).

Guia per a fer anar WebAssembly al QtCreator

A13.03[modifica]

Feu la versió en QML de la pràctica A12.02 fent servir el mateix protocol TCP MQTT. (Ajuda a mqttQml).

       Page1Form {
           id: p1
           lbEstatMqtt.color: "#ff0000"

           btConnecta.onClicked: {
               if(btConnecta.text == "Connecta"){
                   rf.szBroker = "C,"+tiBroker.text+","+tiUsr.text+","+tiPwd.text+","+p2.tiMac.text;
               }else{
                   rf.szBroker = "D,"+tiBroker.text+","+tiUsr.text+","+tiPwd.text+","+p2.tiMac.text;
               }
           }
       }

       Page2Form {
           id: p2
           cbLedW.enabled: false

           cbLedW.onClicked: {
               if(!cbLedW.checked){
                   console.log("Apaga led blanc");
                   rf.szPublica = "w,"+tiMac.text;
               }else{
                   console.log("Encén led blanc");
                   rf.szPublica = "W,"+tiMac.text;
               }
               // console.log(tiMac.text);
           }
       }
void RereFons::setBroker(const QString &szValue){
   QStringList qsL = szValue.split(QLatin1Char(','));

   m_szNomBroker = qsL[1];
   m_szUsrBroker = qsL[2];
   m_szPwdBroker = qsL[3];
   m_szMac = qsL[4];

   qDebug() << "Des de C++. Broker: " << m_szNomBroker << ". Usuari: " << m_szUsrBroker << ". Contrasenya: " << m_szPwdBroker << ". MAC: " << m_szMac;

   if(qsL[0] == "C"){ // C: Connecta broker
       mqtt->vSetBroker(m_szNomBroker,MQTT_PORT,m_szUsrBroker,m_szPwdBroker);
   }
   if(qsL[0] == "D") // D: Desconnecta broker
       mqtt->vDisconnectBroker();

   emit brokerCanviat();
}

void RereFons::setPublica(const QString &szValue){
   QStringList qsL = szValue.split(QLatin1Char(','));

   QString qsTopic = "/"+qsL[1]+"/ledW";

   qDebug() << "Des de C++. Broker: " << m_szNomBroker;
   qDebug() << "Des de C++. Usuari: " << m_szUsrBroker;
   qDebug() << "Des de C++. Contrasenya: " << m_szPwdBroker;

   if(qsL[0] == "W"){ // W: Encén led blanc
       mqtt->vPublish(qsTopic,"W");
       qDebug() << "Publica tema: " << qsTopic << " amb valor: W";
   }
   if(qsL[0] == "w"){ // w: Apaga led blanc
       mqtt->vPublish(qsTopic,"w");
       qDebug() << "Publica tema: " << qsTopic << " amb valor: w";
   }
}

A13.04[modifica]

Feu la versió en QML de la pràctica A12.02 fent servir sòcols web MQTT no segurs.

Ajuda parcial per a resoldre aquesta pràctica al recull (usuari: dam | contrasenya: dam2223 )

A13.05[modifica]

Feu la versió en PureQML de la pràctica A12.02 fent servir sòcols web MQTT no segurs.

A14 - Scada NodeRed + InfluxDB + Grafana + UserLand + Snap! + Telegram + Mastodon API[modifica]

A14.1 - Autenticació d'accés a NodeRED[modifica]

Personalitzeu l'autenticació d'accés al vostre NodeRed (Autenticació d'accés a NodeRED).

A14.2 - Bot de Telegram[modifica]

Desenvolupeu un bot de Telegram que interactui amb la vostra placa IoT-02. Les ordres, des del mateix bot, són:

/W : Encén el led blanc

/w : Apaga el led blanc

/botons : Estat dels botons a la placa

A14.3 - Bot de Telegram[modifica]

Desenvolupeu un bot de Telegram que interactui amb la vostra placa IoT-02. Les ordres, des d'un grup al qual pertany i és administrador, són:

/W : Encén el led blanc

/w : Apaga el led blanc

/botons : Estat dels botons a la placa

I de manera asíncrona avisa quan s'ha premut el botó I35, trametent un missatge al grup al qual pertany. El codi MQTT en format json

A14.4 - Mastodon[modifica]

Publiqueu la temperatura, humitat relativa i pressió atmosfèrica llegides per la vostra placa IoT-02 i les publiqueu a Mastodon mitjançant NodeRED.

Feu un informe de com ho heu programat i captures de llur funcionament.

A14.5 - Grafana[modifica]

Documenteu la instal·lació de Grafana al vostre sistema operatiu

A14.6 - InfluxDB[modifica]

Documenteu la instal·lació d'InfluxDB al vostre sistema operatiu

A descàrregues d'InfluxDB es pot trobar:

# influxdata-archive_compat.key GPG fingerprint:
#     9D53 9D90 D332 8DC7 D6C8 D3B9 D8FF 8E1F 7DF8 B07E
wget -q https://repos.influxdata.com/influxdata-archive_compat.key

echo '393e8779c89ac8d958f81f942f9ad7fb82a25e133faddaf92e15b16e6ac9ce4c influxdata-archive_compat.key' | sha256sum -c && cat influxdata-archive_compat.key | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/influxdata-archive_compat.gpg > /dev/null

echo 'deb [signed-by=/etc/apt/trusted.gpg.d/influxdata-archive_compat.gpg] https://repos.influxdata.com/debian stable main' | sudo tee /etc/apt/sources.list.d/influxdata.list

sudo apt-get update && sudo apt-get install influxdb2

A14.7 - UserLand[modifica]

Pàgina oficial d'UserLand

Arxiu apk: tech.ula_7438725.apk enllaçat des de f-droid

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

A14.8 - MariaDB[modifica]

Feu un document amb totes les passes necessàries per a que funcioni al vostre ordinador un NodeRed amb nodes MariaDB. Repliqueu al vostre ordinador:

Ús de MariaDB per emmagatzemar dades de la Internet de les Coses

Ús de la base de dades MariaDB des de NodeRED

A15 - Consultes asíncrones I2C - FreeRTOS i MicroWorkers[modifica]

A15.01: fent servir Microworkers emprant MicroPython

A15.02: fent servir FreeRTOS emprant l'IDE d'Arduino

A15.01 i A15.02) Connexió a WiFi i un broker MQTT[modifica]

Afegiu una tasca per a fer connexió a WiFi i MQTT.

  • Emprant MicroWorkers

Us podeu basar en el codi present a prj_mqtt_json. Feu servir també una variable booleana bSocConnectat (que serà certa quan hi hagi connexió i falsa quan no s'hagi establert la connexió o s'hagi perdut -quan es perd la IP que s'autollegeix és 0.0.0.0-).

  • Emprant FreeRTOS

Us podeu basar en el codi present a IoT-02_mqtts_freeRTOS_json_12. Afegiu-hi també un #define USING_WIFI per saber si cal que funcionin totes aquelles funcions que tenen relació amb la wifi. Feu servir també una variable booleana bSocConnectat (que serà certa quan hi hagi connexió i falsa quan no s'hagi establert la connexió o s'hagi perdut -quan es perd la IP que s'autollegeix és 0.0.0.0-).

- Publicació

Si bSocConnectat és certa, publica el canvi d'estat del botó quan es prem I35.

- Subscripció

Quan feu la connexió a MQTT, afegiu una subscripció al tema /MAC/led (essent MAC la MAC de la vostra placa). Si rebeu per aquest tema un '1', 'On','on' o 'ON' s'ha d'encendre el led blanc. Si rebeu '0', 'Off', 'off' o 'OFF' s'apaga el led blanc.

A15.03 - IoT-02 servint pàgina web per a canviar contrasenya[modifica]

Aquesta pràctica consisteix en canviar, mitjançant pàgina web, l'SSID i contrasenya de connexió a una xarxa sense fils de la vostra Placa IoT-02. Baixeu-vos els codis del GitHub del wifi-manager per a poder desenvolupar la pràctica.


A15.03-01) Afegiu a sota dels include de WiFiManager-example.ino:

#define LED_BLANC 19
#define RST_WIFI_CRED 35

Després de seleccionar la velocitat de 115200 bauds, afegiu-hi Serial.println(__FILE__); per a que després de fer reset us surti el nom, i ubicació, del darrer programa pujat a la Placa IoT-02

A15.03-02)

També a WiFiManager-example.ino, canvieu 2 per LED_BLANC i 15 per RST_WIFI_CRED. Això farà que al bucle principal s'encengui i s'apagui el led blanc i que quan es premi el botó I35 s'esborrin les credencials.

void setup() {
 pinMode(2, OUTPUT);
 pinMode(15,INPUT); //for resetting WiFi creds
 ...
 
void loop() {
 if(digitalRead(15) == LOW){ // LOW és quan es prem el botó. HIGH quan no és premut
   Serial.println("Wiping WiFi credentials from memory...");
   wipeEEPROM();
   while(loadWIFICredsForm());
 }
 digitalWrite(2,HIGH);
 delay(1000);
 digitalWrite(2,LOW);
 delay(1000);
}

El codi haurà de quedar:

void setup() {
 pinMode(LED_BLANC, OUTPUT);
 pinMode(RST_WIFI_CRED,INPUT); //for resetting WiFi creds
 ...
 
void loop() {
 if(digitalRead(RST_WIFI_CRED) == LOW){ // LOW és quan es prem el botó. HIGH quan no és premut
   Serial.println("Wiping WiFi credentials from memory...");
   wipeEEPROM();
   while(loadWIFICredsForm());
 }
 digitalWrite(LED_BLANC,HIGH);
 delay(1000);
 digitalWrite(LED_BLANC,LOW);
 delay(1000);
}

A15.03-03)

A l'arxiu WiFiManager.h, personalitzeu el vostre punt d'accés canviant l'SSID (per defecte ESP32 WiFi Manager) per un de vostre. També personalitzeu la contrasenya d'accés al punt d'accés (per defecte 12345678).

bool loadWIFICredsForm(){
 String s = EEPROM.readString(100);
 String p = EEPROM.readString(200);
 
 const char* ssid     = "ESP32 WiFi Manager";
 const char* password = "12345678";
 Serial.println("Setting Access Point...");
 
 WiFi.softAP(ssid, password);
 
 IPAddress IP = WiFi.softAPIP();
 
 Serial.print("AP IP address: ");
 Serial.println(IP);
 
 server.on("/", handleRoot);


A15.03-04)

Connecteu-vos al punt d'accés generat per la vostra placa IoT-02 (per exemple, amb el mòbil). Un cop connectats, el telèfon us pot avisar que no teniu connexió a Internet i us pot suggerir canviar de xarxa (digueu-li explícitament que no). Des del dispositiu connectat al punt d'accés entreu al navegador i escriviu com a URL: 192.168.4.1

Un cop us aparegui el formulari web demanant SSID i contrasenya, feu una captura de pantalla. Quan deseu les credencials, la placa IoT-02 tornarà a reiniciar-se en tres segons. Verifiqueu que s'aconsegueix la connexió a la xarxa sense fils de la vostra placa IoT-02.

A15.03-05)

Modifiqueu IoT-02_wifi_01_simpleWiFiServer.ino per a que es pugui canviar la SSID i contrasenya aprofitant els codi desenvolupat al punt anterior.

Funcionament final:

- Si es manté el botó I35 premut després de prémer el reset (o mentre s'alimenta la placa), s'activa el punt d'accés (192.168.4.1) i serveix una pàgina web que permet canviar l'SSID i la contrasenya.

- Altrament, intenta connectar-se a l'SSID i contrasenya servint IoT-02_wifi_01_simpleWiFiServer.ino amb les credencials de WiFi emmagatzemades prèviament amb el mètode del botó.

A15.04 - Codi de la placa IoT-02 per a que funcioni amb l'activitat A12.02[modifica]

Feu les modificacions que creieu escaients per a que la Placa IoT-02 funcioni amb el codi que heu desenvolupat a l'activitat A12.02

A16 - PureQML - Control de la placa IoT-02[modifica]

A17 - LoRa + InfluxDB + Grafana + Scada NodeRed[modifica]

A17.01 - Presa de contacte amb LoRa mitjançant The Things Network[modifica]

Amb la placa IoT-02 feu una tramesa d'un missatge Hola món fins al vostre NodeRed fent servir el mètode OTAA (On The Air Activation) de LoRa i el rerefons de The Things Stack. Teniu material d'ajuda a la carpeta intro del recull LoRa ( usuari: dam / contrasenya: dam2324)

A17.02 - Tramesa de dades emprant LoRa, The Things Network i NodeRed[modifica]

Amb la placa IoT-02 feu una tramesa del valor de la LDR amb dos bytes, fent servir el mètode OTAA. (Feu servir unions). Dimensioneu correctament el vector mydata.

LMIC_setTxData2(1, mydata, sizeof(mydata) - 1, 0); // Si no és una cadena de caràcters, hem d'informar del nombre exacte de bytes a trametre.

Codi IoT-02_11_modbus_bme280

Exemple de conversió bidireccional de float a cadena unsigned char fent servir union.

A17.03 - Prova bàsica d'ús del NodeRed injectant dades a InfluxDB i visualitzant-les a Grafana[modifica]

Feu una demostració d'ús de Grafana llegint InfluxDB. I InfluxDB emmagatzemant dades des del NodeRED. Baseu-vos en aquests arxius d'exemple.

from(bucket: "dam2")
 |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
 |> filter(fn: (r) => r["_measurement"] == "valorAleatori")
 |> filter(fn: (r) => r["_field"] == "value")
 |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)
 |> yield(name: "mean")

A17.04 - Visualització a Grafana de les dades dels sensors de la placa IoT-02, fent servir NodeRed i InfluxDB[modifica]

A17.04.1) Visualitzeu a Grafana les dades de temperatura, humitat relativa, pressió atmosfèrica i de nivell de llum. Feu servir missatgeria MQTT amb un broker públic. Gestioneu les dades amb NodeRED emmagatzemant-les a una base de dades temporal InfluxDB v2.0. Visualitzeu les dades a un panell de gràfiques emprant Grafana.

A17.04.2) Visualitzeu a Grafana les dades de temperatura, humitat relativa, pressió atmosfèrica i de nivell de llum. Feu servir missatgeria MQTT amb un broker local (a la vostra màquina base o màquina virtual). Gestioneu les dades amb NodeRED emmagatzemant-les a una base de dades temporal InfluxDB v2.0. Visualitzeu les dades a un panell de gràfiques emprant Grafana.

A17.05 - Prova bàsica d'ús del NodeRed injectant dades a MariaDB i visualitzant-les a Grafana[modifica]

Feu una demostració d'ús de Grafana llegint MariaDB. I MariaDB emmagatzemant dades des del NodeRED. Baseu-vos en Aleatorització controlada pel panell de control explicada a Ús de la base de dades MariaDB des de NodeRED

A17.06 - Visualització a Grafana de les dades dels sensors de la placa IoT-02, fent servir NodeRed i MariaDB[modifica]

Visualitzeu a Grafana les dades de temperatura, humitat relativa, pressió atmosfèrica i de nivell de llum. Feu servir missatgeria MQTT amb un broker públic. Gestioneu les dades amb NodeRED emmagatzemant-les a una base de dades temporal MariaDB. Visualitzeu les dades a un panell de gràfiques emprant Grafana.

A17.07 - Desenvolupament d'una API en NodeRed per a trametre dades[modifica]

Implementeu un flux per a canviar l'estat dels leds i el relé biestable de la placa IoT-02. Feu la prova de validació des del terminal.

A17.08 - Desenvolupament d'una API en NodeRed per a rebre dades[modifica]

A17.08.01 - Desenvolupament d'una API en NodeRed per a rebre una dada[modifica]

Implementeu un flux per a rebre el valor de l'LDR de la placa IoT-02. Feu la prova de validació des del terminal.

A17.08.02 - Desenvolupament d'una API en NodeRed per a rebre un conjunt de dades emprant JSON[modifica]

Implementeu un flux per a rebre un JSON dels valors dels sensors i els botons de la placa IoT-02 (aprofiteu el tema jsonIn). Feu la prova de validació des del terminal.

A18 - LoRa + QML[modifica]

A18.01 - Recepció de dades LoRa, emprant el rerefons de The Things Network i un visualitzador QML[modifica]

Aprofitant exercicis anteriors, A17.02 - Tramesa de dades emprant LoRa, The Things Network i NodeRed i l'A08.06, desenvolupeu un visualitzador, fet en QML, del valor de la LDR tramès per la placa IoT-02 emprant LoRa.