Station météo domestique sur Arduino et envoi de données vers "People's monitoring". Ma station météo domestique maison sur Arduino Nano Il est temps d'assembler le boîtier

Station météo à faire soi-même.

C'était le soir, il n'y avait rien à faire après le nouvel an. Comme d'habitude, pendant les vacances d'hiver du Nouvel An, je veux aussi occuper ma tête et mes mains avec quelque chose d'utile et de créatif. Pendant ces vacances du Nouvel An, j'ai décidé de fabriquer une station météo de mes propres mains. J'ai commencé à préparer à l'avance, acheté et assemblé tous les composants avant la nouvelle année, et fait la programmation principale pendant les vacances.

(Beaucoup de photos sous la coupe !)

Tout d'abord, je vais passer en revue les composants, je ne donnerai pas de liens, car les marchandises sur eBay (dans mon compte) sont allées aux archives. J'ai acheté de nombreux composants tranquillement sur eBay. J'ai essayé l'enchère pour la première fois, j'avais l'habitude d'acheter toujours "achetez-le maintenant". Que puis-je dire, si vous ne vous précipitez pas pour acheter, certains composants peuvent être achetés moins chers (parfois la différence est deux fois).

Capteur de pression BMP085
C'est le capteur principal. Quand je l'ai vu sur eBay, j'ai réalisé que je voulais construire une station météo domestique.
Le capteur est arrivé dans une enveloppe ordinaire, recouverte d'un petit papier bulle à l'intérieur.

À l'intérieur de l'enveloppe se trouvaient la carte de visite du vendeur et le capteur, emballés dans un sac antistatique et enveloppés dans une autre couche de papier bulle

Le sac antistatique a été scellé afin que l'humidité pendant le vol ne menace pas le capteur

Nous obtenons le capteur. D'un côté, une ligne de contacts a été soudée, qui a été insérée dans la mousse afin qu'elle ne se plie pas. De l'autre côté se trouve le capteur lui-même et le marquage des contacts.




Tout irait bien, mais le marquage des contacts est appliqué dans une image miroir.
Le capteur est connecté via le bus I2C et est alimenté en 3,3 V. C'est-à-dire que 4 fils sont nécessaires pour un fonctionnement normal (+, -, SDA, SCL)
Vous pouvez interroger le capteur de 2 manières : soit via la bibliothèque, soit en utilisant les fonctions directement dans le sketch.
Exemple de programme :

#inclure

#define BMP085_ADDRESS 0x77 // Adresse I2C de BMP085

Const caractère non signé OSS = 0 ; // Paramètre de suréchantillonnage

// Valeurs d'étalonnage
entier ac1 ;
intac2 ;
intac3 ;
entier non signé ac4 ;
entier non signé ac5 ;
entier non signé ac6 ;
entier b1 ;
intb2 ;
intmb ;
int mc ;
intmd ;

température courte;
longue pression;

Void setup()
{
Série.begin(9600);
Wire.begin();
bmp085Calibration();
}

Boucle vide()
{
température = bmp085GetTemperature(bmp085ReadUT());
pression = bmp085GetPressure(bmp085ReadUP());
Serial.print("Température : ");
Serial.print(température/10.0, DEC);
Serial.println("C");
Serial.print("Pression : ");
Serial.print(pression/133.322, DEC);
Serial.println("mm Hg");
Serial.println();
retard(1000);
}

Vider bmp085Calibration()
{
ac1 = bmp085ReadInt(0xAA);
ac2 = bmp085ReadInt(0xAC);
ac3 = bmp085ReadInt(0xAE);
ac4 = bmp085ReadInt(0xB0);
ac5 = bmp085ReadInt(0xB2);
ac6 = bmp085ReadInt(0xB4);
b1 = bmp085ReadInt(0xB6);
b2 = bmp085ReadInt(0xB8);
mb = bmp085ReadInt(0xBA);
mc = bmp085ReadInt(0xBC);
md = bmp085ReadInt(0xBE);
}

Court bmp085GetTemperature(unsigned int ut)
{
longues x1, x2 ;
x1 = (((long)ut - (long)ac6)*(long)ac5) >> 15 ;
x2 = ((long)mc<< 11)/(x1 + md);
b5 = x1 + x2 ;

Retour ((b5 + 8)>>4);
}

