Components and supplies
Arduino Oplà IoT Kit
LED, Red
LED Light Bulb, Frosted GLS
Axial Fan, Brushless Motor
Tools and machines
Drill / Driver, Cordless
Multitool, Screwdriver
Apps and platforms
Arduino IoT Cloud
Project description
Code
Smart_Fitting_Room_1_feb13a.ino
arduino
Smart Fitting Room Sketch
1#include "arduino_secrets.h" 2/*------------------------------------------------------------------------------- 3// Smart_Fitting_Room.ino 4// 5// Autore: Charge Of Things [www.chargeofthings.com] 6// Progetto: Smart Fitting Room [Arduino Cloud Game] 7// 8// Descrizione: Gestione integrata e cloud dei camerini di prova per i negozi 9// di abbigliamento, con la gestione condivisa delle chiamate dei 10// clienti allo staff e l'invio di messaggi, avvisi e promo. 11// 12// Release: 1.0 [febbraio 2022] 13// 14// Video che illustra tutte le funzionalit: [https://youtu.be/3khBZGicUEI] 15//-----------------------------------------------------------------------------*/ 16 17/* 18 Sketch generated by the Arduino IoT Cloud Thing "Untitled" 19 https://create.arduino.cc/cloud/things/e0bf64c4-9a92-408d-a0e8-eec068f47df2 20 21 Arduino IoT Cloud Variables description 22 23 The following variables are automatically generated and updated when changes are made to the Thing 24 25 String messaggio; 26 float durata; 27 float luminosita; 28 float temperatura; 29 float umidita; 30 int chiamateTotaliGiorno; 31 int livelloLuce; 32 int livelloVentilazione; 33 int presenzeTotaliGiorno; 34 bool automazione; 35 bool chiamata; 36 bool luce; 37 bool msg1; 38 bool msg2; 39 bool msg3; 40 bool occupato; 41 bool presenza; 42 bool risposta; 43 bool ventilazione; 44 45 Variables which are marked as READ/WRITE in the Cloud Thing will also have functions 46 which are called when their values are changed from the Dashboard. 47 These functions are generated with the Thing and added at the end of this sketch. 48*/ 49 50//----- librerie e file inclusi ----- 51#include "thingProperties.h" 52#include <Arduino_MKRIoTCarrier.h> 53#include "visuals.h" 54#include "pitches.h" 55 56 57//----- dichiarazioni ----- 58MKRIoTCarrier carrier; 59 60int pir = A5; 61int pirState = 0; 62int pirStatePrec = 0; 63 64uint32_t greenColor = carrier.leds.Color( 255, 0, 0); 65uint32_t redColor = carrier.leds.Color( 0, 255, 0); 66uint32_t blueColor = carrier.leds.Color( 0, 0, 255); 67uint32_t whiteColor = carrier.leds.Color( 255, 255, 255); 68uint32_t noColor = carrier.leds.Color( 0, 0, 0); 69 70//----- definizione melodia del campanello ---- 71int melody[] = { 72 NOTE_C4, NOTE_G3, NOTE_G3, NOTE_A3 73}; 74int noteDurations[] = { 75 4, 8, 8, 4 76}; 77 78//----- dichiarazione variabili ----- 79int proximity = 0; 80int r = 0, g = 0, b = 0; 81unsigned long lastUpdate = 0; 82unsigned long lastUpdate2 = 0; 83String screenMsg; 84String screenMsgPrec; 85bool refreshScr; 86bool buttonChecked[] = {false, false, false, false, false}; 87 88 89//------------------------------------------------------------------------------- 90//----- funzione di setup dell'applicazione ----- 91//------------------------------------------------------------------------------- 92void setup() { 93 94 //----- inizializzazione variabili globali ----- 95 presenzeTotaliGiorno = 0; 96 presenza = false; 97 occupato = false; 98 durata = 0.0; 99 luminosita = 0.0; 100 temperatura = 0.0; 101 umidita = 0.0; 102 automazione = true; 103 luce = false; 104 ventilazione = false; 105 livelloLuce = 60; 106 livelloVentilazione = 60; 107 chiamateTotaliGiorno = 0; 108 chiamata = false; 109 risposta = false; 110 msg1 = false; 111 msg2 = false; 112 msg3 = false; 113 refreshScr = true; 114 115 //----- inizializzazione seriale ----- 116 Serial.begin(9600); 117 delay(1500); 118 119 //----- inizializzazione Carrier ----- 120 CARRIER_CASE = true; 121 if (!carrier.begin()) 122 { 123 Serial.println("Carrier not connected, check connections"); 124 while (1); 125 } 126 127 //----- inizializzazione rel ----- 128 carrier.Relay1.close(); //spegni il rel 1 della luce 129 carrier.Relay2.close(); //spegni il rel 2 della ventilazione 130 131 //----- inizializzazione led ----- 132 carrier.leds.setBrightness(20); 133 carrier.leds.fill(noColor, 0, 5); 134 carrier.leds.show(); 135 136 delay(200); 137 138 //----- suona il campanello ----- 139 suonaCampanello(); 140 141 //----- inizializzazione schermo ----- 142 carrier.display.fillScreen(0x0000); 143 //Basic configuration for the text 144 carrier.display.setRotation(0); 145 carrier.display.setTextWrap(true); 146 carrier.display.drawBitmap(45, 30, arduino_logo, 150, 106, 0x253); 147 carrier.display.setTextColor(0xFFFF); 148 carrier.display.setTextSize(2); 149 carrier.display.setCursor(15, 150); 150 carrier.display.print("Smart Fitting Room"); 151 carrier.display.setCursor(45, 180); 152 carrier.display.print(" Loading"); 153 //Printing a three dots animation 154 for (int i = 0; i < 3; i++) 155 { 156 carrier.display.print("."); 157 delay(1000); 158 } 159 160 //----- inizializzazione pir ----- 161 pinMode(A5, INPUT); 162 pirState = 0; 163 pirStatePrec = 0; 164 165 //----- accensione dei led ----- 166 carrier.leds.setPixelColor(0, noColor); 167 carrier.leds.setPixelColor(1, greenColor); 168 carrier.leds.setPixelColor(2, noColor); 169 carrier.leds.setPixelColor(3, redColor); 170 carrier.leds.setPixelColor(4, blueColor); 171 carrier.leds.show(); 172 173 //----- inizializzazione connessione a IoT Cloud ----- 174 initProperties(); 175 ArduinoCloud.begin(ArduinoIoTPreferredConnection); 176 setDebugMessageLevel(4); 177 ArduinoCloud.printDebugInfo(); 178 179 //----- ciclo di attesa della connessione a IoT Cloud ----- 180 while (ArduinoCloud.connected() != 1) { 181 ArduinoCloud.update(); 182 delay(500); 183 } 184 delay(250); 185 186 //----- reinizializzazione variabili globali dopo connessione a IoT Cloud ----- 187 presenzeTotaliGiorno = 0; 188 presenza = false; 189 occupato = false; 190 durata = 0.0; 191 luminosita = 0.0; 192 temperatura = 0.0; 193 umidita = 0.0; 194 automazione = true; 195 luce = false; 196 ventilazione = false; 197 livelloLuce = 60; 198 livelloVentilazione = 60; 199 chiamateTotaliGiorno = 0; 200 chiamata = false; 201 risposta = false; 202 msg1 = false; 203 msg2 = false; 204 msg3 = false; 205 refreshScr = true; 206 207 delay(250); 208 209 //----- inizializzazione schermo ----- 210 messaggio = " Camerino libero"; 211 //----- stampa messaggio ----- 212 lastUpdate2 = millis(); 213 screenMsg = messaggio; 214 printMsg(); 215} 216 217 218//------------------------------------------------------------------------------- 219//----- ciclo principale di esecuzione dell'applicazione ----- 220//------------------------------------------------------------------------------- 221void loop() { 222 223 //----- segnatempo principale ogni secondo ----- 224 if (millis() - lastUpdate > 1000) { 225 lastUpdate = millis(); 226 if (presenza == true) { 227 durata = durata + 1; //se occupato incrementa la durata di utilizzo del camerino 228 } 229 230 //----- sincronizza Arduino Cloud ----- 231 ArduinoCloud.update(); 232 delay(200); 233 234 //----- lettura sensori ----- 235 readSensor(); 236 237 //----- verifica presenza nel camerino ----- 238 if (pirState == HIGH && pirStatePrec == LOW) { //se c' qualcuno 239 pirStatePrec = pirState; 240 presenzeTotaliGiorno = presenzeTotaliGiorno + 1; //incrementa le presenze del giorno 241 presenza = true; 242 occupato = true; //segnala camerino occupato accendendo la luce rossa 243 messaggio = "Camerino occupato"; 244 245 //----- stampa messaggio ----- 246 lastUpdate2 = millis(); 247 screenMsg = " Benvenuto, premi Chiama se occorre"; 248 printMsg(); 249 250 //----- accendi led bianco di presenza ----- 251 carrier.leds.setPixelColor(2, whiteColor); 252 carrier.leds.show(); 253 254 //----- esegui accensioni se l'automazione attiva ----- 255 if (automazione == true) { 256 luce = true; 257 ventilazione = true; 258 carrier.Relay1.open(); //accendi il rel 1 della luce 259 carrier.Relay2.open(); //accendi il rel 2 della ventilazione 260 } 261 262 //----- suona il campanello ----- 263 suonaCampanello(); 264 265 } else if (pirState == LOW && pirStatePrec == HIGH) { //se non c' pi nessuno 266 pirStatePrec = pirState; 267 presenza = false; 268 chiamata = false; //interrompi eventuale chiamata 269 carrier.leds.setPixelColor(0, noColor); 270 carrier.leds.setPixelColor(1, greenColor); 271 carrier.leds.show(); 272 occupato = false; //camerino libero 273 messaggio = " Camerino libero"; 274 275 //----- stampa messaggio ----- 276 lastUpdate2 = millis(); 277 screenMsg = messaggio; 278 printMsg(); 279 280 //----- spegni led di presenza ----- 281 carrier.leds.setPixelColor(2, noColor); 282 carrier.leds.show(); 283 durata = 0.0; //azzera durata presenza 284 285 //----- esegui accensioni se l'automazione attiva ----- 286 if (automazione == true) { 287 luce = false; 288 ventilazione = false; 289 carrier.Relay1.close(); //spegni il rel 1 della luce 290 carrier.Relay2.close(); //spegni il rel 2 della ventilazione 291 } 292 } 293 294 //----- sincronizza Arduino Cloud ----- 295 ArduinoCloud.update(); 296 delay(200); 297 } 298 299 //----- gestione pulsanti ----- 300 buttonChecked[0] = false; 301 buttonChecked[1] = false; 302 buttonChecked[2] = false; 303 buttonChecked[3] = false; 304 buttonChecked[4] = false; 305 306 carrier.Buttons.update(); 307 308 if (carrier.Buttons.onTouchDown(TOUCH0) && buttonChecked[0] == false) //pulsante annulla chiamata 309 { 310 buttonChecked[0] = true; 311 if (chiamata == true) { 312 chiamata = false; 313 carrier.leds.setPixelColor(0, noColor); 314 carrier.leds.setPixelColor(1, greenColor); 315 carrier.leds.show(); 316 //----- stampa messaggio ----- 317 lastUpdate2 = millis(); 318 messaggio = " Chiamata annullata"; 319 screenMsg = messaggio; 320 printMsg(); 321 } 322 } 323 324 if (carrier.Buttons.onTouchUp(TOUCH1) && buttonChecked[1] == false) //pulsante chiama Staff 325 { 326 buttonChecked[1] = true; 327 if (chiamata == false) { 328 chiamata = true; 329 chiamateTotaliGiorno = chiamateTotaliGiorno + 1; 330 carrier.leds.setPixelColor(0, redColor); 331 carrier.leds.setPixelColor(1, noColor); 332 carrier.leds.show(); 333 //----- suona il campanello ----- 334 suonaCampanello(); 335 //----- stampa messaggio ----- 336 lastUpdate2 = millis(); 337 messaggio = " Chiamata in corso"; 338 screenMsg = messaggio; 339 printMsg(); 340 } 341 } 342 343 if (carrier.Buttons.getTouch(TOUCH2)) //pulsante men 344 { 345 buttonChecked[2] = true; 346 //----- inserimento codice per la gestione di altre funzionalit ----- 347 delay(100); 348 } 349 350 if (carrier.Buttons.onTouchUp(TOUCH3) && buttonChecked[3] == false) //pulsante + temperatura 351 { 352 buttonChecked[3] = true; 353 if (presenza == true) { 354 livelloVentilazione = livelloVentilazione + 10; 355 //----- stampa messaggio ----- 356 lastUpdate2 = millis(); 357 messaggio = " Alza la Ventilazione a " + String(livelloVentilazione) + "%"; 358 screenMsg = messaggio; 359 printMsg(); 360 } 361 } 362 363 if (carrier.Buttons.onTouchDown(TOUCH4) && buttonChecked[4] == false) //pulsante - temperatura 364 { 365 buttonChecked[4] = true; 366 if (presenza == true) { 367 livelloVentilazione = livelloVentilazione - 10; 368 //----- stampa messaggio ----- 369 lastUpdate2 = millis(); 370 messaggio = " Abbassa la Ventilazione a " + String(livelloVentilazione) + "%"; 371 screenMsg = messaggio; 372 printMsg(); 373 } 374 } 375 376 //----- segnatempo ogni 10 secondi ----- 377 if (millis() - lastUpdate2 > 10000) { 378 lastUpdate2 = millis(); 379 380 //----- aggiorna schermo ----- 381 updateScreen(); 382 } 383} 384 385//------------------------------------------------------------------------------- 386//----- funzione di lettura dei sensori ----- 387//------------------------------------------------------------------------------- 388void readSensor() { 389 390 //----- lettura sensori di temperatura e umidit ----- 391 temperatura = carrier.Env.readTemperature(); 392 umidita = carrier.Env.readHumidity(); 393 394 //----- lettura sensore di luminosit ----- 395 if (carrier.Light.proximityAvailable()) { //lettura prossimit 396 proximity = carrier.Light.readProximity(); 397 } 398 if (carrier.Light.colorAvailable()) { //lettura colori rgb 399 carrier.Light.readColor(r, g, b); 400 } 401 luminosita = (r + g + b) / 3.0; 402 403 //----- lettura sensore pir ----- 404 pirState = digitalRead(pir); 405 delay(200); 406} 407 408 409//------------------------------------------------------------------------------- 410//----- funzione di aggiornamento schermo ----- 411//------------------------------------------------------------------------------- 412void updateScreen() { 413 414 carrier.display.fillScreen(0x0000); 415 carrier.display.setRotation(0); 416 carrier.display.setTextWrap(true); 417 418 //----- gestione chiamata ----- 419 carrier.display.setTextColor(ST77XX_WHITE); 420 carrier.display.setTextSize(2); 421 if (chiamata == true) { //se c' chiamata incorso 422 carrier.display.drawBitmap(15, 145, nobell_logo, 88, 64, ST77XX_RED); 423 carrier.display.setCursor(10, 90); 424 carrier.display.print("Annulla"); 425 carrier.display.setCursor(10, 110); 426 carrier.display.print("Chiamata"); 427 } else { //se non c' chiamata incorso 428 carrier.display.drawBitmap(15, 20, ringbell_logo, 88, 64, ST77XX_GREEN); 429 carrier.display.setCursor(10, 90); 430 carrier.display.print(" Chiama"); 431 carrier.display.setCursor(15, 110); 432 carrier.display.print(" STAFF"); 433 } 434 435 //----- gestione temperatura ----- 436 carrier.display.drawBitmap(140, 47, temperature_logo, 100, 100, ST77XX_WHITE); 437 carrier.display.setTextColor(ST77XX_RED); 438 carrier.display.setTextSize(4); 439 carrier.display.setCursor(170, 22); 440 carrier.display.print("+"); 441 carrier.display.drawCircle(179, 36, 16, ST77XX_RED); 442 carrier.display.setTextColor(ST77XX_BLUE); 443 carrier.display.setTextSize(4); 444 carrier.display.setCursor(170, 170); 445 carrier.display.print("-"); 446 carrier.display.drawCircle(179, 184, 16, ST77XX_BLUE); 447 carrier.display.setTextColor(ST77XX_WHITE); 448 carrier.display.setTextSize(3); 449 carrier.display.setCursor(163, 140); 450 carrier.display.print(String(int(temperatura))); 451 carrier.display.setCursor(193, 130); 452 carrier.display.print(char(248)); 453 454} 455 456//------------------------------------------------------------------------------- 457//----- funzione di stampa messaggi ----- 458//------------------------------------------------------------------------------- 459void printMsg() { 460 461 carrier.display.fillScreen(0x0000); 462 carrier.display.setRotation(0); 463 carrier.display.setTextWrap(true); 464 465 //----- stampa messaggio ----- 466 carrier.display.drawBitmap(70, 10, msg_logo, 88, 64, ST77XX_WHITE); 467 carrier.display.setTextColor(ST77XX_WHITE); 468 carrier.display.setTextSize(3); 469 carrier.display.setCursor(10, 90); 470 carrier.display.print(screenMsg); 471} 472 473//------------------------------------------------------------------------------- 474//----- funzione per suonare il campanello ----- 475//------------------------------------------------------------------------------- 476void suonaCampanello() { 477 478 //----- suona il campanello ----- 479 for (int thisNote = 0; thisNote < 4; thisNote++) { 480 int noteDuration = 1000 / noteDurations[thisNote]; 481 carrier.Buzzer.sound(melody[thisNote]); 482 delay(noteDuration); 483 int pauseBetweenNotes = noteDuration * 1.0; 484 delay(pauseBetweenNotes); 485 carrier.Buzzer.noSound(); 486 } 487} 488 489//------------------------------------------------------------------------------- 490//----- eventi e funzioni di sincronizzazione variabili con iOT Cloud ----- 491//------------------------------------------------------------------------------- 492 493/* 494 Since Messaggio is READ_WRITE variable, onMessaggioChange() is 495 executed every time a new value is received from IoT Cloud. 496*/ 497void onMessaggioChange() { 498 //----- stampa messaggio che arriva dal cloud ----- 499 if (presenza == true) { 500 screenMsg = messaggio; 501 printMsg(); 502 } 503} 504/* 505 Since Durata is READ_WRITE variable, onDurataChange() is 506 executed every time a new value is received from IoT Cloud. 507*/ 508void onDurataChange() { 509 // Add your code here to act upon Durata change 510} 511/* 512 Since Luminosita is READ_WRITE variable, onLuminositaChange() is 513 executed every time a new value is received from IoT Cloud. 514*/ 515void onLuminositaChange() { 516 // Add your code here to act upon Luminosita change 517} 518/* 519 Since Temperatura is READ_WRITE variable, onTemperaturaChange() is 520 executed every time a new value is received from IoT Cloud. 521*/ 522void onTemperaturaChange() { 523 // Add your code here to act upon Temperatura change 524} 525/* 526 Since Umidita is READ_WRITE variable, onUmiditaChange() is 527 executed every time a new value is received from IoT Cloud. 528*/ 529void onUmiditaChange() { 530 // Add your code here to act upon Umidita change 531} 532/* 533 Since LivelloLuce is READ_WRITE variable, onLivelloLuceChange() is 534 executed every time a new value is received from IoT Cloud. 535*/ 536void onLivelloLuceChange() { 537 // Add your code here to act upon LivelloLuce change 538} 539/* 540 Since LivelloVentilazione is READ_WRITE variable, onLivelloVentilazioneChange() is 541 executed every time a new value is received from IoT Cloud. 542*/ 543void onLivelloVentilazioneChange() { 544 // Add your code here to act upon LivelloVentilazione change 545} 546/* 547 Since Automazione is READ_WRITE variable, onAutomazioneChange() is 548 executed every time a new value is received from IoT Cloud. 549*/ 550void onAutomazioneChange() { 551 // Add your code here to act upon Automazione change 552} 553/* 554 Since Chiamata is READ_WRITE variable, onChiamataChange() is 555 executed every time a new value is received from IoT Cloud. 556*/ 557void onChiamataChange() { 558 // Add your code here to act upon Chiamata change 559} 560/* 561 Since Luce is READ_WRITE variable, onLuceChange() is 562 executed every time a new value is received from IoT Cloud. 563*/ 564void onLuceChange() { 565 // Add your code here to act upon Luce change 566} 567/* 568 Since Msg1 is READ_WRITE variable, onMsg1Change() is 569 executed every time a new value is received from IoT Cloud. 570*/ 571void onMsg1Change() { 572 //----- stampa messaggio 1 se richiesto dal cloud ----- 573 if (presenza == true) { 574 //----- stampa messaggio ----- 575 lastUpdate2 = millis(); 576 messaggio = " Benvenuto, premi Chiama se occorre"; 577 screenMsg = messaggio; 578 printMsg(); 579 } 580} 581/* 582 Since Msg2 is READ_WRITE variable, onMsg2Change() is 583 executed every time a new value is received from IoT Cloud. 584*/ 585void onMsg2Change() { 586 //----- stampa messaggio 2 se richiesto dal cloud ----- 587 if (presenza == true) { 588 //----- stampa messaggio ----- 589 lastUpdate2 = millis(); 590 messaggio = "Siamo subito da Lei"; 591 screenMsg = messaggio; 592 printMsg(); 593 } 594} 595/* 596 Since Msg3 is READ_WRITE variable, onMsg3Change() is 597 executed every time a new value is received from IoT Cloud. 598*/ 599void onMsg3Change() { 600 //----- stampa messaggio 3 se richiesto dal cloud ----- 601 if (presenza == true) { 602 //----- stampa messaggio ----- 603 lastUpdate2 = millis(); 604 messaggio = "La preghiamo di attendere"; 605 screenMsg = messaggio; 606 printMsg(); 607 } 608} 609/* 610 Since Occupato is READ_WRITE variable, onOccupatoChange() is 611 executed every time a new value is received from IoT Cloud. 612*/ 613void onOccupatoChange() { 614 // Add your code here to act upon Occupato change 615} 616/* 617 Since Presenza is READ_WRITE variable, onPresenzaChange() is 618 executed every time a new value is received from IoT Cloud. 619*/ 620void onPresenzaChange() { 621 // Add your code here to act upon Presenza change 622} 623/* 624 Since Risposta is READ_WRITE variable, onRispostaChange() is 625 executed every time a new value is received from IoT Cloud. 626*/ 627void onRispostaChange() { 628 //----- risposta alla chiamata se attivata dal cloud ----- 629 if (risposta == true) { 630 if (chiamata == true) { 631 chiamata = false; 632 risposta = false; 633 carrier.leds.setPixelColor(0, noColor); 634 carrier.leds.setPixelColor(1, greenColor); 635 carrier.leds.show(); 636 //----- stampa messaggio ----- 637 lastUpdate2 = millis(); 638 messaggio = " Chiamata accolta siamosubito da Lei"; 639 screenMsg = messaggio; 640 printMsg(); 641 //----- suona il campanello ----- 642 suonaCampanello(); 643 } 644 } 645} 646/* 647 Since Ventilazione is READ_WRITE variable, onVentilazioneChange() is 648 executed every time a new value is received from IoT Cloud. 649*/ 650void onVentilazioneChange() { 651 // Add your code here to act upon Ventilazione change 652} 653 654/* 655 Since ChiamateTotaliGiorno is READ_WRITE variable, onChiamateTotaliGiornoChange() is 656 executed every time a new value is received from IoT Cloud. 657*/ 658void onChiamateTotaliGiornoChange() { 659 // Add your code here to act upon ChiamateTotaliGiorno change 660} 661 662/* 663 Since PresenzeTotaliGiorno is READ_WRITE variable, onPresenzeTotaliGiornoChange() is 664 executed every time a new value is received from IoT Cloud. 665*/ 666void onPresenzeTotaliGiornoChange() { 667 // Add your code here to act upon PresenzeTotaliGiorno change 668} 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691
Smart_Fitting_Room_1_feb13a.ino
arduino
Smart Fitting Room Sketch
1#include "arduino_secrets.h" 2/*------------------------------------------------------------------------------- 3 4// Smart_Fitting_Room.ino 5// 6// Autore: Charge Of Things [www.chargeofthings.com] 7// 8 Progetto: Smart Fitting Room [Arduino Cloud Game] 9// 10// Descrizione: 11 Gestione integrata e cloud dei camerini di prova per i negozi 12// di 13 abbigliamento, con la gestione condivisa delle chiamate dei 14// clienti 15 allo staff e l'invio di messaggi, avvisi e promo. 16// 17// Release: 18 1.0 [febbraio 2022] 19// 20// Video che illustra tutte 21 le funzionalit: [https://youtu.be/3khBZGicUEI] 22//-----------------------------------------------------------------------------*/ 23 24 25/* 26 Sketch generated by the Arduino IoT Cloud Thing "Untitled" 27 28 https://create.arduino.cc/cloud/things/e0bf64c4-9a92-408d-a0e8-eec068f47df2 29 30 31 Arduino IoT Cloud Variables description 32 33 The following variables are automatically 34 generated and updated when changes are made to the Thing 35 36 String messaggio; 37 38 float durata; 39 float luminosita; 40 float temperatura; 41 float umidita; 42 43 int chiamateTotaliGiorno; 44 int livelloLuce; 45 int livelloVentilazione; 46 47 int presenzeTotaliGiorno; 48 bool automazione; 49 bool chiamata; 50 bool 51 luce; 52 bool msg1; 53 bool msg2; 54 bool msg3; 55 bool occupato; 56 bool 57 presenza; 58 bool risposta; 59 bool ventilazione; 60 61 Variables which are 62 marked as READ/WRITE in the Cloud Thing will also have functions 63 which are 64 called when their values are changed from the Dashboard. 65 These functions are 66 generated with the Thing and added at the end of this sketch. 67*/ 68 69//----- 70 librerie e file inclusi ----- 71#include "thingProperties.h" 72#include <Arduino_MKRIoTCarrier.h> 73#include 74 "visuals.h" 75#include "pitches.h" 76 77 78//----- dichiarazioni ----- 79MKRIoTCarrier 80 carrier; 81 82int pir = A5; 83int pirState = 0; 84int pirStatePrec = 0; 85 86uint32_t 87 greenColor = carrier.leds.Color( 255, 0, 0); 88uint32_t redColor = carrier.leds.Color( 89 0, 255, 0); 90uint32_t blueColor = carrier.leds.Color( 0, 0, 255); 91uint32_t 92 whiteColor = carrier.leds.Color( 255, 255, 255); 93uint32_t noColor = carrier.leds.Color( 94 0, 0, 0); 95 96//----- definizione melodia del campanello ---- 97int melody[] 98 = { 99 NOTE_C4, NOTE_G3, NOTE_G3, NOTE_A3 100}; 101int noteDurations[] = { 102 103 4, 8, 8, 4 104}; 105 106//----- dichiarazione variabili ----- 107int proximity 108 = 0; 109int r = 0, g = 0, b = 0; 110unsigned long lastUpdate = 0; 111unsigned long 112 lastUpdate2 = 0; 113String screenMsg; 114String screenMsgPrec; 115bool refreshScr; 116bool 117 buttonChecked[] = {false, false, false, false, false}; 118 119 120//------------------------------------------------------------------------------- 121 122//----- funzione di setup dell'applicazione ----- 123//------------------------------------------------------------------------------- 124 125void setup() { 126 127 //----- inizializzazione variabili globali ----- 128 129 presenzeTotaliGiorno = 0; 130 presenza = false; 131 occupato = false; 132 durata 133 = 0.0; 134 luminosita = 0.0; 135 temperatura = 0.0; 136 umidita = 0.0; 137 automazione 138 = true; 139 luce = false; 140 ventilazione = false; 141 livelloLuce = 60; 142 143 livelloVentilazione = 60; 144 chiamateTotaliGiorno = 0; 145 chiamata = false; 146 147 risposta = false; 148 msg1 = false; 149 msg2 = false; 150 msg3 = false; 151 152 refreshScr = true; 153 154 //----- inizializzazione seriale ----- 155 Serial.begin(9600); 156 157 delay(1500); 158 159 //----- inizializzazione Carrier ----- 160 CARRIER_CASE 161 = true; 162 if (!carrier.begin()) 163 { 164 Serial.println("Carrier not connected, 165 check connections"); 166 while (1); 167 } 168 169 //----- inizializzazione 170 rel ----- 171 carrier.Relay1.close(); //spegni il rel 1 della luce 172 173 carrier.Relay2.close(); //spegni il rel 2 della ventilazione 174 175 //----- 176 inizializzazione led ----- 177 carrier.leds.setBrightness(20); 178 carrier.leds.fill(noColor, 179 0, 5); 180 carrier.leds.show(); 181 182 delay(200); 183 184 //----- suona il 185 campanello ----- 186 suonaCampanello(); 187 188 //----- inizializzazione schermo 189 ----- 190 carrier.display.fillScreen(0x0000); 191 //Basic configuration for the 192 text 193 carrier.display.setRotation(0); 194 carrier.display.setTextWrap(true); 195 196 carrier.display.drawBitmap(45, 30, arduino_logo, 150, 106, 0x253); 197 carrier.display.setTextColor(0xFFFF); 198 199 carrier.display.setTextSize(2); 200 carrier.display.setCursor(15, 150); 201 carrier.display.print("Smart 202 Fitting Room"); 203 carrier.display.setCursor(45, 180); 204 carrier.display.print(" 205 Loading"); 206 //Printing a three dots animation 207 for (int i = 0; i < 3; 208 i++) 209 { 210 carrier.display.print("."); 211 delay(1000); 212 } 213 214 215 //----- inizializzazione pir ----- 216 pinMode(A5, INPUT); 217 pirState = 0; 218 219 pirStatePrec = 0; 220 221 //----- accensione dei led ----- 222 carrier.leds.setPixelColor(0, 223 noColor); 224 carrier.leds.setPixelColor(1, greenColor); 225 carrier.leds.setPixelColor(2, 226 noColor); 227 carrier.leds.setPixelColor(3, redColor); 228 carrier.leds.setPixelColor(4, 229 blueColor); 230 carrier.leds.show(); 231 232 //----- inizializzazione connessione 233 a IoT Cloud ----- 234 initProperties(); 235 ArduinoCloud.begin(ArduinoIoTPreferredConnection); 236 237 setDebugMessageLevel(4); 238 ArduinoCloud.printDebugInfo(); 239 240 //----- 241 ciclo di attesa della connessione a IoT Cloud ----- 242 while (ArduinoCloud.connected() 243 != 1) { 244 ArduinoCloud.update(); 245 delay(500); 246 } 247 delay(250); 248 249 250 //----- reinizializzazione variabili globali dopo connessione a IoT Cloud 251 ----- 252 presenzeTotaliGiorno = 0; 253 presenza = false; 254 occupato = false; 255 256 durata = 0.0; 257 luminosita = 0.0; 258 temperatura = 0.0; 259 umidita = 0.0; 260 261 automazione = true; 262 luce = false; 263 ventilazione = false; 264 livelloLuce 265 = 60; 266 livelloVentilazione = 60; 267 chiamateTotaliGiorno = 0; 268 chiamata 269 = false; 270 risposta = false; 271 msg1 = false; 272 msg2 = false; 273 msg3 274 = false; 275 refreshScr = true; 276 277 delay(250); 278 279 //----- inizializzazione 280 schermo ----- 281 messaggio = " Camerino libero"; 282 //----- stampa messaggio 283 ----- 284 lastUpdate2 = millis(); 285 screenMsg = messaggio; 286 printMsg(); 287} 288 289 290//------------------------------------------------------------------------------- 291 292//----- ciclo principale di esecuzione dell'applicazione ----- 293//------------------------------------------------------------------------------- 294 295void loop() { 296 297 //----- segnatempo principale ogni secondo ----- 298 299 if (millis() - lastUpdate > 1000) { 300 lastUpdate = millis(); 301 if (presenza 302 == true) { 303 durata = durata + 1; //se occupato incrementa la 304 durata di utilizzo del camerino 305 } 306 307 //----- sincronizza Arduino 308 Cloud ----- 309 ArduinoCloud.update(); 310 delay(200); 311 312 //----- 313 lettura sensori ----- 314 readSensor(); 315 316 //----- verifica presenza 317 nel camerino ----- 318 if (pirState == HIGH && pirStatePrec == LOW) { //se 319 c' qualcuno 320 pirStatePrec = pirState; 321 presenzeTotaliGiorno 322 = presenzeTotaliGiorno + 1; //incrementa le presenze del giorno 323 presenza 324 = true; 325 occupato = true; //segnala 326 camerino occupato accendendo la luce rossa 327 messaggio = "Camerino occupato"; 328 329 330 //----- stampa messaggio ----- 331 lastUpdate2 = millis(); 332 333 screenMsg = " Benvenuto, premi Chiama se occorre"; 334 printMsg(); 335 336 337 //----- accendi led bianco di presenza ----- 338 carrier.leds.setPixelColor(2, 339 whiteColor); 340 carrier.leds.show(); 341 342 //----- esegui 343 accensioni se l'automazione attiva ----- 344 if (automazione == true) { 345 346 luce = true; 347 ventilazione = true; 348 carrier.Relay1.open(); 349 //accendi il rel 1 della luce 350 carrier.Relay2.open(); //accendi 351 il rel 2 della ventilazione 352 } 353 354 //----- suona il 355 campanello ----- 356 suonaCampanello(); 357 358 } else if (pirState 359 == LOW && pirStatePrec == HIGH) { //se non c' pi nessuno 360 pirStatePrec 361 = pirState; 362 presenza = false; 363 364 chiamata = false; //interrompi eventuale 365 chiamata 366 carrier.leds.setPixelColor(0, noColor); 367 carrier.leds.setPixelColor(1, 368 greenColor); 369 carrier.leds.show(); 370 occupato = false; //camerino 371 libero 372 messaggio = " Camerino libero"; 373 374 //----- 375 stampa messaggio ----- 376 lastUpdate2 = millis(); 377 screenMsg = 378 messaggio; 379 printMsg(); 380 381 //----- spegni led di presenza 382 ----- 383 carrier.leds.setPixelColor(2, noColor); 384 carrier.leds.show(); 385 386 durata = 0.0; //azzera durata 387 presenza 388 389 //----- esegui accensioni se l'automazione attiva 390 ----- 391 if (automazione == true) { 392 luce = false; 393 ventilazione 394 = false; 395 carrier.Relay1.close(); //spegni il rel 1 della luce 396 397 carrier.Relay2.close(); //spegni il rel 2 della ventilazione 398 399 } 400 } 401 402 //----- sincronizza Arduino Cloud ----- 403 ArduinoCloud.update(); 404 405 delay(200); 406 } 407 408 //----- gestione pulsanti ----- 409 buttonChecked[0] 410 = false; 411 buttonChecked[1] = false; 412 buttonChecked[2] = false; 413 buttonChecked[3] 414 = false; 415 buttonChecked[4] = false; 416 417 carrier.Buttons.update(); 418 419 420 if (carrier.Buttons.onTouchDown(TOUCH0) && buttonChecked[0] == false) //pulsante 421 annulla chiamata 422 { 423 buttonChecked[0] = true; 424 if (chiamata == true) 425 { 426 chiamata = false; 427 carrier.leds.setPixelColor(0, noColor); 428 429 carrier.leds.setPixelColor(1, greenColor); 430 carrier.leds.show(); 431 432 //----- stampa messaggio ----- 433 lastUpdate2 = millis(); 434 messaggio 435 = " Chiamata annullata"; 436 screenMsg = messaggio; 437 printMsg(); 438 439 } 440 } 441 442 if (carrier.Buttons.onTouchUp(TOUCH1) && buttonChecked[1] 443 == false) //pulsante chiama Staff 444 { 445 buttonChecked[1] = true; 446 447 if (chiamata == false) { 448 chiamata = true; 449 chiamateTotaliGiorno 450 = chiamateTotaliGiorno + 1; 451 carrier.leds.setPixelColor(0, redColor); 452 453 carrier.leds.setPixelColor(1, noColor); 454 carrier.leds.show(); 455 456 //----- suona il campanello ----- 457 suonaCampanello(); 458 //----- 459 stampa messaggio ----- 460 lastUpdate2 = millis(); 461 messaggio = " 462 Chiamata in corso"; 463 screenMsg = messaggio; 464 printMsg(); 465 466 } 467 } 468 469 if (carrier.Buttons.getTouch(TOUCH2)) //pulsante men 470 471 { 472 buttonChecked[2] = true; 473 //----- inserimento codice per la gestione 474 di altre funzionalit ----- 475 delay(100); 476 } 477 478 if (carrier.Buttons.onTouchUp(TOUCH3) 479 && buttonChecked[3] == false) //pulsante + temperatura 480 { 481 buttonChecked[3] 482 = true; 483 if (presenza == true) { 484 livelloVentilazione = livelloVentilazione 485 + 10; 486 //----- stampa messaggio ----- 487 lastUpdate2 = millis(); 488 489 messaggio = " Alza la Ventilazione a " + String(livelloVentilazione) 490 + "%"; 491 screenMsg = messaggio; 492 printMsg(); 493 } 494 } 495 496 497 if (carrier.Buttons.onTouchDown(TOUCH4) && buttonChecked[4] == false) //pulsante 498 - temperatura 499 { 500 buttonChecked[4] = true; 501 if (presenza == true) 502 { 503 livelloVentilazione = livelloVentilazione - 10; 504 //----- stampa 505 messaggio ----- 506 lastUpdate2 = millis(); 507 messaggio = " Abbassa 508 la Ventilazione a " + String(livelloVentilazione) + "%"; 509 screenMsg 510 = messaggio; 511 printMsg(); 512 } 513 } 514 515 //----- segnatempo ogni 516 10 secondi ----- 517 if (millis() - lastUpdate2 > 10000) { 518 lastUpdate2 = 519 millis(); 520 521 //----- aggiorna schermo ----- 522 updateScreen(); 523 } 524} 525 526//------------------------------------------------------------------------------- 527 528//----- funzione di lettura dei sensori ----- 529//------------------------------------------------------------------------------- 530 531void readSensor() { 532 533 //----- lettura sensori di temperatura e umidit 534 ----- 535 temperatura = carrier.Env.readTemperature(); 536 umidita = carrier.Env.readHumidity(); 537 538 539 //----- lettura sensore di luminosit ----- 540 if (carrier.Light.proximityAvailable()) 541 { //lettura prossimit 542 proximity = carrier.Light.readProximity(); 543 544 } 545 if (carrier.Light.colorAvailable()) { //lettura colori rgb 546 547 carrier.Light.readColor(r, g, b); 548 } 549 luminosita = (r + g + b) / 3.0; 550 551 552 //----- lettura sensore pir ----- 553 pirState = digitalRead(pir); 554 delay(200); 555 556} 557 558 559//------------------------------------------------------------------------------- 560 561//----- funzione di aggiornamento schermo ----- 562//------------------------------------------------------------------------------- 563 564void updateScreen() { 565 566 carrier.display.fillScreen(0x0000); 567 carrier.display.setRotation(0); 568 569 carrier.display.setTextWrap(true); 570 571 //----- gestione chiamata ----- 572 573 carrier.display.setTextColor(ST77XX_WHITE); 574 carrier.display.setTextSize(2); 575 576 if (chiamata == true) { //se c' chiamata incorso 577 carrier.display.drawBitmap(15, 578 145, nobell_logo, 88, 64, ST77XX_RED); 579 carrier.display.setCursor(10, 90); 580 581 carrier.display.print("Annulla"); 582 carrier.display.setCursor(10, 110); 583 584 carrier.display.print("Chiamata"); 585 } else { //se 586 non c' chiamata incorso 587 carrier.display.drawBitmap(15, 20, ringbell_logo, 588 88, 64, ST77XX_GREEN); 589 carrier.display.setCursor(10, 90); 590 carrier.display.print(" 591 Chiama"); 592 carrier.display.setCursor(15, 110); 593 carrier.display.print(" 594 STAFF"); 595 } 596 597 //----- gestione temperatura ----- 598 carrier.display.drawBitmap(140, 599 47, temperature_logo, 100, 100, ST77XX_WHITE); 600 carrier.display.setTextColor(ST77XX_RED); 601 602 carrier.display.setTextSize(4); 603 carrier.display.setCursor(170, 22); 604 carrier.display.print("+"); 605 606 carrier.display.drawCircle(179, 36, 16, ST77XX_RED); 607 carrier.display.setTextColor(ST77XX_BLUE); 608 609 carrier.display.setTextSize(4); 610 carrier.display.setCursor(170, 170); 611 612 carrier.display.print("-"); 613 carrier.display.drawCircle(179, 184, 16, ST77XX_BLUE); 614 615 carrier.display.setTextColor(ST77XX_WHITE); 616 carrier.display.setTextSize(3); 617 618 carrier.display.setCursor(163, 140); 619 carrier.display.print(String(int(temperatura))); 620 621 carrier.display.setCursor(193, 130); 622 carrier.display.print(char(248)); 623 624} 625 626//------------------------------------------------------------------------------- 627 628//----- funzione di stampa messaggi ----- 629//------------------------------------------------------------------------------- 630 631void printMsg() { 632 633 carrier.display.fillScreen(0x0000); 634 carrier.display.setRotation(0); 635 636 carrier.display.setTextWrap(true); 637 638 //----- stampa messaggio ----- 639 640 carrier.display.drawBitmap(70, 10, msg_logo, 88, 64, ST77XX_WHITE); 641 carrier.display.setTextColor(ST77XX_WHITE); 642 643 carrier.display.setTextSize(3); 644 carrier.display.setCursor(10, 90); 645 carrier.display.print(screenMsg); 646} 647 648//------------------------------------------------------------------------------- 649 650//----- funzione per suonare il campanello ----- 651//------------------------------------------------------------------------------- 652 653void suonaCampanello() { 654 655 //----- suona il campanello ----- 656 for 657 (int thisNote = 0; thisNote < 4; thisNote++) { 658 int noteDuration = 1000 / 659 noteDurations[thisNote]; 660 carrier.Buzzer.sound(melody[thisNote]); 661 delay(noteDuration); 662 663 int pauseBetweenNotes = noteDuration * 1.0; 664 delay(pauseBetweenNotes); 665 666 carrier.Buzzer.noSound(); 667 } 668} 669 670//------------------------------------------------------------------------------- 671 672//----- eventi e funzioni di sincronizzazione variabili con iOT Cloud ----- 673//------------------------------------------------------------------------------- 674 675 676/* 677 Since Messaggio is READ_WRITE variable, onMessaggioChange() is 678 679 executed every time a new value is received from IoT Cloud. 680*/ 681void onMessaggioChange() 682 { 683 //----- stampa messaggio che arriva dal cloud ----- 684 if (presenza == 685 true) { 686 screenMsg = messaggio; 687 printMsg(); 688 } 689} 690/* 691 Since 692 Durata is READ_WRITE variable, onDurataChange() is 693 executed every time a new 694 value is received from IoT Cloud. 695*/ 696void onDurataChange() { 697 // Add 698 your code here to act upon Durata change 699} 700/* 701 Since Luminosita is READ_WRITE 702 variable, onLuminositaChange() is 703 executed every time a new value is received 704 from IoT Cloud. 705*/ 706void onLuminositaChange() { 707 // Add your code here 708 to act upon Luminosita change 709} 710/* 711 Since Temperatura is READ_WRITE variable, 712 onTemperaturaChange() is 713 executed every time a new value is received from IoT 714 Cloud. 715*/ 716void onTemperaturaChange() { 717 // Add your code here to act 718 upon Temperatura change 719} 720/* 721 Since Umidita is READ_WRITE variable, onUmiditaChange() 722 is 723 executed every time a new value is received from IoT Cloud. 724*/ 725void 726 onUmiditaChange() { 727 // Add your code here to act upon Umidita change 728} 729/* 730 731 Since LivelloLuce is READ_WRITE variable, onLivelloLuceChange() is 732 executed 733 every time a new value is received from IoT Cloud. 734*/ 735void onLivelloLuceChange() 736 { 737 // Add your code here to act upon LivelloLuce change 738} 739/* 740 Since 741 LivelloVentilazione is READ_WRITE variable, onLivelloVentilazioneChange() is 742 743 executed every time a new value is received from IoT Cloud. 744*/ 745void onLivelloVentilazioneChange() 746 { 747 // Add your code here to act upon LivelloVentilazione change 748} 749/* 750 751 Since Automazione is READ_WRITE variable, onAutomazioneChange() is 752 executed 753 every time a new value is received from IoT Cloud. 754*/ 755void onAutomazioneChange() 756 { 757 // Add your code here to act upon Automazione change 758} 759/* 760 Since 761 Chiamata is READ_WRITE variable, onChiamataChange() is 762 executed every time 763 a new value is received from IoT Cloud. 764*/ 765void onChiamataChange() { 766 767 // Add your code here to act upon Chiamata change 768} 769/* 770 Since Luce is 771 READ_WRITE variable, onLuceChange() is 772 executed every time a new value is received 773 from IoT Cloud. 774*/ 775void onLuceChange() { 776 // Add your code here to act 777 upon Luce change 778} 779/* 780 Since Msg1 is READ_WRITE variable, onMsg1Change() 781 is 782 executed every time a new value is received from IoT Cloud. 783*/ 784void 785 onMsg1Change() { 786 //----- stampa messaggio 1 se richiesto dal cloud ----- 787 788 if (presenza == true) { 789 //----- stampa messaggio ----- 790 lastUpdate2 791 = millis(); 792 messaggio = " Benvenuto, premi Chiama se occorre"; 793 screenMsg 794 = messaggio; 795 printMsg(); 796 } 797} 798/* 799 Since Msg2 is READ_WRITE 800 variable, onMsg2Change() is 801 executed every time a new value is received from 802 IoT Cloud. 803*/ 804void onMsg2Change() { 805 //----- stampa messaggio 2 se richiesto 806 dal cloud ----- 807 if (presenza == true) { 808 //----- stampa messaggio ----- 809 810 lastUpdate2 = millis(); 811 messaggio = "Siamo subito da Lei"; 812 screenMsg 813 = messaggio; 814 printMsg(); 815 } 816} 817/* 818 Since Msg3 is READ_WRITE 819 variable, onMsg3Change() is 820 executed every time a new value is received from 821 IoT Cloud. 822*/ 823void onMsg3Change() { 824 //----- stampa messaggio 3 se richiesto 825 dal cloud ----- 826 if (presenza == true) { 827 //----- stampa messaggio ----- 828 829 lastUpdate2 = millis(); 830 messaggio = "La preghiamo di attendere"; 831 832 screenMsg = messaggio; 833 printMsg(); 834 } 835} 836/* 837 Since Occupato 838 is READ_WRITE variable, onOccupatoChange() is 839 executed every time a new value 840 is received from IoT Cloud. 841*/ 842void onOccupatoChange() { 843 // Add your 844 code here to act upon Occupato change 845} 846/* 847 Since Presenza is READ_WRITE 848 variable, onPresenzaChange() is 849 executed every time a new value is received 850 from IoT Cloud. 851*/ 852void onPresenzaChange() { 853 // Add your code here to 854 act upon Presenza change 855} 856/* 857 Since Risposta is READ_WRITE variable, 858 onRispostaChange() is 859 executed every time a new value is received from IoT 860 Cloud. 861*/ 862void onRispostaChange() { 863 //----- risposta alla chiamata se 864 attivata dal cloud ----- 865 if (risposta == true) { 866 if (chiamata == true) 867 { 868 chiamata = false; 869 risposta = false; 870 carrier.leds.setPixelColor(0, 871 noColor); 872 carrier.leds.setPixelColor(1, greenColor); 873 carrier.leds.show(); 874 875 //----- stampa messaggio ----- 876 lastUpdate2 = millis(); 877 messaggio 878 = " Chiamata accolta siamosubito da Lei"; 879 screenMsg = messaggio; 880 881 printMsg(); 882 //----- suona il campanello ----- 883 suonaCampanello(); 884 885 } 886 } 887} 888/* 889 Since Ventilazione is READ_WRITE variable, onVentilazioneChange() 890 is 891 executed every time a new value is received from IoT Cloud. 892*/ 893void 894 onVentilazioneChange() { 895 // Add your code here to act upon Ventilazione change 896} 897 898/* 899 900 Since ChiamateTotaliGiorno is READ_WRITE variable, onChiamateTotaliGiornoChange() 901 is 902 executed every time a new value is received from IoT Cloud. 903*/ 904void 905 onChiamateTotaliGiornoChange() { 906 // Add your code here to act upon ChiamateTotaliGiorno 907 change 908} 909 910/* 911 Since PresenzeTotaliGiorno is READ_WRITE variable, onPresenzeTotaliGiornoChange() 912 is 913 executed every time a new value is received from IoT Cloud. 914*/ 915void 916 onPresenzeTotaliGiornoChange() { 917 // Add your code here to act upon PresenzeTotaliGiorno 918 change 919} 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942
Smart_Fitting_Room_1_feb13a.zip
arduino
Arduino Zip file with complete project
1inary file (no preview
Downloadable files
Assembly
Assembly
Schematic
Schematic
Pinout MKR IOT Carrier
Pinout MKR IOT Carrier
Pinout MKR IOT Carrier
Pinout MKR IOT Carrier
Schematic
Schematic
Assembly
Assembly
Comments
Only logged in users can leave comments