Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

Surveillance de l'environnement Arduino

Composants et fournitures

Arduino MKR1000
× 1
Clic sur l'environnement MikroE
× 1

Outils et machines nécessaires

Câbles de raccordement Adafruit Femelle/Femelle

Applications et services en ligne

Arduino IDE
WolkAbout IoT Platform

À propos de ce projet

Présentation

Nous avions des capteurs de clic d'environnement à portée de main, nous avons donc décidé de les connecter à l'Arduino MKR1000 et de les visualiser sur la plate-forme WolkAbout IoT. L'idée était de faire une mesure toutes les minutes et de publier les résultats toutes les 15 minutes. Si la publication des lectures des capteurs échoue (en raison d'un réseau occupé ou d'un autre problème), les résultats doivent être conservés dans la mémoire Flash de l'appareil. Avec un maximum potentiel de 96 écritures par jour, nous minimisons les chances de mettre la mémoire Flash dans un mauvais état (Arduino garantit 10 000 cycles d'écriture).

Configuration matérielle

Le capteur de clic de l'environnement est connecté aux broches de communication I2C (à savoir 11 et 12 sur le MKR1000), Vcc et à la terre.

Configuration du logiciel

Nous avons utilisé quelques bibliothèques pour rendre ce projet possible, qui peuvent toutes être installées à partir du gestionnaire de bibliothèque d'Arduino IDE, ou en téléchargeant les archives.zip à partir des référentiels GitHub répertoriés dans les pièces jointes, puis en les ajoutant à Arduino IDE. Les bibliothèques requises sont :

  • WiFi101
  • Pilote de capteur unifié Adafruit
  • Bibliothèque Adafruit BME680
  • RTCZero
  • Stockage Flash
  • WolkConnect

Une fois toutes les bibliothèques requises installées, continuez et copiez le contenu de Surveillance de l'environnement croquis des pièces jointes dans Arduino IDE.

Il implémente une structure de tampon circulaire et l'utilise pour stocker les résultats de mesure. Il existe également une implémentation de la façon de stocker cette structure dans la mémoire Flash à l'aide de la bibliothèque FlashStorage. La lecture et la publication chronométrées des données sont réalisées en utilisant la bibliothèque RTCZero. Initialement, après la connexion au WiFi, nous envoyons un ping à la plate-forme WolkAbout IoT pour obtenir l'époque actuelle qui sera introduite dans la bibliothèque RTC afin que les lectures du capteur puissent être correctement horodatées.

Une interruption d'alarme change les indicateurs pour les tâches qui doivent être effectuées (lecture et publication) et le reste du travail est géré dans la fonction de boucle. Ici, nous vérifions si nous devons lire ou publier. Pour une consommation d'énergie minimale, le WiFi est configuré pour être en mode basse consommation ainsi que le MKR1000. Le capteur sur le clic de l'environnement passe automatiquement à faible puissance jusqu'à ce qu'une lecture soit demandée.

Les modifications qui doivent être apportées au croquis incluent la saisie des informations d'identification WiFi aux lignes 33 et 34 :

const char* ssid ="<*YOUR SSID*>";
const char* wifi_pass ="<*YOUR WIFI PASSWORD*>";

ainsi que la saisie des informations d'identification de l'appareil à partir de la plate-forme WolkAbout IoT.

Pour obtenir ces informations d'identification, vous devez d'abord créer un appareil en utilisant un type d'appareil.

Le type d'appareil pour ce projet, Environment click-deviceType.json, est disponible dans les pièces jointes du projet, alors créez-en une copie. Connectez-vous ou créez votre compte sur la plateforme WolkAbout IoT et ouvrez l'Appareil Gestion candidature.

Sélectionnez le Appareil Tapez Gestion puis appuyez sur + signez et sélectionnez Télécharger option, en accédant à votre copie locale du type d'appareil.

Maintenant qu'un type d'appareil est disponible, vous pouvez créer un appareil à partir de celui-ci en cliquant sur Créer appareil .

Ici, vous devez donner un nom à votre appareil, définir le Type de connectivité à MQTT et cochez la case Créer par défaut Sémantique (nécessaire pour créer des widgets sur votre tableau de bord plus tard).

Appuyez sur Enregistrer et le formulaire avec les informations d'identification de l'appareil s'affichera. Stockez ces informations comme vous le souhaitez, puis entrez-les dans votre croquis dans Arduino IDE :

const char *device_key ="device_key";
const char *device_password ="device_password";

Vous pouvez maintenant aller de l'avant, vérifier et télécharger ce croquis sur votre tableau, mais vous devez toujours créer un moyen d'afficher les données du capteur reçues.

Pour afficher ces données, passez en Visualisation et Surveillance section sur la plate-forme WolkAbout IoT et créez un nouveau tableau de bord en appuyant sur + Ajouter un tableau de bord et en saisissant un nom pour le tableau de bord et en définissant la portée sur quel que soit le nom de l'appareil. Ensuite, vous pouvez commencer à ajouter des widgets à votre tableau de bord en appuyant sur Ajouter widget.

Sélectionnez Tendance

puis sélectionnez Température depuis votre appareil.

Répétez le processus pour la Pression et Humidité . Créez un autre widget du type Lecture, sélectionnez Altitude et créez un autre widget de carte pour Gaz Résistance . Vous pouvez réorganiser les widgets à votre guise.

Après avoir ajouté des widgets pour l'ensemble de la lecture de capteur individuel que vous attendez de votre appareil, le tableau de bord suivant sera prêt à recevoir les données de votre appareil.

Alors, allez-y, déployez l'appareil dans l'environnement que vous avez choisi et surveillez les conditions à distance.

Conclusion

En connectant Arduino MKR1000 et Environment Click à la plate-forme WolkAbout IoT, vous avez créé un moyen écoénergétique de signaler les conditions environnementales de l'endroit que vous souhaitez surveiller à distance. Cette solution peut être étendue grâce à l'utilisation du moteur de règles de WolkAbout IoT Platform, qui vous permet de recevoir différents types de notifications si une certaine valeur dépasse un seuil que vous avez défini.

Pour plus d'informations sur le moteur de règles et les autres fonctionnalités de WolkAbout IoT Platform, vous pouvez visiter notre page Guides de l'utilisateur.

Code

  • Esquisse de surveillance de l'environnement
  • Environnement click-deviceType.json
Esquisse de surveillance de l'environnementArduino
Importez cette esquisse dans Arduino IDE et modifiez les informations d'identification WiFi et les informations d'identification de l'appareil
#include #include #include #include #include #include #include #include "WolkConn.h"#include "MQTTClient.h"/*Nombre de messages sortants_t à stocker*/#define STORAGE_SIZE 32#define SEALEVELPRESSURE_HPA (1013.25)/ *Tampon circulaire pour stocker les messages sortants à persister*/typedef struct{ boolean valid ; outbound_message_t outbound_messages[STORAGE_SIZE] ; uint32_t tête ; queue uint32_t ; booléen vide ; boolean full;} Messages;static Messages data;/*Détails de la connexion*/const char* ssid ="ssid";const char* wifi_pass ="wifi_pass";const char *device_key ="device_key";const char *device_password ="device_password ";const char* hostname ="api-demo.wolkabout.com";int portno =1883;WiFiClient espClient;PubSubClient client(espClient);/* WolkConnect-Arduino Connector context */static wolk_ctx_t wolk;/* Init flash storage * /FlashStorage(flash_store, Messages);/*Init i2c sensor communication*/Adafruit_BME680 bme;RTCZero rtc;bool read;/*Lire le capteur toutes les minutes. Si vous modifiez ce paramètre, assurez-vous qu'il est <60*/const byte readEvery =1;bool publish;/*Publish toutes les 10 minutes. Si vous modifiez ce paramètre, assurez-vous qu'il est <60*/const byte publishEvery =10;byte publishMin;/*Stockage Flash et implémentation de la persistance personnalisée*/void _flash_store(){ data.valid =true; flash_store.write(data);}void grow_pointer(uint32_t* pointeur){ if ((*pointer) ==(STORAGE_SIZE - 1)) { (*pointer) =0 ; } else { (*pointeur)++; }}void _init(){ data =flash_store.read(); if (data.valid ==false) { data.head =0; données.tail =0 ; data.empty =vrai; data.full =faux ; }}bool _push(outbound_message_t* outbound_message){ if(data.full) {growth_pointer(&data.head); } memcpy(&data.outbound_messages[data.tail], outbound_message, sizeof(outbound_message_t)); augmenter_pointer(&data.tail); data.empty =false; data.full =(data.tail ==data.head); return true;}bool _peek(outbound_message_t* outbound_message){ memcpy(outbound_message, &data.outbound_messages[data.head], sizeof(outbound_message_t)); return true;}bool _pop(outbound_message_t* outbound_message){ memcpy(outbound_message, &data.outbound_messages[data.head], sizeof(outbound_message_t)); augmenter_pointer(&data.head); data.full =faux ; data.empty =(data.tail ==data.head); return true;}bool _is_empty(){ return data.empty;}void init_wifi(){ if ( WiFi.status() !=WL_CONNECTED) { while (WiFi.begin(ssid, wifi_pass) !=WL_CONNECTED) { delay(1000 ); } }} void setup_wifi() { delay(10); if ( WiFi.status() !=WL_CONNECTED) { int numAttempts =0; while (WiFi.begin(ssid, wifi_pass) !=WL_CONNECTED) { numAttempts++ ; if(numAttempts ==10){ Serial.println("Impossible d'atteindre le WiFi !"); Pause; } délai(1000); } }} void setup() { pinMode(LED_BUILTIN, OUTPUT); digitalWrite(LED_BUILTIN, BAS); /*Initialise la structure de tampon circulaire*/ _init(); init_wifi(); wolk_init(&wolk, NULL, NULL, NULL, NULL, device_key, device_password, &client, hostname, portno, PROTOCOL_JSON_SINGLE, NULL, NULL); wolk_init_custom_persistence(&wolk, _push, _peek, _pop, _is_empty); /*La LED intégrée s'allumera si quelque chose ne va pas*/ if(!bme.begin()) { digitalWrite(LED_BUILTIN, HIGH); } /*Init du capteur*/ bme.setTemperatureOversampling(BME680_OS_8X); bme.setHumidityOversampling(BME680_OS_2X); bme.setPressureOversampling(BME680_OS_4X); bme.setIIRFilterSize(BME680_FILTER_SIZE_3) ; bme.setGasHeater(320, 150); // 320*C pour un délai de 150 ms (200); lire =vrai; publier =vrai; /*Obtenir l'époque actuelle du serveur*/ wolk_connect(&wolk); retard (100); wolk_update_epoch(&wolk); while (!(wolk.pong_received)) { wolk_process(&wolk); digitalWrite(LED_BUILTIN, HAUT); retard(1000); } digitalWrite(LED_BUILTIN, LOW); wolk_disconnect(&wolk); rtc.begin(); rtc.setEpoch(wolk.epoch_time); rtc.setAlarmTime(rtc.getHours(), (rtc.getMinutes() + readEvery) % 60, rtc.getSeconds()); rtc.enableAlarm(rtc.MATCH_MMSS); rtc.attachInterrupt(alarmMatch); publierMin =(rtc.getMinutes() + publierChaque) % 60 ; WiFi.lowPowerMode();}void loop() { /*Afin de garder la routine d'interruption aussi courte que possible, la routine ne définit que les tâches à effectuer read =true signifie que la lecture du capteur doit être effectuée publier =true signifie que le les lectures doivent être publiées sur la plate-forme ou conservées dans la mémoire flash si la connexion n'est pas disponible */ if(read) { read =false; if (!bme.performReading()) { digitalWrite(LED_BUILTIN, HIGH); } wolk_add_numeric_sensor_reading(&wolk, "T", bme.temperature, rtc.getEpoch()); wolk_add_numeric_sensor_reading(&wolk, "H", bme.humidité, rtc.getEpoch()); wolk_add_numeric_sensor_reading(&wolk, "P", bme.pressure / 100.0, rtc.getEpoch()); wolk_add_numeric_sensor_reading(&wolk, "GR", bme.gas_resistance, rtc.getEpoch()); wolk_add_numeric_sensor_reading(&wolk, "A", bme.readAltitude(SEALEVELPRESSURE_HPA), rtc.getEpoch()); /*définir une nouvelle alarme*/ int alarmMin =(rtc.getMinutes() + readEvery) % 60; rtc.setAlarmMinutes(alarmMin); retard (100); } if(publier) { publier =false; setup_wifi(); wolk_connect(&wolk); if(!wolk.is_connected) { _flash_store(); } retard (100); if(wolk_publish(&wolk) ==W_TRUE) { _flash_store(); } /*définir une nouvelle heure de publication*/ publishMin =(rtc.getMinutes() + publishEvery) % 60 ; retard (100); wolk_disconnect(&wolk); retard (100); } retard (100); }/*Routine d'interruption temporisée*/void alarmMatch(){ read =true; if(publishMin ==rtc.getMinutes()) { publier =true; }}
Environnement click-deviceType.jsonJSON
Type d'appareil utilisé pour créer un appareil sur la plate-forme WolkAbout IoT
[ { "name":"Environment click", "description":"Type d'appareil pour le capteur BME680 sur la carte de MikroElektronika Environment Click", "guid":" def68ff6-63c5-4f9c-a066-bcc944b7bd2d", "deviceType":"STANDARD", "protocol":"JSON", "connectivityType":null, "firmwareUpdateType":null, "feeds":[ { "name":" Température", "description":null, "reference":"T", "unit":{ "name":"CELSIUS", "guid":"7c805d10-a879-11e9-83cd-0a0027000005" } }, { " name":"Humidity", "description":null, "reference":"H", "unit":{ "name":"HUMIDITY_PERCENT", "guid":"7c8080a3-a879-11e9-83cd-0a0027000005" } }, { "name":"Pressure", "description":null, "reference":"P", "unit":{ "name":"MILLIBAR", "guid":"7c807980-a879-11e9-83cd -0a0027000005" } }, { "name":"Gas Resistance", "description":null, "reference":"GR", "unit":{ "name":"OHM", "guid":"7c805890- a879-11e9-83cd-0a0027000005" } }, { "nom":"Altitude", "description":null, "référence e":"A", "unit":{ "name":"METRE", "guid":"7c805a59-a879-11e9-83cd-0a0027000005" } } ], "actuators":[], "alarms":[], "configs":[], "attributes":[ { "name":"CONNECTIVITY_TYPE", "dataType":"ENUM", "validationRegex":"^(MQTT|HTTP)$", "options":[ "MQTT", "HTTP" ], "defaultValue":"MQTT", "required":true, "readOnly":true }, { "name":"FIRMWARE_UPDATE_ENABLED", "dataType":"BOOLEAN", "validationRegex ":"^(true|false)$", "options":null, "defaultValue":null, "required":false, "readOnly":true }, { "name":"FIRMWARE_VERSION", "dataType":"STRING", "validationRegex":null, "options":null, "defaultValue":null, "required":false, "readOnly":true }, { "name":"FILE_DIRECT_DOWNLOAD_ENABLED", "dataType":"BOOLEEN ", "validationRegex":"^(true|false)$", "options":null, "defaultValue":null, "required":false, "readOnly":true }, { "name":"FILE_URL_DOWNLOAD_ENABLED", "dataType":"BOOLEEN", "validationRegex":"^(true|false)$", "options":null, "defaultValue":null, "required":false, " readOnly":true } ] }]
WolkAbout sur la surveillance de l'environnement
Ce référentiel contient l'esquisse Arduino utilisée dans ce projethttps://github.com/Wolkabout/Wolk-Arduino-Environment-Monitoring
Bouclier Arduino WiFi 101
Bibliothèque Wifi pour le bouclier Arduino WiFi 101https://github.com/arduino-libraries/WiFi101
Pilote de capteur unifié Adafruit
Bibliothèque de capteurs unifiée requise pour tous les capteurshttps://github.com/adafruit/Adafruit_Sensor
Bibliothèque Adafruit BME680
Bibliothèque utilisée pour l'environnement cliquez pour obtenir les lectures des capteurshttps://github.com/adafruit/Adafruit_BME680
Bibliothèque RTC pour Arduino
Bibliothèque RTC pour les cartes basées sur SAMD21 https://github.com/arduino-libraries/RTCZero
Bibliothèque FlashStorage pour Arduino
Un moyen pratique de stocker des données dans la mémoire Flash sur l'ATSAMD21https://github.com/cmaglie/FlashStorage
WolkConnect-Arduino
Bibliothèque Arduino qui fournit une connectivité facile à la plate-forme WolkAbout IoT.https://github.com/Wolkabout/WolkConnect-Arduino

Schémas


Processus de fabrication

  1. Arduino Spybot
  2. Surveillance du CO2 avec le capteur K30
  3. FlickMote
  4. Téléviseur maison B-Gone
  5. horloge maîtresse
  6. Trouvez-moi
  7. Puissance Arduino
  8. Tech-TicTacToe
  9. Arduino quadrupède