Long bmp085GetPressure (non signé depuis longtemps)
{
longue x1, x2, x3, b3, b6, p ;
long b4, b7 non signé ;
b6 = b5 - 4000 ;
// Calculer B3
x1 = (b2 * (b6 * b6)>>12)>>11 ;
x2 = (ac2 * b6)>>11 ;
x3 = x1 + x2 ;
b3 = (((((long)ac1)*4 + x3)<>2;
// Calculer B4
x1 = (ac3 * b6)>>13 ;
x2 = (b1 * ((b6 * b6)>>12))>>16 ;
x3 = ((x1 + x2) + 2)>>2 ;
b4 = (ac4 * (long non signé)(x3 + 32768))>>15 ;
b7 = ((long non signé)(up - b3) * (50000>>OSS));
si (b7< 0x80000000)
p = (b7<<1)/b4;
autre
p = (b7/b4)<<1;
x1 = (p>>8) * (p>>8);
x1 = (x1 * 3038)>>16 ;
x2 = (-7357 * p)>>16 ;
p += (x1 + x2 + 3791)>>4 ;
retourner p ;
}

// Lire 1 octet du BMP085 à "adresse"
char bmp085Read (adresse char non signée)
{
données char non signées ;

wire.write(adresse);
Wire.endTransmission();
Wire.requestFrom(BMP085_ADDRESS, 1);
tandis que(!Wire.available())
;
return Wire.read();
}

Int bmp085ReadInt (adresse de caractère non signée)
{
caractère non signé msb, lsb ;
Wire.beginTransmission(BMP085_ADDRESS);
wire.write(adresse);
Wire.endTransmission();
Wire.requestFrom(BMP085_ADDRESS, 2);
while(Wire.available()<2)
;
msb = Wire.read();
lsb = Wire.read();
retour (entier) msb<<8 | lsb;
}

// Lire la valeur de température non compensée
entier non signé bmp085ReadUT()
{
int ut non signé ;
// Ecrire 0x2E dans le registre 0xF4
// Ceci demande une lecture de température
Wire.beginTransmission(BMP085_ADDRESS);
Wire.write(0xF4);
Wire.write(0x2E);
Wire.endTransmission();
// Attendez au moins 4,5 ms
retard(5);
// Lit deux octets des registres 0xF6 et 0xF7
ut = bmp085ReadInt(0xF6);
retour ut;
}

// Lire la valeur de pression non compensée
bmp085ReadUP() long non signé
{
caractère non signé msb, lsb, xlsb ;
non signé long vers le haut = 0 ;
// Écrit 0x34+(OSS<<6) into register 0xF4
// Demander une lecture de pression avec réglage de suréchantillonnage
Wire.beginTransmission(BMP085_ADDRESS);
Wire.write(0xF4);
Wire.write(0x34 + (OSS<<6));
Wire.endTransmission();
// Attendre la conversion, le temps de retard dépend de l'OSS
retard(2 + (3<// Lecture des registres 0xF6 (MSB), 0xF7 (LSB) et 0xF8 (XLSB)
Wire.beginTransmission(BMP085_ADDRESS);
Wire.write(0xF6);
Wire.endTransmission();
Wire.requestFrom(BMP085_ADDRESS, 3);
// Attendre que les données soient disponibles
while(Wire.available()< 3)
;
msb = Wire.read();
lsb = Wire.read();
xlsb = Wire.read();
up = (((long non signé) msb<< 16) | ((unsigned long) lsb << 8) | (unsigned long) xlsb) >> (8-OSS);
remonter ;
}


De plus, le capteur possède son propre capteur thermique pour la compensation de pression et un altimètre.

Arduino Nano v3.0
C'est le cœur de toute la station météo. En termes simples, le contrôleur est de taille miniature.
Acheté
Je ne parlerai pas en détail du contrôleur, puisque cela a déjà été fait avant moi :


Le package avec lightake était préfabriqué, le contrôleur était livré dans un package avec un câble USB et un Arduino dans un sac antistatique scellé.

Pour estimer la taille, à côté de l'Arduino, placez une pièce d'une valeur nominale de 1 rouble.

Carte contrôleur gros plan



Le câble USB est bon, avec un anneau de ferrite. Alimenté par Arduino via un câble USB. L'environnement de développement peut être téléchargé (page de téléchargement). Le langage est de type "C", il n'y a eu aucun problème pour le maîtriser, car je programme beaucoup dessus au travail.

écran LCD
Au boulot dans les bacs j'ai trouvé un écran LCD 1602 compatible. J'ai dû bricoler la connexion, car je n'ai pas trouvé de fiche technique pour cela. En conséquence, LCD gagné.

Mais après une courte opération, j'ai remarqué que cet écran ne me suffisait pas et je ne pourrai pas afficher plus de données, puisqu'il ne comporte que 2 lignes de 16 caractères chacune. Au début, il semble que ces paramètres suffisent, mais lorsque vous commencez à programmer, vous comprenez que vous pouvez caser un maximum de 3-4 paramètres. Et si vous créez un menu (je pensais créer un menu sur cet écran), il reste 1 à 2 espaces libres pour les paramètres.
En conséquence, j'ai commencé à chercher un autre écran. Au début, j'ai regardé l'écran graphique du Nokia 3310 et j'ai même participé à l'enchère eBay pour l'acheter, mais cela n'a pas fonctionné (ce dont je suis très content), j'ai donc dû abandonner cet écran. Maintenant, je comprends que ce serait trop petit pour mes besoins, car il y a quelque chose à comparer.
En parcourant par hasard les shields de l'Arduino, je suis tombé sur l'écran graphique 12864 du contrôleur ST7920. Cet écran a la bonne taille et une bonne résolution pour mes besoins (128x64). Autrement dit, vous pouvez placer en toute sécurité 6 à 7 lignes de 20 caractères dans une police normalement lisible. Étant donné que l'écran est graphique, en plus du texte dans différentes polices, des graphiques peuvent également être placés. Bref, c'est exactement ce dont j'avais besoin, tout était présent dans cet écran, donc je n'ai pas pu le supporter et j'ai commandé.
Le colis est arrivé rapidement et a été emballé de manière standard : un papier bulle, à l'intérieur il y avait une autre couche de papier bulle et un écran dans un sac antistatique :






Pour estimer la taille, placez à côté de l'écran LCD une pièce d'une valeur nominale de 1 rouble.




Pour connecter rapidement l'écran à l'Arduino, j'ai soudé une ligne de contacts aux broches du LCD. L'écran LCD peut être connecté via un bus série et parallèle. J'ai choisi la première option, car il y a si peu de contacts Arduino libres.
Connexion (prise du web):

- La broche 1 (GND) se connecte au bus commun
- La broche 2 (VCC) est connectée au bus d'alimentation + 5V, et la consommation de courant est relativement faible et l'affichage peut être alimenté à partir du régulateur Arduino intégré.
- Les broches 4, 5 et 6 sont connectées aux sorties numériques Arduino, formant l'interface série SPI :
broche 4 - (RS) - correspond à la ligne CS (par exemple 7)
broche 5 - (RW) - correspond à la ligne MOSI (par exemple 8)
broche 6 - (E) - correspond à la ligne SCK (par exemple 3)
Les numéros de broches Arduino peuvent être n'importe quoi, l'essentiel est de ne pas oublier de les indiquer correctement plus tard dans le texte du programme lors de l'initialisation de l'affichage.
- La broche 15 (PSB) est connectée au bus commun.
- Les broches 19 (A) et 20 (K) sont l'alimentation du rétroéclairage (+5V et GND respectivement). Pour régler la luminosité du rétroéclairage, vous pouvez utiliser une résistance variable de 10 kΩ connectée entre les rails d'alimentation et GND. La tension de son moteur est appliquée à la broche 19 de l'affichage.
Selon cette instruction, j'ai tout connecté sauf le rétroéclairage. J'ai utilisé l'Arduino PWM comme alimentation de rétroéclairage.
Afin de connecter par programme l'écran LCD à l'Arduino, la bibliothèque u8glib est utilisée. Vous pouvez télécharger. S'il y a des problèmes de téléchargement, je peux télécharger la bibliothèque sur narod.ru.
La bibliothèque elle-même n'est pas compliquée et vous permet d'afficher du texte dans différentes polices, de tracer une ligne, de dessiner les formes géométriques les plus simples (rectangle, cercle), d'afficher vos images préparées d'une manière spéciale. En principe, cet outil est suffisant pour la plupart des tâches.
Voici le résultat d'un programme simple :

Le programme lui-même :

#include "U8glib.h"

U8GLIB_ST7920_128X64 u8g(3, 9, 8, U8G_PIN_NONE); // SPI E=3, RW=9, RS=8

// Sous-programme pour déterminer la mémoire libre
int freeRam() ()
extern int __heap_start, *__brkval;
à la TV;
return (int) &v - (__brkval == 0? (int) &__heap_start: (int) __brkval);
}

Vider la configuration (vide) (
u8g.setFont(u8g_font_6x10); // Police de caractère
u8g.setRot180(); // Retourner l'écran
analogWrite(6, 115); // Réglez la luminosité de l'écran (anode de rétroéclairage sur 6 broches)
}

Boucle vide (vide) (
u8g.premièrePage();
faire(

u8g.setPrintPos(1, 12); // position
u8g.print("Bonjour !!!"); // sortie texte
u8g.drawBox(0,22,128,9); // Remplir le rectangle de blanc
u8g.setColorIndex(0); // encre blanche, fond noir
u8g.setPrintPos(1, 30); // position
u8g.print("Mot..."); // sortie texte

U8g.setColorIndex(1); // encre blanche, fond noir
u8g.setPrintPos(1, 50); // position
u8g.print("Après le démarrage ="); // sortie texte
u8g.setPrintPos(85, 50); // position
u8g.print(millis() / 1000); // affiche le nombre de secondes après le démarrage
u8g.setPrintPos(1, 64); // position
u8g.print(freeRam()); // afficher la quantité de mémoire utilisée
) while(u8g.nextPage());

retard(200);
}

Horloge temps réel DS1307
Un autre composant pour ma station météo. Ce bouclier a une horloge en temps réel. Je les ai commandé sur eBay. Le vendeur a envoyé un mouchoir de montre dans une boîte trop grande


À l'intérieur de la boîte, il y avait deux feuilles A4 avec de la publicité et un mouchoir de montre enveloppé de cellophane


Je tiens à noter que les frais ne dépassent pas la taille de 2 roubles. pièce de monnaie, et la boîte mesurait 13x15x5 cm.
La planche était emballée dans un sac antistatique

Châle de près



J'ai dû bricoler ce module. D'abord, il y avait des difficultés de connexion. Et deuxièmement, il n'y a pas de quartz sur cette carte. Si je savais que je passerais autant de temps sur le module, je l'aurais probablement assemblé moi-même, car le réseau regorge de schémas. Le circuit le plus simple contient 4 à 5 composants.
Concernant la connectique. J'ai trouvé une bibliothèque qui disait que l'interface I2C peut être connectée non pas aux entrées analogiques Arduino habituelles (A4 et A5), mais à toutes les entrées discrètes. Fait comme écrit. Au début, rien n'a fonctionné, après une longue danse avec un tambourin, l'horloge s'est remontée. Eh bien, j'ai pensé, ça y est, les problèmes sont résolus, mais après avoir essayé de connecter le même module à un autre Arduino, la danse avec le tambourin a continué. J'ai passé beaucoup de temps à chercher une solution à ce problème, et presque partout, il était indiqué soit une connexion incorrecte, soit l'absence de résistances de rappel sur les broches SCL et SDA. Je voulais déjà entrer dans la carte avec un fer à souder, mais sur un forum, je suis tombé accidentellement sur un code où il était dit que SCL et SDA devraient être connectés aux ports I2C standard de l'Arduino. Après la connexion standard, tout a immédiatement fonctionné.
Parlons maintenant du quartz. Je ne sais pas quel type de quartz les Chinois y ont mis, mais les montres avec un tel quartz ont fonctionné 10 à 11 secondes par jour. Cette erreur est de 5 minutes par mois et 1 heure par an. Vous n'avez pas besoin d'une horloge comme celle-ci. J'ai dû me connecter à nouveau et chercher comment corriger ce bogue. La première solution qui est apparue dit que vous devez mettre le quartz à la terre. At-il - résultat zéro. J'ai trouvé ailleurs que j'avais besoin de trouver une vieille carte mère et de dessouder le quartz de montre à partir de là. Fait - le résultat est. Maintenant, l'horloge ne s'écoule pas de 10 à 11 secondes, mais de 1,5 seconde par jour. Disons que ça s'est amélioré, mais loin d'être idéal. Comme il est plus réticent à jouer avec un fer à souder, il a été décidé d'ajuster l'horloge par programme, c'est-à-dire, une fois par jour, d'ajuster l'horloge à la valeur souhaitée. Au bout de 10 jours, l'horloge n'avait pas avancé de plus d'une seconde. La méthode est bonne, mais uniquement lorsque le dispositif de chronométrage Arduino est connecté à l'alimentation, sinon l'horloge fonctionne sur batterie et s'enfuit toujours.
Petit programme de test :

#include "Fil.h"
# définir DS1307_I2C_ADDRESS 0x68 // SDA A4, SCL A5

Octet decToBcd(byte val)
{
retour ((val/10*16) + (val%10));
}

Octet bcdToDec (valeur d'octet)
{
retour ((val/16*10) + (val%16));
}

Vide setDateDs1307(octet seconde, // 0-59
octet minute, // 0-59
octet heure) // 0-99
{

Wire.write(0);
Wire.write(decToBcd(seconde));
Wire.write(decToBcd(minute));
Wire.write(decToBcd(hour));
Wire.endTransmission();
}

Vide getDateDs1307(octet *seconde,
octet*minute,
octet*heure)
{

Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.write(0);
Wire.endTransmission();

Wire.requestFrom(DS1307_I2C_ADDRESS, 3);

*seconde = bcdToDec(Wire.read());
*minute = bcdToDec(Wire.read());
*heure = bcdToDec(Wire.read());
}

Void setup()
{
octet seconde, minute, heure ;
Wire.begin();
Série.begin(9600);

Deuxième = 45 ;
minute = 5 ;
heures = 16 ;

SetDateDs1307(seconde, minute, heure);
}

Boucle vide()
{
octet seconde, minute, heure ;

GetDateDs1307(&seconde, &minute, &heure);
Serial.print(heure, DEC);
impression série(":");
Serial.print(minute, DEC);
impression série(":");
Serial.println(deuxième, DEC);

retard(1000);
}


La bibliothèque n'est pas utilisée ici, et les fonctions sont tronquées pour le temps de lecture et d'écriture.

Capteur de température et d'humidité DHT11
Il n'y a pas grand chose à dire sur ce capteur. Je ne l'utiliserais même pas si je n'avais pas besoin d'humidité. Malheureusement, je n'ai pas pris de photo quand je l'ai reçu, donc il n'y aura pas de photos. Des photos du capteur peuvent être vues ci-dessous, où je l'ai connecté à l'Arduino. La connexion du capteur est simple (+, sortie numérique, -). En règle générale, les capteurs sont constitués de quatre broches. Avec ce facteur de forme, le troisième contact n'est connecté à rien.
Pour vous connecter à l'Arduino, vous pouvez utiliser la bibliothèque. Vous pouvez télécharger.
Un petit programme de test avec sortie d'informations sur l'écran LCD 1602 :

// inclut le code de la bibliothèque :
#inclure
#inclure

// Déclare les objets
dht11 Dht11;
LCD LiquidCrystal (12, 11, 6, 5, 4, 3);

# définir DHT11PIN 7
int je ;

Void setup()
{
lcd.begin(16, 2);
lcd.print("Statut : ");
je=0 ;
}

Boucle vide()
{
int chk = DHT11.read(DHT11PIN);
lcd.setCursor(8, 0);
interrupteur (chk)
{
cas 0 : lcd.print("OK "); pause;// lcd.setCursor(11, 0); lcd.print(millis()/2000); casser;
case -1 : lcd.print("Erreur de somme de contrôle"); joyeux(); casser;
cas -2 : lcd.print("Erreur de temporisation"); joyeux(); casser;
par défaut : lcd.print("Erreur inconnue"); joyeux(); casser;
}
retard (500);
lcd.setCursor(15, 0);
interrupteur(je)
{
cas 0 : lcd.print("^"); lcd.setCursor(15, 1); lcd.print(" ");break;
cas 1 : lcd.print("v"); lcd.setCursor(15, 1); lcd.print(" ");break;
par défaut : lcd.setCursor(15, 1); lcd.print("E"); casser;
}
je=je+1 ;
si (i>1) i=0 ;
lcd.setCursor(0, 1);
lcd.print("H=");
lcd.setCursor(2, 1);
lcd.print((flotteur)DHT11.humidity, 0);
lcd.setCursor(4, 1);
impression lcd("%");
lcd.setCursor(8, 1);
lcd.print("T=");
lcd.setCursor(10, 1);
lcd.print((float)DHT11.temperature, 0);
lcd.setCursor(12, 1);
lcd.print("C");

Vide mErr()
{
lcd.setCursor(2, 1);
lcd.print("**");
lcd.setCursor(10, 1);
lcd.print("**");
je=5 ;
}


Le capteur présente des inconvénients - les données du capteur ne sont fournies qu'en nombres entiers et la plage est faible.

Il semble qu'il ait écrit sur tous les composants. Il reste à tout rassembler en un seul tout.
Oups, presque oublié ! Pour assembler l'appareil, vous avez besoin d'un étui. Le boîtier a également été commandé sur Ebay. Le vendeur venait d'Angleterre. Le colis est arrivé rapidement, mais je n'ai pas pris de photo. Toutes les photos du corps sont ci-dessous.

Tout d'abord, j'ai tout assemblé sur la table à l'aide d'un câblage spécial. J'ai écrit un programme de test et l'ai téléchargé sur le contrôleur.



En fait, la couleur bleue du rétroéclairage est beaucoup plus brillante. Même à une luminosité minimale (Bright=5), le cadre est exposé.

Pour tout assembler sans fils, il a été décidé de fabriquer une mini carte mère, et la carte Arduino et les shields ont été mis sur les connecteurs. Dans ce cas, ils peuvent être facilement retirés rapidement. J'ai également décidé d'accrocher l'écran LCD et les boutons de commande sur les connecteurs, de ne souder que le capteur de température sur les fils.
C'est ainsi que l'écharpe est sortie



Sur la dernière photo, je n'ai pas encore lavé le flux. J'ai collé du caoutchouc poreux sous les boucliers à côté des connecteurs afin qu'il y ait au moins une sorte de support. Même si, en fait, les blindages des connecteurs sur les contacts sont déjà parfaitement maintenus.

Carte mère avec shields et carte Arduino installés.

Voici à quoi ressemble une connexion complète à la carte mère


Au lieu de boutons, j'ai utilisé un bouclier fait maison soudé sur une planche à pain. Comme boutons, j'ai utilisé des boutons de vieilles souris.
Comme vous pouvez le voir, le nombre de fils a diminué.

Le principal problème de placement dans le boîtier est de découper uniformément la rainure de l'écran LCD. Peu importe à quel point j'ai essayé, cela n'a toujours pas fonctionné parfaitement. Les écarts à certains endroits étaient légèrement supérieurs à 1 mm. Pour que tout ait l'air soigné, j'ai pris un scellant noir pour l'aquarium et rempli toutes les fissures, en même temps j'ai attaché l'écran à ce scellant particulier. Une fois le mastic sec, j'ai coupé l'excédent de l'extérieur. En pleine lumière, le scellant est visible et en lumière normale, tout se confond avec le boîtier.
Voici à quoi ressemble le boîtier de l'intérieur avec l'écran LCD et la carte mère installés.

Voici à quoi cela ressemble de l'extérieur en pleine lumière (je m'excuse pour les empreintes digitales, je les ai vues en triant les photos).

J'ai longuement réfléchi à la façon d'attacher les boutons au boîtier et, surtout, aux boutons à utiliser ...
Dans les magasins d'électronique, j'ai aimé le bouton avec une longue épingle et les embouts qui sont mis sur cette épingle. Ces boutons sont utilisés pour souder sur la carte. Tout irait bien, mais ils ont un inconvénient - le coup de pression est très petit et fort.
J'ai dû placer les boutons en deux étapes : la première consistait à placer les boutons sur la planche, la seconde à monter cette planche sur une autre planche. Et puis mettez tout cela dans le corps sur les guides.

Voici à quoi ressemble l'écharpe à boutons:



Voici à quoi ressemble le tableau :


Ici vous pouvez voir les guides dans lesquels la carte avec les boutons est insérée. J'ai soudé quelques éléments afin de rigidifier la carte.

Maintenant on met tout dans le corps
Sans boutons de connexion :


Avec connexion bouton :

Fermez la boîte et allumez-la. Tout fonctionne bien, les boutons fonctionnent comme il se doit.

A la fin je poste une courte vidéo de l'appareil dans différents modes :
http://www.youtube.com/watch?v=KsiVaUWkXNA&feature=youtu.be
Pour ceux qui ne voient pas la vidéo ici, voici le lien vers

Il est temps de terminer l'examen.
Je vais écrire un peu sur le programme, puis de brèves conclusions. Quand j'ai écrit le programme, je ne pensais pas que je me heurterais très rapidement à une limite de 30720 octets.


J'ai dû optimiser le code. Déplacement de nombreux morceaux de code dans des sous-programmes. Je n'aurais jamais pensé qu'une instruction switch ... case sous une forme compilée prend plus de place que plusieurs if ... else. La déclaration correcte des variables économise également de l'espace. Si vous déclarez un tableau long, bien qu'il soit tout à fait possible de s'en sortir avec byte, alors le dépassement mémoire atteint 500 octets, selon la taille du tableau. Lorsque vous écrivez un programme, vous n'y pensez pas, et ce n'est que plus tard, lorsque vous analysez le programme, que vous réalisez que vous avez mal fait certaines choses et que vous commencez à optimiser le code. Une fois les problèmes de taille du programme résolus, j'ai rencontré une limitation de la RAM. Cela s'est traduit par le fait que le programme a commencé à se bloquer après le chargement. J'ai dû entrer une sous-routine pour calculer la RAM libre. En conséquence, j'ai été contraint d'abandonner un algorithme de prévision météorologique, car il doit afficher des icônes à l'écran. L'algorithme lui-même fonctionne, mais la sortie des icônes devait être réservée. J'ai encore des idées sur la façon d'optimiser le code, mais dans un avenir proche, je laisserai l'appareil fonctionner tel quel afin d'évaluer les performances et d'identifier tous les bogues.

Maintenant quelques conclusions
Les moins
1) Prix. L'excuse pour ce moins est qu'un passe-temps n'est jamais bon marché.

avantages
1) Grande fonctionnalité de l'appareil
2) L'extension des fonctions n'est limitée que par le contrôleur utilisé et votre propre désir
3) Plaisir esthétique de la contemplation et satisfaction morale du fait que j'ai quand même assemblé et complété cet appareil

