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

Machine à café intelligente avec Arduino et Bluetooth

Composants et fournitures

Arduino Nano R3
× 1
Module Bluetooth HC-05
× 1
Capteur de température HARDWARIO DS18B20 1m
× 1

Applications et services en ligne

Terminal Bluetooth série créé par Kai Morich
Arduino IDE

À propos de ce projet

Présentation

Cafetière automatique intelligente avec graphique, peut être contrôlée via Bluetooth... ou simplement charger de l'eau fraîche, et le système démarrera automatiquement !

Chaque pièce est faite à la main et toutes les fonctions sont mes propres idées.

J'ai également codé le "Mode de test" afin que le contrôleur puisse être utilisé comme thermomètre polyvalent avec capteur de température externe.

Développé sur Arduino Nano / Uno, utilise l'affichage ST7920 , HC-05 Bluetooth adaptateur, Dallas DS18B20 capteur de température , relais pour contrôler la bobine de chauffage, bouton avec leds, buzzer et un compteur de décennie CD4017BE pilote la barre de LED.

Comment commencer

  • Démarrage automatique :en mode veille, le système mesure cycliquement la température en arrière-plan. Le chargement d'eau douce fait chuter la température , et le système démarrera.
    Cette fonction peut être activée/désactivée en envoyant "auto" depuis le smartphone, et le réglage sera stocké dans la mémoire EEPROM.
  • Appuyez sur le bouton :pour démarrer / interrompre la préparation du café, ou quitter le Mode Test.
  • Envoyer un message "démarrer" depuis votre smartphone, ou "stop ".

Vidéo

Affiche toutes les méthodes de travail.

Comment ça a été fait, à quoi ça ressemble... il suffit de cliquer/taper ci-dessous !

Analyse unique pendant la préparation du café

