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

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

Cronograma i carpetes compartides

caption

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

Activitats

A00 - Creació de grups

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?

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

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

A06.01

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

A06.02

Exercici A06.02 (Heu de desar a la carpeta A06 un document 2223-DAM-A06.02-1rCognom2nCognomNom.pdf amb l'explicació del procés per a instal·lar QtMqtt al vostre sistema. Verifiqueu que us funciona fent servir el codi de la carpeta de l'exercici A06.02

A06.03

Aquest exercici passa a ser A12.01.

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

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

A07.01

Exercici A07.01 (Heu de desar a la carpeta A07 un document 2223-DAM-A07.01-1rCognom2nCognomNom.pdf amb l'explicació del procés de fer servir la modificació de simpleclient, anomenant-la simpleclientUsrPwd, incorporant usuari i contrasenya. Heu de comunicar la placa IoT-02 de forma bidireccional amb simpleclientUsrPwd.

void MainWindow::on_buttonConnect_clicked()
{
   if (m_client->state() == QMqttClient::Disconnected) {
       ui->lineEditHost->setEnabled(false);
       ui->spinBoxPort->setEnabled(false);
       ui->buttonConnect->setText(tr("Disconnect"));
       ui->leUser->setEnabled(false);
       ui->lePwd->setEnabled(false);
       m_client->setUsername(ui->leUser->text());
       m_client->setPassword(ui->lePwd->text());
       m_client->connectToHost();
   } else {
       ui->lineEditHost->setEnabled(true);
       ui->spinBoxPort->setEnabled(true);
       ui->leUser->setEnabled(true);
       ui->lePwd->setEnabled(true);
       ui->buttonConnect->setText(tr("Connect"));
       m_client->disconnectFromHost();
   }
}

A07.02

Exercici A07.02 (Heu de desar a la carpeta A07 un document 2223-DAM-A07.02-1rCognom2nCognomNom.pdf amb l'explicació de com heu modificat la MAC (escrivint-hi la de la vostra placa IoT-02) del bessó digital copiat a la vostra zona de Wokwi. Feu el document fent servir com a controladors l'Snap!, NodeRED, i el codi amb QtMqtt ginyMqtt04. I com a dispositius la vostra còpia modificada del bessó digital i la placa IoT-02 per a provar la bidireccionalitat de la comunicació MQTT amb el botó i el led.

A07.03

Controleu la raqueta d'usuari de la pràctica A08.05 (un ping pong) fent servir les tecles i34 i i35 de la Placa IoT-02

A08 - QML, connexió a rerefons Qt i PureQML

A08.00

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

A08.01

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

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

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

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

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

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

A09.01: fent servir Microworkers emprant MicroPython

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

FreeRTOS i MicroWorkers

fr-mw-1) Presa de contacte amb FreeRTOS

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.

A12 - Qt

A12.01

Aquest exercici abans era l' A06.03.

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

A12.02

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

A13.01

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

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

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

       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

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

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

A15 - Consultes asíncrones I2C - FreeRTOS i MicroWorkers

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

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

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

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

A17 - LoRa + InfluxDB + Grafana + Scada NodeRed

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

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: dam2122)

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

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.

A18 - LoRa + QML

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

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.