Je prévois d'acheter +86 Ajouter aux Favoris J'ai aimé la critique +137 +304

Dans cet article, nous expliquerons comment assembler une station météorologique à part entière qui transmet les données météorologiques au service bien connu de «surveillance des personnes».

Notre station météo sera composée de deux appareils : un appareil autonome compact qui mesure les indicateurs météo, et un appareil répétiteur qui reçoit ces indicateurs et les envoie à la « surveillance des personnes ». Les appareils communiqueront via un canal de communication sans fil à une fréquence de 433 MHz. La partie autonome sera alimentée par trois piles AA et pourra fonctionner sur un jeu de piles jusqu'à un an avec une période d'interrogation du capteur de 20 minutes.

Cette conception vous permet de ne pas percer les murs pour la pose de fils depuis la rue, où il est nécessaire de faire des mesures, jusqu'à la pièce où les résultats de ces mesures doivent être utilisés.

Qu'est-ce que cela nécessite?

Pour faire un émetteur autonome, nous avons besoin de :

    x3 porte-piles AA AA

Pour faire un répéteur, nous avons besoin de:

Il est également pratique d'installer deux LED pour indiquer les processus :

Pour l'indication sonore de la décharge de la batterie de la partie autonome, il est pratique d'utiliser un tweeter piezo :