Après 60 secondes à compter du démarrage, le MCU compare les valeurs de température initiale et actuelle stockées afin de tirer des conclusions basées uniquement sur la température et le temps écoulé, qui peuvent être :

  • "Vous avez oublié l'eau. " - (la température est devenue trop élevée)
  • "Café pour deux. " - (moins d'eau - plus d'élévation de température)
  • "Café pour six. " - (plus d'eau - moins d'élévation de température)
  • "Erreur du serpentin de chauffage ! " - (pas d'élévation de température significative)

En plus de la détection d'erreur de capteur fonctionne en continu tant que la machine à café est allumée.

Comme on peut le voir, six doses d'eau ont nécessité plus de temps pour atteindre la même température que la petite dose a atteint beaucoup plus tôt.

Le démarrage sans eau entraîne une température très élevée, mais la ligne plate indique une température inchangée, donc une erreur de serpentin de chauffage.

Modification de l'unité de mesure

L'unité de mesure peut être modifiée en envoyant "c " ou "f " depuis le Smartphone, même pendant une procédure de préparation de café, et cela ne laisse aucune trace sur le graphique .

Les valeurs de température initiales et précédentes enregistrées seront converties par un appel de fonction de programme que j'ai codé - utilisé pour les statistiques et l'analyse. Ce paramètre est également stocké dans la mémoire EEPROM.

Éléments d'écran dynamiques

Si l'écran est plein, le graphique commence à défiler vers la gauche.

Selon la valeur mesurée, certains éléments de l'écran peuvent se trouver sur son chemin. Pour éviter les collisions, leurs emplacements sont dynamiques.

Ces six petites images animées montre ce que j'ai codé :

Eh bien, c'était un passe-temps agréable :

Mode test

Au moment où j'ai créé tout cela, l'idée est venue, pourquoi ne pas utiliser le graphique à d'autres fins ?

J'ai donc codé le Mode Test; fixez simplement un capteur de température externe et le système peut être utilisé comme un thermomètre polyvalent avec graphique.

De cette manière, les valeurs extrêmes du graphique sont -20°C (-4°F) et +128°C (+262°F) .

Envoi de numéros depuis le Smartphone entre 1 et 999999 sera accepté comme intervalle de mesure en secondes, la largeur du graphique est donc comprise entre 128 secondes et 11,57 jours .

Communication Bluetooth

Accepte les commandes et envoie des rapports, détecte si un smartphone se connecte ou se déconnecte.

Les messages envoyés sont en bleu et les messages de réponse/rapport sont en vert envoyés par la cafetière.

Contrôle LED

Un compteur à décades CD4027BE entraîne la barre LED, reçoit le CLK du MCU à chaque mesure de température et augmente la position. Si une nouvelle procédure de préparation du café ou le mode Test démarre, l'Atmega 328P envoie un signal RST pour définir la position par défaut.

Le bouton a une LED bicolore avec seulement deux broches, donc ma solution simple et amusante peut être vue dans le code, comment la contrôler.

  • Vert uni :veille ou le café est prêt, la bobine est éteinte
  • Rouge uni :préparation du café en cours, la batterie chauffante est allumée
  • Rouge / Vert à tour de rôle :Mode test
  • Rouge clignotant :une erreur s'est produite, cela peut être
    -Erreur de capteur,
    -Erreur de serpentin de chauffage, ou
    -Vous avez oublié l'eau, la procédure de préparation du café a donc été interrompue par le système

Code

  • Machine à café intelligente - Ősi Gyula
Machine à café intelligente - Ősi GyulaArduino
// Code de programme - Cafetière intelligente. Développé sur Arduino Nano, utilise un écran ST7920, un adaptateur Bluetooth HC-05, // capteur de température Dallas DS18B20, relais, bouton, leds, buzzer et un compteur de décennie CD4017BE. // // Peut être contrôlé via Bluetooth en envoyant des commandes et des paramètres de fonctionnement ou en utilisant le bouton... ou simplement charger de l'eau douce ! //// Fonctions:// -Graph :graphique dynamique de la température à l'écran // - Autostart :le chargement d'eau douce provoque une chute de température et le système démarre // Ceci fonction peut être activée / désactivée en envoyant "Auto", et le réglage sera stocké dans la mémoire EEPROM// -Analyse pendant la préparation du café :60 secondes après le démarrage, le système compare les valeurs de température actuelle et initiale// et tire des conclusions qui peuvent be:// 1. Vous avez oublié l'eau (la température est trop élevée) // 2. Café pour deux (moins d'eau - plus d'élévation de température) // 3. Café pour six (plus d'eau - moins d'élévation de température) // 4. Erreur de serpentin de chauffage (pas d'élévation de température significative depuis le début)// -Détection d'erreur de capteur (obtention de valeurs anormales)// -C elsius ou Fahrenheit fonctionnant :peut être commuté en envoyant C ou F depuis le smartphone, même pendant une procédure de préparation de café.// Les valeurs de température initiales et précédentes seront converties utilisées pour les statistiques et l'analyse.// Ce réglage est stocké dans la mémoire EEPROM .// -Mode test :en connectant un capteur de température externe, le système peut être utilisé comme un thermomètre polyvalent.// Dans ce mode, l'intervalle du graphique est compris entre -20C / -4F et +128C / +262F.// Envoi de valeurs numériques entre 1 et 999999 sera accepté comme intervalle de mesure en secondes, donc // la largeur du graphique peut être comprise entre 128 secondes et 11,57 jours.// -Communication Bluetooth :accepte les commandes et envoie des rapports, détecte si un smartphone se connecte ou se déconnecte// - Contrôle de la barre LED :le MCU contrôle un compteur de décennie CD4027BE, et la barre LED s'activera à tous les cycles de mesure de la température// ------------------------- -------------------------------------------------- -------------------------------------------------- ---// // conçu, construit t et programmé // par Gyula Osi//// Tous droits réservés.// ---- Affichage #include "U8glib.h"//U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE); // Affichage OLED Bus I2C, SDA(TX) A4, SCL(RX) A5U8GLIB_ST7920_128X64 u8g(11, 10, 9, U8G_PIN_NONE); // afficher le constructeur PIN6-D11, PIN5-D10, PIN4-D9byte frame =0; // démarrer le pointeur du logo // ---- Ports et périphériques contrôlés// led rouge sur A0 // led grn sur A1const int bright[2] ={0, 500};const byte buzzer =3;const byte cd4017beCLK =4; // contrôle CD4017BE décennie counterconst byte cd4017beRST =5;const byte btn =13;const byte relay =12;// ---- System Strings#define strSize 3String str[strSize]; // événements système et rapports printout#define reportSize 5const String reportStr[reportSize] ={"Starting...", "Going standby soon...", "Stopped.", " *** TEST MODE ***", "Mode normal."};//#define standbySize 5//const String standbyStr[standbySize] ={"Press key", ">", "or", "send", "start"};const String autostartStr[2 ] ={"Autostart off.", "Autostart on."};// ---- Structure du tableau d'indicateurs binaires d'état du système #define flagElements 6bool binFlags[flagElements] ={0, 1, 1, 0, 0, 0 } ; // ---- éléments [i] but init/standby mode val // 0 coché 0 // 1 terminé 1 // 2 standby 1 // 3 standby msg envoyé 0 // 4 erreur bobine/capteur 0 // 5 test mode 0// ---- Mesure de la température et fonctionnalités associées#include "OneWire.h" #include "DallasTemperature.h"#define DS18B20 2 // configurer le bus OneWire sur D2OneWire temprWire(DS18B20); // configuration du DS18B20 pour qu'il fonctionne sur les capteurs de température du bus OneWireDallas(&temprWire);float tempr; // valeur mesuréefloat temprInit; // copie de la valeur mesurée pour une comparaison uniquefloat temprPrev; // copie de la valeur mesurée pour la comparaison cyclique#define mUnit 2float temprBottomLim[mUnit] ={ 0, 26}; // démarrage automatique sous tempr of AND analyse unique sous tempr ofconst char unit[mUnit] ={'F', 'C'};const String unitStr[mUnit] ={"Fahrenheit mode.", "Celsius mode."};float trendSens[mUnit] ={ 0, 0,1} ; // +/- plage (F/C) qui sera évaluée comme température constante // *** Les valeurs de référence Fahrenheit seront calculées au démarrage!bool trend[2] ={1, 0}; // décrit les tendances de température comme ci-dessous // ---- elements [i] purpose // 0 change // 1 tendance #define checkSize 7const String checkStr[checkSize] ={"Eau détectée !", "Erreur de la bobine de chauffage !", "Café pour six", "Café pour deux", "Vous avez oublié l'eau !", "Erreur du capteur !", "Votre café est prêt."};float temprCheck[mUnit][checkSize] ={{ }, {- 0,15, 5, 17, 28, 60, -127, 110}} ; // |<-- REL -->|<--CONST-->| // [j] F / C // ----------------------------------------- ----- // ---- éléments [i] utilisés comme // 0 valeur rel de démarrage automatique // 1 valeur rel de détection d'erreur de bobine // 2 eau pour six valeurs rel // 3 eau pour deux valeurs rel // 4 pas de valeur rel de détection d'eau // 5 pas de signal sur D2 référence const // 6 point d'ébullition référence const// ---- Déclarations et variables graphiques#define posYsize 128byte posY[posYsize];byte pointer =0;#define refrElements 42float temprRefr[refrElements];#define rangeElements 2 // min / max#define mode 2 // mode normal / testfloat graphRange[mUnit][mode][rangeElements] ={{{ }, { }}, {{24, 127.938889 + 2}, {-20, graphRange[1][0][1]}}} ; // [k] 0 1 0 1 // [j] | 0 | 1 // ---- éléments [i] | | | | // 0 minFnorm maxFnorm minFtest maxFtest // 1 minCnorm maxCnorm minCtest maxCtestfloat graphDiff[mUnit][mode]; // pas verticaux par température// ---- Minuteurs système, contrôle et analyse#include elapsedMillis timer0; // Minuterie PWM 8 bits, utilisée par la fonction elapsedMillis() unsigned long tmrPrev =0; // le temps écoulé sera le précédent lorsque l'intervalle est upbool cyclic =0;const long tmrInt[5] ={500, 2000, 60000, 640000, 800000}; // ---- éléments [i] but // 0 intervalle de mesure (mode test), led ctrl // 1 intervalle de mesure (mode normal) // 2 analyses uniques (mode normal, pendant la préparation du café) / analyses cycliques ( mode veille) // 3 envoi de msg veille (mode normal, après la préparation du café) // 4 veille du système (mode normal, après la préparation du café) long copyof_tmrInt0 =tmrInt[0]; const String tmrInt0Str ="Intervalle modifié."; // ---- Configuration de la communication sérieconst byte btState =6;bool conn =0;const String connStr[2] ={"Connexion perdue.", "Smartphone connecté."};#include const int RX1 =7;const int TX1 =8;SoftwareSerial sUART(RX1,TX1) ; #define exRXSize 6car exRX[exRXSize] ; // variable pour recevoir les données du port série// ---- Gestion de la mémoire#include #define occBytes 2const byte addr[occBytes] ={ 0, 1};bool sysSettings[occBytes]; // ---- Carte mémoire addr[i] | données | description | valeur stockée // ----------------------------------------------- ------- // 0 | booléen | démarrage automatique | 0 :pas de démarrage automatique, 1 :démarrage automatique // 1 | booléen | unité de mesure | 0 :Fahrenheit, 1 :Celsius// ---- Terminators &The Cleanup Crewconst char termCharSpc =' ';const String termStr;const byte termByte =0;const bool termBool =0;const uint8_t frame0[] U8G_PROGMEM ={ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0,xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0,xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0,xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0xFC, 0xFF, 0x7F, 0xF0, 0x3F, 0x00, FF, 0xFE, 0x00, 0xFE 0xFF, 0x07, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0xFC, 0xFF, 0x7F, 0xF0, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0xFF, 0FF, 0x1F, 0xFF 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0xFF , 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0xFF, 0x1F, 0xFF, 0xF1, 0xFF, 0xFF, 0xFF, 0x8F, 0xFF, 0x1F, 0x7F, 0x8C, 0x3F, 0x1E, 0xFF, 0x00, 0xFE , 0x00, 0x18, 0xC0, 0x8F, 0xFF, 0x1F, 0x7F, 0x8C, 0x3F, 0x1E, 0xFF, 0x00, 0xFE, 0x1F, 0xFF, 0xF1, 0x00, 0x18, 0xC0, 0x8F, 0F, 0xFF, 0xE , 0x1E, 0xFF, 0xFF, 0xF8, 0x1F, 0xFF, 0x31, 0xFE, 0x7F, 0xFC, 0x8F, 0xFF, 0x1F, 0x1F, 0x0C, 0x3E, 0x1E, 0xFF, 0xFF, 0xF, 0x1, 0x1xFE , 0xFC, 0x0F, 0x0E, 0x18, 0x1F, 0x0C, 0x3E, 0x1E, 0xFC, 0x00, 0xF8, 0x1F, 0x7C, 0x30, 0xFE, 0x7F, 0xF0, 0x0F, 0x0E, 0F,x18, 0xE, 0x , 0x00, 0xF8, 0x1F, 0x7C, 0x30, 0xFE, 0x7F, 0xF0, 0x0F, 0xFE, 0x18, 0x1F, 0x0C, 0x3E, 0x1E, 0x3C, 0x3E, 0xF8, 0x1F, 0x0,F0x, 0x0x, 0x7C , 0xFE, 0x18, 0x1F, 0x0C, 0x3E, 0x1E, 0x3C, 0x3E, 0xF8, 0x1F, 0x7C, 0xF0, 0x00, 0x7E, 0xF0, 0x0F, 0xFE, 0x18, 0x1F, 0x1E,F3 , 0x1F, 0x7C, 0xF0, 0x3F, 0x78, 0xF0, 0x0F, 0xFE, 0x18, 0x1F, 0x0C, 0x3E, 0x1E, 0x3C, 0x3E, 0xF8, 0x1F, 0x7C, 0xF0, 0x3F, 0x78, 0xF0, 0x0F, 0xFE, 0x18, 0x1F, 0x0C, 0x3E, 0x1E, 0x3C, 0x3E, 0xF8, 0x1F, 0x3F,F0x0 0xFE, 0x18, 0x1F, 0x0C, 0x3E, 0x1E, 0x3C, 0x3E, 0xF8, 0x1F, 0x7C, 0xF0, 0x3F, 0x78, 0xF0, 0x3F, 0x00, 0x7E, 0x00, 0x0,3C, 0x0, 0x0,3C, 0x0 0x7F, 0x00, 0x3C, 0x00, 0x1E, 0xC0, 0x3F, 0x00, 0x7E, 0x00, 0x3C, 0x80, 0x07, 0xF0, 0x00, 0xF8, 0x7F, 0x00, 0x3C, 0x00, 0x, 0x1E, 0x1F, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x00 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0,xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x FF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0,xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0,xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0,xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 , 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,00 0x , 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,00 0x , 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,00 0x , 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0,06, 0x , 0x06, 0xC6, 0x7F, 0xFE, 0xE7, 0x3F, 0x7E, 0xFE, 0xC7, 0x7F, 0x00, 0x00, 0x30, 0x06, 0x66, 0x60, 0x06, 0x66, 0x00, 0x60, 0x60, 30, 0x60 , 0x00, 0x00, 0x00, 0x30, 0x06, 0x66, 0x60, 0x06, 0x66, 0x00, 0x60, 0x60, 0x60, 0x30, 0x06, 0x60, 0x00, 0x00, 0x00, 0x30, 0x1E, 0x66, 0x60, 066 , 0x00, 0x60, 0x60, 0x60, 0x30, 0x06, 0x60, 0x00, 0x00, 0x00, 0x30, 0x3E, 0x66, 0x60, 0 x06, 0x66, 0x00, 0x60, 0x60, 0x60, 0x30, 0x06, 0x60, 0x00, 0x00, 0x00, 0x3C, 0x7E, 0xE6, 0x61, 0x1E, 0xC7, 0x3F, 0x70, 0xE0, 0x3F, 0xFE, 0x 0x3F, 0x00, 0x00, 0x3C, 0x7E, 0xE6, 0x61, 0x1E, 0xC7, 0x3F, 0x70, 0xE0, 0x3F, 0x3C, 0xFE, 0xC3, 0x3F, 0x00, 0x00, 0x3C, 0x, 0x07, 0xE1,E, 0xDE, 0xE 0x70, 0x70, 0xE0, 0x1D, 0x3C, 0x1E, 0x00, 0x70, 0x00, 0x00, 0x3C, 0x1E, 0xE7, 0x61, 0x1E, 0x07, 0x70, 0x70, 0xE0, 0x31, 0x3C, 0x, 0x 0x00, 0x3C, 0x1E, 0xE6, 0x61, 0x1E, 0x07, 0x70, 0x70, 0xE0, 0x61, 0x3C, 0x1E, 0x00, 0x70, 0x00, 0x00, 0x3C, 0x1E, 0xE6, 0x1E, 0x70, 0x07 0xE0, 0x61, 0x3C, 0x1E, 0x00, 0x70, 0x00, 0x00, 0x7F, 0x1E, 0xE6, 0x3F, 0xFC, 0xE3, 0x3F, 0x70, 0xE0, 0x61, 0x7E, 0xFE, 0x, 0xE7, 0x, 0x 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0 0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0,x00, 0x00 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, };const uint8_t frame ={ 0xF8, // 11111000 00 0x21, // 00100001 01 0x22, // 00100010 02 0x24, // 00100100 03 0x08, // 00001000 04 0x10, // 00010000 05 0x24, // 00100100 06 0x44, // 01000100 07 0x0F, // 00001111 08 0x04, // 00000100 09 0x04, // 00000100 10 0x03, // 00000011 11};const uint8_t frame2[] PROGMEM ={ 0x08, // 00001000 00 0x1C, // 00011100 01 0x3E, // 00111110 02 0x7F, // 01111111 03};const uint8_t frame3[] PROGMEM ={ 0x7F, // 01111111 00 0x3E, // 00111110 01 0x1C, // 00011100 02 0x08, // 00001000 03 };void setup() { u8g .commencer(); fillArrays(); pinMode(cd4017beCLK, SORTIE); pinMode(cd4017beRST, SORTIE); CD4017BE(0) ; // envoyer RESET à l'IC du compteur de décades pinMode(btState, INPUT); pinMode(btn, INPUT); pinMode(relais, SORTIE); sUART.begin(9600); mémo(2) ; // charge les paramètres système à partir de l'EEPROM sensor.begin(); // démarrer DS18B20 temprMeas(); temprInit =tempr; graphique(2) ; // init graph ledHandler(0);}void loop() { sysControl(); checkBtn(); checkConn(); RX(); u8g.premièrePage(); faire { dessiner(); } while(u8g.page suivante()); if (frame ==0) { delay(3000); cadre =1 ; scrClr(); }} // ---- Gestion de la mémoire // appel param // 2:lecture au démarrage // 0, 1:écriture à la bonne adresse // void memo(byte op) { switch(op) { case 2:for (octet i =0; i tmrInt[2]) &&(!binFlags[5])) { if (binFlags[2]) { temprMeas(); if ((tempr - temprInit <=temprCheck[sysSettings[1]][0]) &&(tempr =temprCheck[sysSettings[1]][6]) &&(!binFlags[1])) { // check boiling point coil(0); strSelector(0, 6); } if ((timer0> tmrInt[3]) &&(!binFlags[2]) &&(!binFlags[3])) { // going standby msg AND a second security check strSelector(1, 1); binFlags[3] =1; if (!binFlags[1]) { // for case if the coil went broken after the One Time Analysis coil(0); // and therefore there was no boiling point strSelector(0, 1); } } if (timer0> tmrInt[4]) { // the system goes standby binFlags[2] =1; strSelector(6, 0); } }void temprMeas() { temprPrev =tempr; sensors.requestTemperatures(); // update sensor readings if (sysSettings[1]) { tempr =sensors.getTempCByIndex(0); // read remperature } else { tempr =sensors.getTempFByIndex(0); } if (tempr>=temprPrev + trendSens[sysSettings[1]]) { trend[0] =0; trend[1] =1; } if (tempr <=temprPrev + trendSens[sysSettings[1]]) { trend[0] =0; trend[1] =0; } if ((tempr temprPrev - trendSens[sysSettings[1]])) { trend[0] =1; }} // ---- Coil Control // 0:power off // 1:power onvoid coil(byte op) { switch (op) { case 0:digitalWrite(relay, 0); binFlags[1] =1; strSelector(1, 2); ledHandler(0); Pause; case 1:digitalWrite(relay, 1); strSelector(6, 0); CD4017BE(0); graph(1); for (byte i =0; i 0; i--) { str[i] =termStr; } return; } TX(); for (byte i =(strSize - 1); i> 0; i--) { // roll for printout str[i] =str[i - 1]; } buzz(4, 1); }void draw(void) { if (frame ==0) { u8g.drawXBMP( 0, 0, 128, 64, frame0); } else { if (frame ==1) { scr(); } }}void scr(void) { if (binFlags[2]) { #define standbySize 4 const String standbyStr[standbySize] ={"Press key>>>>", "or", "send", "start"}; u8g.setFont(u8g_font_courB10); u8g.setPrintPos(2, 12); u8g.print(standbyStr[0]); u8g.setPrintPos(14, 26); u8g.print(standbyStr[1]); u8g.setPrintPos(30, 40); u8g.print(standbyStr[2]); u8g.setColorIndex(!cyclic); u8g.drawBox(74, 28, 50, 14); u8g.setColorIndex(cyclic); u8g.setPrintPos(76, 40); u8g.print(standbyStr[3]); u8g.setColorIndex(1) ; } else { if ((posY[0]>=20) || (posY[13]>=20)) { u8g.drawBitmapP( 5, 0, 1, 12, frame1); } else { u8g.drawBitmapP( 5, 25, 1, 12, frame1); } if ((posY[54]>=30) || (posY[112]>=30)) { u8g.drawHLine(69, 40, 53); scrTempr(72, 12); } else { scrTempr(72, 44); } for (byte i =0; i 0) { u8g.drawVLine(i, posY[i], 2); } } } u8g.setFont(u8g_font_6x12); byte y =53; for (byte i =(strSize - 1); i> 0; i--) { u8g.setPrintPos(0, y); y =y + 9; u8g.print(str[i]); } }void scrTempr (byte tX, byte tY) { u8g.drawVLine(2, 4, 39); u8g.drawHLine(0, 40, 69); u8g.drawHLine(0, posY[pointer - 1], 5); byte tXrel =2; byte tYrel =11; if ((tempr <100) &&(tempr> -10)) { u8g.drawFrame(tX - tXrel, tY - tYrel, 45, 13); u8g.drawHLine(116, 40, 12); } else { u8g.drawFrame(tX - tXrel, tY - tYrel, 51, 13); u8g.drawHLine(122, 40, 6); } u8g.setFont(u8g_font_6x12); u8g.setPrintPos(tX, tY); u8g.print(tempr); u8g.print(char(176)); u8g.print(unit[sysSettings[1]]); if (trend[0]) { return; } tXrel =12; if (trend[1]) { u8g.drawBitmapP(tX - tXrel, tY - tYrel, 1, 4, frame2); } else { u8g.drawBitmapP(tX - tXrel, tY - tYrel, 1, 4, frame3); }}void scrClr(){ u8g.firstPage(); do { } while(u8g.nextPage());} // ---- Maintenance of Graph Arrays // call param // 0:step &fill // 1:clr // 2:initvoid graph(byte op) { switch (op) { case 0:if (pointer ==posYsize) { for (byte i =0; i <(posYsize - 1); i++) { posY[i] =posY[i + 1]; posY[i + 1] =termByte; } pointer =posYsize - 1; } for (byte i =0; i =temprRefr[i + 1])) { posY[pointer] =i; retourner; } } break; case 1:for (byte i =0; i 0) &&(atof(exRX)>=1) &&(atof(exRX) <=999999)) { copyof_tmrInt0 =(atof(exRX) * 1000); strSelector(5, 0); } for (byte i =0; i

Schémas


Processus de fabrication

  1. Contrôle d'accès avec QR, RFID et vérification de la température
  2. Enregistreur de données de température et d'humidité
  3. Arduino avec Bluetooth pour contrôler une LED !
  4. Chaussures intelligentes (laçage automatique et génération d'électricité)
  5. Température, humidité et pression BME280 sur l'affichage Nextion
  6. Contrôle du servomoteur avec Arduino et MPU6050
  7. Appareils Bluetooth à commande vocale avec OK Google
  8. module GPS u-blox LEA-6H 02 avec Arduino et Python
  9. Comment lire la température et l'humidité sur Blynk avec DHT11