Comment l'assembler ?

Assemblage d'une pièce autonome

Assemblage du répéteur

Ceci termine l'assemblage du répéteur minimalement fonctionnel. Si vous souhaitez installer une indication LED et une alarme sonore, veuillez suivre les étapes ci-dessous.


Source

Code pièce hors ligne

meteo_sensor.ino #inclure #inclure #inclure #inclure // Timeout entre les envois (pas plus de 65535)#define TIMEOUT 60000 // Nombre de tentatives d'envoi d'un colis#define TENTATIVES 3 // Broche d'information de l'émetteur#définir RF_PIN 5 // Broches des capteurs de température et d'humidité# définir GND1_PIN 10 # définir VCC1_PIN 11 # définir GND2_PIN 7 # définir VCC2_PIN 8 # définir DATA_PIN 12 # définir CLK_PIN 9 AmperkaLine rf(RF_PIN) ; SHT1x sht1x(CLK_PIN, DATA_PIN) ; void loop(void) ; // Fonction pour mettre la carte en veille. Toutes les TIMEOUT secondes // loop_func sera appelé. TEENSY3_LP LP = TEENSY3_LP() ; sleep_block_t* LP_config ; void sleep_mode(void ) ( LP_config = (sleep_block_t* ) calloc (1 ,sizeof (sleep_block_t) ) ; // Nous nous réveillerons sur une minuterie LP_config->modules=(LPTMR_WAKE) ; // Définit le délai d'expiration du minuteur LP_config->lptmr_timeout=TIMEOUT ; // Après le délai d'attente, la fonction de boucle sera appelée LP_config->callback=boucle ; LP.Hibernate(LP_config) ; ) // Fonction d'activation de périphérique void périphérique_start(void ) ( // Activer la ligne de données pinMode(RF_PIN, SORTIE) ; // Allumez l'alimentation et la masse des capteurs de température et d'humidité pinMode(GND1_PIN, SORTIE) ; pinMode(GND2_PIN, SORTIE) ; pinMode(VCC1_PIN, SORTIE) ; pinMode(VCC2_PIN, SORTIE) ; digitalWrite(GND1_PIN, BAS) ; digitalWrite(GND2_PIN, BAS) ; digitalWrite(VCC1_PIN, HIGH) ; digitalWrite(VCC2_PIN, HIGH) ; // Allumer la LED pour indiquer la transmission pinMode(LED_BUILTIN, SORTIE) ; digitalWrite(LED_BUILTIN, HIGH) ; // Sélectionne la tension interne comme tension de référence// source (=1.2 V) analogReference(INTERNE) ; ) // Fonction d'arrêt périphérique void périphérique_stop(void ) ( // Désactive la ligne de données pinMode(RF_PIN, ENTRÉE) ; // Désactiver le capteur de température et d'humidité pinMode(GND1_PIN, ENTRÉE) ; pinMode(GND2_PIN, ENTRÉE) ; pinMode(VCC1_PIN, ENTRÉE) ; pinMode(VCC2_PIN, ENTRÉE) ; pinMode(18 , INPUT_PULLUP) ; pinMode(19 , INPUT_PULLUP) ; // Éteint la LED digitalWrite(LED_BUILTIN, LOW) ; ) void setup(void ) ( // On n'initialise rien, on s'endort aussitôt mode veille() ; ) // Cette fonction est exécutée une fois toutes les TIMEOUT secondes void loop(void ) (msg long non signé ; température d'octet, humidité, tension ; // Allumer les périphériques périphérique_start() ; // Attendre que le capteur de température et d'humidité s'allume retard(30) ; // Obtenir les entrées des capteurs temp = (octet) (sht1x.readTemperatureC () + 40 .) * 2 ; humidité = (octet) sht1x.readHumidity () ; tension = lecture analogique(A0) / 4 ; // Compose un package à partir des données msg = 0 ; message | = tension ; msg<<= 8 ; msg | = humidity; msg <<= 8 ; msg | = temp; // Envoie plusieurs fois un colis pour (int je = 0 ; je< ATTEMPTS; i++ ) rf.send (msg) ; // Éteignez les périphériques périphérique_stop() ; // Après avoir quitté la fonction, la carte se rendormira }

Code tableau intérieur

récepteur.ino #inclure #inclure #inclure #inclure octet mac = ( 0x90 , 0xA7 , 0xDA , 0x0F , 0xBC , 0x75 ) ; charserver = "narodmon.com" ; client EthernetClient ; const int rfpin = 7 ; AmperkaLine rf(rfpin) ; void setup(void ) ( pinMode(rfpin, INPUT) ; pinMode(6 , OUTPUT) ; Serial.begin (9600) ; Serial.println ("Started." ) ; ) void loop(void ) ( static unsigned long pushtimeout = 0 ; température flottante statique, humidité, tension ; message long non signé ; int res ; si ((res = rf.receive (& msg) ) == 0 ) ( temp = ((float ) (msg& 0xFF ) ) / 2 . - 40 .; msg >>= 8 ; humidité = (float ) (msg& 0xFF ) ; msg >>= 8 ; tension = (float ) (msg& 0xFF ) / 256 . * 1,2 * 10 * 1,1 ; digitalWrite(6 , HIGH) ; Serial.print ("Temp: " ) ; Serial.print (temp) ; Serial.print ("", humidité : " ) ; Serial.print (humidité) ; Serial.print ("", tension : " ) ; Serial.println ( voltage) ; digitalWrite(6 , LOW) ; ) else Serial.println ("E" ) ; if (millis() - pushtimeout > 60000 * 5 ) ( pushtimeout = millis() ; Serial.println ("Starting Ethernet... " ) ; if (Ethernet.begin (mac) == 0 ) ( Serial.println ( "Échec de la configuration d'Ethernet à l'aide de DHCP") ; tandis que (1 ) ( ) ) retard(1000 ) ; Serial.println("connexion..." ) ; if (client.connect (server, 8283 ) ) ( Serial.println ("connecté" ) ; client.println ( "#90-A7-DA-0F-BC-75#Capteur#55.751775#37.616856#0.0") ; client.print("#90A7DA0FBC7501#" ) ; client.print (temp, DEC) ; client.println("#In") ; client.print("#90A7DA0FBC7502#" ) ; client.print(humidité, DEC) ; client.println("#Humidité"); client.print("#90A7DA0FBC7503#" ); client.print (tension, DEC) ; client.println("#Voltage"); client.println("##"); ) sinon Serial.println("échec de la connexion" ) ; ( unsigned long tm = millis() ; while (millis() - tm< 5000 ) { if (client.available () ) { char c = client.read () ; Serial.print (c) ; } } } client.stop () ; } }

Enregistrement d'une station météo dans le "People's Monitoring"

Pour que les données transmises par notre appareil soient correctement affichées sur la surveillance publique, vous devez procéder comme suit :


Démonstration de l'appareil

Que peut-on faire d'autre ?

    Teensy a une horloge en temps réel (RTC) à bord. Pour leurs performances, seul le quartz ne suffit pas. Vous pouvez acheter du quartz à 32,768 kHz dans n'importe quel magasin d'éléments radio et le souder. Ensuite, vous pouvez réveiller Teensy avec une alarme RTC. L'avantage est que vous pouvez réveiller l'appareil plus souvent pendant les heures où des lectures plus précises sont nécessaires. Par exemple, pendant les heures de travail, réveillez l'appareil toutes les 5 minutes et le reste - toutes les demi-heures.

Pendant mon temps libre, et cette fois j'ai écrit des instructions pour fabriquer une petite station météo. Il fonctionnera comme une horloge avec une date et affichera les températures à l'intérieur et à l'extérieur de la pièce. Nous utiliserons un Arduino UNO comme contrôleur principal, mais une autre carte avec un Atmega328p à bord fera l'affaire. Pour l'affichage, nous utilisons l'écran graphique WG12864B. Nous connecterons également deux capteurs de température ds18b20. L'un est à l'intérieur, l'autre à l'extérieur. Commençons.

Dans le processus de fabrication de produits faits maison, nous avons besoin de:

Arduino UNO (ou toute autre carte compatible Arduino)
- Écran graphique WG12864B
- capteur de température ds18b20, 2 pièces
- Alimentation 6 - 12 V
- Résistances 4,7 Kom 0,25 W, 2 pièces.
- Résistances 100 ohm 0,25 W
- Compartiment à piles pour 4 piles AAA "petit doigt"
- Boîte de la cartouche de la console SEGA
- Ruban isolant
- Fils de connexion
- Circuit imprimé
- Boutons
- Couteau de papeterie
- fer à souder
- Soudure, colophane
- Ruban adhésif double face

Étape 1 Préparez WG12864B3.
Ceux qui n'ont jamais travaillé avec des écrans auparavant peuvent être intimidés par le grand nombre de modifications apportées à des écrans apparemment identiques. Je vais vous expliquer un peu. La plupart des écrans de ce type fonctionnent sur les puces ks0107/ks0108. Tous les écrans peuvent être divisés en 4 types :

Option A : HDM64GS12L-4, Crystalfontz CFAG12864B, Sparkfun LCD-00710CM, NKC Electronics LCD-0022, WinStar WG12864B-TML-T

Option B : HDM64GS12L-5, Lumex LCM-S12864GSF, Futurlec BLUE128X64LCD, AZ Displays AGM1264F, Displaytech 64128A BC, Adafruit GLCD, DataVision DG12864-88, Topway LM12864LDW, Digitron SG12864J4, QY-1286 4F, TM 12864L-2, 12864J-1

Option C : Shenzhen Jinghua Displays Co Ltd. JM12864

Option D : Wintek-Cascades WD-G1906G, Wintek - GEN/WD-G1906G/KS0108B, Wintek/WD-G1906G/S6B0108A, TECDIS/Y19061/HD61202, Varitronix/MGLS19264/HD61202

Ils se ressemblent presque. Mais les broches de connexion sont différentes. J'ai choisi, et je vous le recommande, WG12864B3 V2.0, mais si l'écran est venu dans un autre, ou si vous ne l'avez tout simplement pas sous la main, vous pouvez facilement le comprendre en utilisant le tableau :

Brèves spécifications :

Il existe de nombreux schémas de connexion différents sur Internet, et tout semble fonctionner. Le fait est qu'il existe non seulement des écrans différents, mais aussi deux façons de les connecter : en série et en parallèle. Lors de l'utilisation d'une connexion de port série, nous n'avons besoin que de 3 sorties de microcontrôleur. Avec un parallèle minimum de 13. Le choix dans ce cas est évident, l'Arduino n'a de toute façon pas beaucoup de conclusions. Pour une connexion en parallèle, le schéma de connexion est le suivant :

Pour une connexion série, que nous utiliserons, le schéma est le suivant :

WG12864B - Arduino UNO 1 (GND) - GND 2 (VCC) - +5V 4 (RS) - 10 5 (R/W) - 11 6 (E) - 13 15 (PSB) - GND 19 (BLA) - via résistance 100 Ohms - +5V 20 (BLK) - GND

Pour régler le contraste, un potentiomètre doit se trouver sur l'écran. Il y a des screens sans ça, mais c'est désormais rare :

Une résistance de 100 ohms est nécessaire pour qu'une tension de 5 volts ne brûle pas accidentellement les diodes de rétroéclairage.

Étape 2 Fabrication du boîtier.
Pour le boîtier, prenez la boîte de la cartouche du décodeur Sega. Si vous ne trouvez pas cette boîte à portée de main, vous pouvez utiliser un autre étui. L'essentiel est que l'écran et l'Arduino s'y adaptent.

Coupez le film transparent, sur le dessus de la boîte, pour qu'il n'y ait plus de morceaux :

Ensuite, à l'aide d'un couteau de bureau, découpez une fenêtre 37x69 pour l'écran.

Au verso, le long du bord de la découpe, nous collons du ruban adhésif double face, de préférence noir:

Nous retirons le papier protecteur du ruban adhésif et collons notre écran dessus :

Vu de l'extérieur ça devrait ressembler à ça :

Sous l'écran, également sur du ruban adhésif double face, nous montons l'Arduino, après avoir préalablement fait des découpes pour le port USB et la prise de courant :

Les découpes pour les prises Arduino doivent être faites de part et d'autre du boîtier afin qu'il puisse se refermer librement :

Étape 3 Capteurs de température.
Nous utiliserons des capteurs de température numériques DS18B20. En les utilisant, nous obtenons une plus grande précision de mesure, une erreur ne dépassant pas 0,5 °C, dans une large plage de température de -55 ... + 125 °C. De plus, le capteur est numérique et effectue tous les calculs lui-même, et l'Arduino reçoit simplement des lectures prêtes à l'emploi. Lors de la connexion de ce capteur, n'oubliez pas la résistance de rappel de 4,7 KΩ entre les broches DQ et VDD. Plusieurs options de connexion sont également possibles. Avec une alimentation externe, à mon avis la meilleure option, nous l'utiliserons :

Quelle que soit l'alimentation électrique, les capteurs sont connectés en parallèle :

Nous placerons le capteur de température intérieure sur une petite carte avec deux boutons que nous utiliserons pour régler l'heure et la date de l'horloge :

Nous connectons le fil commun des deux boutons à GND, connectons le fil du premier bouton à A0, du second à A1.
Nous le fixons sur du ruban adhésif double face à côté de l'Arduino :

Le capteur, qui est censé être placé à l'extérieur de la pièce, est préférable de choisir dans un boîtier métallique anti-poussière :

Calculez le fil de la longueur requise pour pouvoir accrocher le capteur à l'extérieur de la fenêtre, l'essentiel est qu'il ne dépasse pas 5 mètres, si vous avez besoin d'une longueur plus longue, vous devrez réduire la valeur de la traction- résistance vers le haut.

Nous connectons le fil du bus de données DQ des deux capteurs à la broche 5 de l'Arduino.
Vdd - +5 Arduino.
GND - GND Arduino.

Étape 4 Alimentation.
Pour l'alimentation, vous pouvez utiliser une alimentation avec une tension de 6 à 12 volts. À l'extrémité du câble d'alimentation, soudez une prise qui s'adapte à la prise d'alimentation Arduino :

Ou vous pouvez mettre un compartiment à piles pour quatre piles "AAA", "petit doigt" dans le boîtier. Et connectez le fil positif de la baie à Vin Arduino et le fil négatif à GND.

Étape 5 Préparez l'environnement de programmation.
Vous devez d'abord télécharger et installer l'IDE Arduino à partir du site officiel

Et ajoutez également les deux bibliothèques nécessaires au croquis. OneWire - requis pour la communication avec les capteurs ds18b20 :

U8glib - utilisé pour afficher des informations à l'écran :

Téléchargement de bibliothèques. Ensuite, nous déballons les archives et déplaçons le contenu des archives dans le dossier "bibliothèques", situé dans le dossier avec l'IDE Arduino installé. Vous pouvez également ajouter des bibliothèques via l'IDE Arduino. Pour ce faire, sans décompresser les archives, exécutez l'IDE Arduino, sélectionnez Sketch - Connect Library dans le menu. Tout en haut de la liste déroulante, sélectionnez l'élément "Add. Zip Library". Spécifiez l'emplacement des archives téléchargées. Après toutes les étapes, vous devez redémarrer l'IDE Arduino.

Étape 6 Modification de l'esquisse.
Les capteurs de température fonctionnent selon le protocole One Wire et ont une adresse unique pour chaque appareil - un code 64 bits. Il n'est pas conseillé d'ajouter des commandes pour rechercher des capteurs dans l'esquisse. Il n'est pas nécessaire de charger l'Arduino à chaque fois pour perturber les capteurs. Par conséquent, tout d'abord, après avoir tout rassemblé, nous remplissons le croquis Arduino, situé dans le menu Fichier - Exemples - Température de Dallas - OneWireSearch. Ensuite, nous lançons Tools - Port Monitor. Arduino devrait trouver nos capteurs, écrire des adresses et des lectures de température. Ces adresses doivent être écrites ou simplement copiées quelque part. Ouvrez maintenant l'esquisse Ard_Tic_Tak_WG12864B_2_x_Term_Serial et recherchez les lignes :

Byte addr1=(0x28, 0xFF, 0x75, 0x4E, 0x87, 0x16, 0x5, 0x63);// adresse de l'octet interne addr2=(0x28, 0xFF, 0xDD, 0x14, 0xB4, 0x16, 0x5, 0x97); capteur

Nous remplaçons les adresses des capteurs correspondant à la localisation par nos adresses.
Notre horloge n'utilise pas le module RTC (horloge temps réel), il est donc nécessaire de corriger l'horloge. Pour plus de commodité, décommentez la ligne (des secondes apparaîtront à l'écran) :

//u8g.setPrintPos(44, 50); u8g.print(sec); // Affiche les secondes pour contrôler l'exactitude du mouvement

Réglez l'heure correcte à l'aide du moniteur de port. Pour ce faire, ouvrez le moniteur de port, attendez la fin des mesures de température initiales et entrez la date et l'heure actuelles au format "jour, mois, année, heures, minutes, secondes". Pas d'espaces, les chiffres sont séparés par des virgules ou des points.

Si l'horloge est pressée, changez la valeur en une valeur plus grande, je recommande d'expérimenter avec un pas de 100 unités. Si un retard doit diminuer la valeur dans la ligne :

If (micros() - prevmicros >494000) ( // changer pour autre chose pour ajuster c'était 500000

Empiriquement, nous déterminons le nombre auquel l'horloge tourne avec suffisamment de précision. Pour déterminer la précision du mouvement, vous avez besoin de la sortie en secondes. Après un calibrage précis du nombre, les secondes peuvent être commentées et ainsi supprimées de l'écran.
Téléchargement du croquis.

Basé sur le projet de station météo du livre de V. Petin "Projets utilisant le contrôleur Arduino" 2e édition (projet 5 de l'annexe 2). Utilisé Arduino IDE 1.8.5 sur Windows 10.
Une erreur s'est produite lors de l'exécution de l'esquisse

Sur Internet, vous pouvez télécharger des bibliothèques pour Arduino qui ont le même nom, mais un contenu différent. L'esquisse peut ne pas fonctionner si vous utilisez la "mauvaise" bibliothèque. Apparemment, je me suis trompé de bibliothèques. J'ai ajouté un capteur BMP180 au projet pour mesurer la pression atmosphérique et retravaillé le croquis.

Diagramme de connexion

Numérisation des adresses

Tout d'abord, connectez le capteur BMP180 et l'indicateur LCD1602 à l'Arduino. Compilez l'esquisse du scanner I2C et exécutez-la pour déterminer les adresses de périphérique sur le bus I2C.

Toutes les 5 secondes, le programme analyse les périphériques et envoie des adresses au port COM. J'ai trouvé deux appareils avec les adresses 0x3F et 0x77. BMP180 a l'adresse 0x77 par défaut, donc l'indicateur LCD a l'adresse 0x3F.
Dans certains des schémas, les livres sont mélangés là où les signaux SDA et SCL sont connectés à la carte Arduino. Devrait être : SDA - à A4, SCL - à A5. Si le module BMP180 a cinq broches, alors +5 volts sont appliqués à la broche VIN.

Schéma de câblage

Maintenant, assemblez complètement le circuit. J'ai utilisé une LED RVB à cathode commune montée sur une carte avec des résistances de 150 ohms. La cathode commune est connectée à la broche GND, les autres broches sont connectées selon le schéma. Il n'est pas nécessaire d'apporter des modifications au croquis, car la luminosité des LED change selon une loi cyclique.
Le schéma montre la connexion d'une LED RVB avec une anode commune, comme dans le livre.
Si aucun caractère n'est visible sur l'écran LCD1602, tournez la commande de luminosité. Le rétroéclairage de l'indicateur consomme beaucoup de courant, utilisez donc une alimentation avec un courant d'au moins 2 A. J'ai utilisé un concentrateur USB avec une alimentation externe de 2 A.
Dans le circuit, j'ai utilisé un appel piézo ZP-22. La résistance connectée à la cloche est de 100 ohms. La fréquence sonore peut être modifiée dans le programme. J'ai choisi une fréquence de 1000 Hz. Si vous rencontrez un buzzer avec une fréquence sonore fixe, vous pouvez l'allumer et l'éteindre simplement en appliquant et en supprimant la tension, comme une LED ordinaire. Lorsque le sketch démarre, un court bip retentit. Vous pouvez activer la signalisation périodique pendant l'exécution du programme en décommentant la ligne //bzz(100); dans un croquis.
Dans le projet, j'ai utilisé un capteur DHT11 sous la forme d'un module avec une résistance de 4,7 kΩ déjà montée. La résistance peut être de 4,7 à 10 kOhm.
Connectez la broche Vcc du module d'horloge DS1302 au rail +5 Volt. De cette façon, vous réduirez la consommation de la batterie. En fait, cela ne fonctionnera que lorsque l'alimentation de l'Arduino est coupée.

Programme (esquisse)

La bibliothèque bmp085 a été utilisée pour servir le BMP180. La valeur de la pression dépend de la hauteur du terrain. Pour la valeur correcte de la pression atmosphérique, vous devez choisir la hauteur. Pour ce faire, éditez la ligne dps.init(MODE_STANDARD, 10000, true); Je mesure 100 m (10000 cm). Le fragment de calcul de pression est tiré de l'exemple BMP085_test2.ino de la bibliothèque bmp085.

croquis meteo_P

#inclure
#inclure
#inclure
#include "dht.h"
#inclure
BMP085 dps = BMP085();
longue Pression = 0, Altitude = 0 ;
temps long non signé1 = 0 ;

#définir DHTPIN 10
#define DHTTYPE 11 // 11 - DHT11, 22 - DHT22
DHT dht(DHTPIN, DHTTYPE);

entier kCePin = 4 ; // RST DS1302
int kIoPin = 3 ; // Données DS1302
int kSclkPin = 2 ; // CLK DS1302
DS1302 rtc (kCePin, kIoPin, kSclkPin);

int REDpin = 9 ;
int Broche VERTE = 6 ;
int Broche BLEUE = 11 ;

LCD LiquidCrystal_I2C (0x3f, 16, 2); // définit votre adresse 0x20...0xff adresse
memTime long non signé ;
entier bzzPin = 8 ;

void HumTempRead() (
float hum = dht.readHumidity();
float temp = dht.readTemperature();
si (n'est pas (hum) || n'est pas (temp)) (
Serial.println("Échec de la lecture du capteur DHT !");
lcd.setCursor(0, 1);
lcd.print("H=--% T=---");
lcd.setCursor(11, 1);
lcd.print((char)223);
lcd.setCursor(12, 1);
lcd.print("C");
) autre (
lcd.setCursor(0, 1);
lcd.print("H=");
lcd.setCursor(2, 1);
impression LCD (hum);
lcd.setCursor(4, 1);
lcd.print("%T="+");
lcd.setCursor(9, 1);
impression LCD (température);
lcd.setCursor(11, 1);
lcd.print((char)223);
lcd.setCursor(12, 1);
lcd.print("C") ;
}
}

annuler setup_bzz() (
pinMode(bzzPin, SORTIE);
}

void bzz(int _bzzTime) (
ton(bzzPin, 1000 , _bzzTime); // fréquence 1000 Hz
}

void setup()(
Série.begin(9600);
Wire.begin();
retard(1000);

dps.init(MODE_STANDARD, 10000, vrai); // 100 mètres (altitude en cm)

dht.begin();
setup_bzz();
bzz(100);

lcd.init();
LCD rétro-éclairage();
lcd.home();
// lcd.setCursor(0, 0);

rtc.halt(faux);
rtc.writeProtect(faux);

//rtc.setDOW(VENDREDI); // Définir le jour de la semaine sur VENDREDI définir le jour de la semaine
//rtc.setTime(4, 58, 0); // Réglez l'heure sur 12:00:00 (format 24h)
//rtc.setDate(6, 8, 2010); // Fixe la date au 6 août 2010 fixe la date (jour, mois, année)
}

lcd.setCursor(8, 0);
lcd.print(rtc.getTimeStr());

si ((millis() - memTime > 2000) ou (millis()< memTime)) { // DHT11/22 1 time each 2 seconds
HumTempLit();
memTime = millis();
}
retard(100);

si (((millis() - temps1) / 1000.0) >= 1.0) (
dps.calcTrueTemperature();
temps1 = millis();
}
dps.getPressure(&Pressure);
Serial.print("Pression(Pa):");
Impression série (Pression);

longp2 ;
intpi ;
p2 = (Pression / 133,3224); // Pa en mmHg
pi = tronc(p2); // suppression de la partie fractionnaire du nombre

lcd.setCursor(0, 0);
lcd.print("P=");
lcd.setCursor(2, 0);
impression LCD (pi); // sortie atm. pression sur l'écran LCD
lcd.setCursor(5, 0);
lcd.print("mm");
// retard(3000);
//bzz(100); // décommentez si vous voulez écouter les signaux
{
pour (int valeur = 0 ; valeur<= 255; value += 1) {
analogWrite(REDpin, valeur);
analogWrite(GREENpin, 255 - valeur);
analogWrite(BLUEpin, 255);
retard(5);
}

pour (int valeur = 0; valeur<= 255; value += 1) {
analogWrite(REDpin, 255);
analogWrite(GREENpin, valeur);
analogWrite(BLUEpin, 255 - valeur);
retard(5);
}

pour (int valeur = 0; valeur<= 255; value += 1) {
analogWrite(REDpin, 255 - valeur);
analogWrite(GREENpin, 255);
analogWrite(BLUEpin, valeur);
retard(5);
}
}
}

Dans le catalogue de fichiers, vous pouvez télécharger le croquis et les bibliothèques qui ont été utilisés dans le projet.

Importez les bibliothèques LiquidCrystal_I2C.zip, bmp085.zip, DS1302.zip et DHT.zip de l'archive téléchargée dans l'IDE Arduino. Aller au menu Esquisser Connecter la bibliothèque Ajouter une bibliothèque .zip... et dans la fenêtre sélectionnez l'archive zip de la bibliothèque.
Téléchargez le sketch meteo_P. Remplacez l'adresse LCD1602 dans l'esquisse par la valeur obtenue à partir de l'analyse du bus I2C. Compilez et exécutez le sketch.
Si l'esquisse fonctionne, ouvrez le moniteur de port et affichez les messages de sortie. Choisissez la hauteur dans l'instruction dps.init(MODE_STANDARD, 10000 , true); pour obtenir des valeurs de pression réelles.
Réglez votre horloge. Décommentez la ligne //rtc.setTime(4, 58, 0); et entre parenthèses, spécifiez l'heure actuelle (heure, minutes et secondes séparées par des virgules) et rechargez le croquis dans le contrôleur. Une fois l'heure définie, commentez à nouveau cette ligne et redémarrez l'esquisse.
Si l'éclairage de la veilleuse vous ennuie, vous pouvez le modifier en modifiant la durée du délai dans les boucles for à la fin de l'esquisse. Avec retard(2); la boucle dure 2-3 secondes, avec retard(5); — de 4 à 5 secondes, avec temporisation(30) ; - jusqu'à 15-16 secondes. Les informations sur l'indicateur seront mises à jour au même intervalle.
Lors de l'utilisation autonome de la station météo, c'est-à-dire sans vous connecter au port USB de l'ordinateur, commentez les lignes avec les mots Serial ... dans l'esquisse pour désactiver la sortie d'informations sur le moniteur du port COM.

PS. Dans le croquis du livre et dans les exemples de la bibliothèque DHT, la ligne de définition est indiquée #define DHTTYPE DHT 11. L'esquisse s'exécute mais se bloque au bout de quelques heures. L'horloge s'arrête, l'affichage ne change pas. Un message indistinct apparaît dans le moniteur de port, dans lequel il y a une référence à dht.
Dans cette ligne, j'ai supprimé les lettres DHT, c'est-à-dire a fait #définir DHTTYPE 11. Après cela, le croquis a commencé à fonctionner de manière stable.

Article mis à jour le 25/06/2018

Ressources utilisées
1. Petin V.A. Projets utilisant le contrôleur Arduino (Électronique) 2e édition, Saint-Pétersbourg. BHV-Pétersbourg, 2015 464 p.
2. Petin V. A., Binyakovsky A. A. Encyclopédie pratique Arduino. - M., DMK Press, 2017. - 152 p.
3.http://arduinolearning.com/code/i2c-scanner.php
4. http://arduino.ru/forum/programmirovanie/ds1302lcd1602
5. http://robotics18.rf/how-to-connect-lcd-1602-to-arduino-by-i2c/
6. Exemple BMP085_test2.ino de la bibliothèque bmp085.zip
7. http://proginfo.ru/round/
8. http://homes-smart.ru/index.php?id=14&Itemid=149&option=com_content&view=article
9. http://iarduino.ru/lib/datasheet%20bmp180.pdf
10. http://it-donnet.ru/hd44780_dht11_arduino/

Il est conseillé de télécharger le firmware avant de connecter les composants pour s'assurer que la carte fonctionne. Après l'assemblage, vous pouvez à nouveau flasher, la carte doit clignoter calmement. Dans les projets avec des consommateurs de puissance élevés dans le circuit d'alimentation 5V de la carte (bande LED adressable, servos, moteurs, etc.), il est nécessaire d'appliquer une alimentation externe 5V au circuit avant de connecter l'Arduino à l'ordinateur, car l'USB ne fournira pas le courant nécessaire si, par exemple, la bande l'exige. Cela peut griller la diode de protection sur la carte Arduino. Un guide pour télécharger et télécharger le firmware se trouve sous le spoiler sur la ligne suivante.

Le contenu des dossiers dans l'archive

  • bibliothèques– bibliothèques de projets. Remplacer les versions existantes
  • micrologiciel- Firmware pour Arduino
  • régimes– schémas de connexion des composants

En outre

  • Comme l'expérience l'a montré, à l'extérieur du boîtier, le capteur de température indique 0,5 degré de moins qu'à l'intérieur ! Il est nécessaire d'organiser plus efficacement l'électronique, d'éliminer et de protéger la chaleur des éléments chauffants ...

  • Si l'affichage est trop sombre/blanc
    Sur la carte du pilote d'affichage (à laquelle les fils sont connectés), il y a un bouton de contraste, avec son aide, vous pouvez régler le contraste à celui souhaité. Aussi, le contraste dépend de l'angle de vue de l'écran (c'est du LCD) et on peut régler l'affichage pour un affichage clair même en angle "l'affichage est au niveau du nombril, on regarde d'en haut". Et le contraste dépend fortement de l'alimentation: à partir de 5V, l'affichage s'affiche aussi clairement et brillamment que possible, tandis que lorsqu'il est alimenté par USB via Arduino, la tension sera d'environ 4,5V (une partie tombe sur la diode de protection le long de l'USB ligne), et l'affichage n'est pas si brillant. Ajustez la sortie avec un potard avec une alimentation externe de 5V!

  • Si le capteur de CO2 ne fonctionne pas correctement (infa d'Evgeny Ivanov)
    Eh bien, il y a des croquis pour l'étalonnage dans le dossier de la bibliothèque de capteurs dans les exemples. il peut également être démarré en mode muet en court-circuitant le connecteur "HD" à la terre pendant plus de 7 secondes.
    Bien sûr, dans la rue dans le froid, il n'est pas nécessaire de le faire ... vous pouvez simplement remplir la bouteille d'air frais avec un capteur à l'intérieur et la sceller. l'étalonnage prend au moins 20 minutes.
    Par défaut, le capteur est fourni avec l'auto-calibrage activé, qui se produit tous les jours, et si le capteur est utilisé dans une pièce non ventilée, alors ce calibrage prend rapidement les valeurs de la norme au-delà de l'horizon, il doit donc être désactivé .
    Documentation.

  • Auto-étalonnage du capteur Le CO2 est désactivé dans le sketch !

  • Si tu as Le capteur BME280 ne fonctionne pas, il a très probablement une adresse différente. Le projet utilise la bibliothèque Adafruit_BME280, qui n'a pas de fonction de changement d'adresse distincte, donc l'adresse est définie manuellement dans le fichier de bibliothèque Adafruit_BME280.h presque au tout début du fichier ( se trouve dans le dossier Adafruit_BME280 de votre dossier de bibliothèques, vous devriez l'y avoir installé), mon module avait l'adresse 0x76. Comment connaître l'adresse de mon module BME280 ? Il existe un croquis spécial appelé scanner i2c. Vous pouvez le googler, vous le pouvez. Flashez ce croquis, ouvrez le port et obtenez une liste des adresses des appareils connectés au bus i2c. Pour que les autres modules ne vous dérangent pas, vous pouvez les désactiver et ne laisser que le BME280. Nous spécifions l'adresse reçue dans la bibliothèque, enregistrons le fichier et chargeons le micrologiciel de l'horloge météo. Tous!

  • Si l'horloge est en retard, le problème vient probablement du circuit d'alimentation. Si le problème persiste lors du changement d'alimentation pour une meilleure, accrochez un condensateur pour alimenter le module RTC (souder directement sur la carte à VCC et GND) : assurez-vous d'être en céramique, 0,1-1 uF (marquage 103 ou 104, voir le tableau de marquage). Vous pouvez également mettre un électrolyte (6.3V, 47-100 uF)

Paramètres du micrologiciel

#define RESET_CLOCK 0 // réinitialiser l'horloge pendant le chargement du firmware (pour un module avec une batterie non amovible). N'oubliez pas de mettre 0 et de flasher à nouveau ! #define SENS_TIME 30000 // temps de rafraîchissement des lectures du capteur sur l'écran, millisecondes #define LED_MODE 0 // Type de LED RVB : 0 - cathode principale, 1 - anode principale #define LED_BRIGHT 255 // Luminosité de la LED CO2 (0 - 255) # définir BLUE_YELLOW 1 // couleur jaune au lieu de bleu (1 oui, 0 non) mais en raison des caractéristiques de connexion, le jaune n'est pas si brillant #define DISP_MODE 1 // affichage dans le coin supérieur droit : 0 - année, 1 - jour de la semaine , 2 - secondes #define WEEK_LANG 1 // langue du jour de la semaine : 0 - anglais, 1 - russe (translittéré) #define DEBUG 0 // affiche le journal d'initialisation du capteur au démarrage #define PRESSURE 1 // 0 - pression graphique, 1 - graphique de prévision de pluie (au lieu de la pression). N'oubliez pas de fixer les limites du graphique // afficher les limites des graphiques #define TEMP_MIN 15 #define TEMP_MAX 35 #define HUM_MIN 0 #define HUM_MAX 100 #define PRESS_MIN -100 #define PRESS_MAX 100 #define CO2_MIN 300 #define CO2_MAX 2000

Vous avez aimé l'article ? Partager avec des amis: