Retour à l'accueil

Station météo Atmega328 NRF24L01 : schémas et code

L'article analyse l'implémentation de la station météo sur Atmega328 avec NRF24L01 : conception de circuit avec équilibrage RGB, filtres anti-scintillement logiciels, prévision de précipitations par moindres carrés sur BMP280, contrôle de communication. Erreurs de conception et optimisations décrites.

Création d'une station météo : Atmega328 + NRF24L01 + code
Advertisement 728x90

Station météo Atmega328 avec NRF24L01 : Mise en œuvre matérielle et logicielle

La station de base de la station météo est construite sur le microcontrôleur Atmega328 avec un résonateur externe de 16 MHz. L'alimentation est de 5 V, avec un régulateur séparé AMS1117 3,3 V pour le module NRF24L01. Le circuit comprend un rétroéclairage RGB avec équilibrage de luminosité : une résistance de 100 Ω sur le canal rouge, 200 Ω sur le vert et le bleu pour compenser la sensibilité physiologique de l'œil et les différences d'émission des cristaux.

Optimisation de l'alimentation

Dans le circuit initial, un condensateur de découplage était utilisé pour l'alimentation et un pour AREF. Cela fonctionnait mais violait les recommandations : chaque paire VCC-GND nécessite un condensateur séparé de 100 nF pour supprimer le bruit impulsionnel du microcontrôleur. De manière optimale, trois pour l'alimentation plus un sur AREF. Sur le bus I²C, deux paires de résistances de tirage sont excessives ; une paire de 4,7 kΩ est suffisante.

Conception du PCB et mise à la terre

La carte a été réalisée à la main par la méthode de la photorésine avec masque de soudure UV. La couche inférieure est un polygone GND solide, les vias sont réalisés par soudure de fils. Séparer la masse analogique et numérique pour la photorésistance s'est avéré inutile : le capteur est basse fréquence, signal 0,5–4,5 V, bruit en millivolts. Un filtre de 0,1 µF sur l'entrée ADC shunt les interférences haute fréquence et compense les pointes de masse en mode commun.

Google AdInline article slot
  • Photorésistance vs photodiode : La photorésistance (kΩ–MΩ) fournit un signal de tension, robuste au bruit ; le photodiode (µA) nécessite une AGND propre.
  • Recommandation : Masse commune + 0,1 µF sur l'ADC pour les photorésistances.

La séparation de masse est nécessaire pour les capteurs à faible courant (thermocouples, piézo).

Filtrage logiciel contre le scintillement

L'affichage et la luminosité du rétroéclairage sont ajustés via PWM en fonction de la photorésistance. Le bruit ADC et le bruit thermique (±3–4 unités) provoquent un scintillement. L'alimentation n'a pas résolu le problème ; un filtre médian d'ordre 3 et un filtre exponentiel ont été appliqués.

int rawValue = analogRead(0);
int filteredValue = med.filter(rawValue);
float smoothValue = expF.filter(filteredValue);
int photoresistor = map(smoothValue, 260, 1023, 0, 255);
photoresistor = constrain(photoresistor, 0, 255);
analogWrite(3, 255 - photoresistor);

La combinaison de filtres est meilleure que la moyenne sur 10 : elle élimine les pointes sans retard de réaction significatif.

Google AdInline article slot

Prévision des précipitations via baromètre

Le BMP280 mesure la pression toutes les 10 min, en faisant la moyenne sur 10 lectures. Un tableau des 6 dernières valeurs est analysé en utilisant la méthode des moindres carrés pour l'approximation.

if (millis() - lasttime > 600000) {
  lasttime = millis();
  PP = pressure();
  for (byte i = 0; i < 5; i++) {
    pres1_array[i] = pres1_array[i + 1];
  }
  pres1_array[5] = PP;
}

// Moindres carrés
for (byte i = 0; i < 6; i++) {
  sumX += time_array[i];
  sumY += (long)pres1_array[i];
  sumX2 += time_array[i] * time_array[i];
  sumXY += (long)time_array[i] * pres1_array[i];
}
a = (long)6 * sumXY - (long)sumX * sumY;
a = (float)a / (6 * sumX2 - sumX * sumX);
delta = a * 6;
rain = map(delta, -250, 250, 100, -100);

Le coefficient a est la pente, delta est le changement par heure (Pa). rain de -100 (montée, ciel clair) à +100 (descente, pluie).

Contrôle de communication et temporisation

Lors de la réception d'un paquet du capteur extérieur, lastReceiveTime est enregistré. Si absent >60 min :

Google AdInline article slot
if (radio.available()) {
  radio.read(&rxData, sizeof(rxData));
  lastReceiveTime = millis();
  dataIsFresh = true;
}
if (lastReceiveTime > 0 && millis() - lastReceiveTime > 3600000) {
  resetWirelessData();
}

resetWirelessData() remet à zéro dataIsFresh, l'écran affiche des tirets.

Rétroéclairage RGB atmosphérique

La couleur change au fil du temps, imitant la nature : matin — jaune, jour — bleu, soir — rose, nuit — violet. Interpolation linéaire du RGB basée sur la progression dans l'intervalle.

float progress = (currentHour - 8 + (float)currentMinute / 60.0) / 3.0;
if (progress < 0.5) {
  float subProgress = progress * 2.0;
  r = 255;
  g = 80 + subProgress * 90;
  b = 0 + subProgress * 50;
} else {
  float subProgress = (progress - 0.5) * 2.0;
  r = 255 - subProgress * 170;
  g = 180 - subProgress * 50;
  b = 60 + subProgress * 195;
}
void day() {
  r = 85; g = 130; b = 255;
}

Les phases assurent une transition fluide sans sauts brusques.

Boîtier et micrologiciel

Boîtier : ABS + PETG transparent, carte dimensionnée à l'affichage. Micrologiciel via Arduino comme ISP sur connecteurs PLS.

Points clés

  • Équilibrage RGB : 100 Ω sur le rouge pour l'égalisation visuelle.
  • Filtres : médian + exponentiel meilleur que la moyenne contre le scintillement.
  • Moindres carrés pour la pression : delta ±250 Pa détermine la probabilité de pluie.
  • Temporisation de 60 min pour NRF24L01 empêche l'affichage de données obsolètes.
  • Masse commune suffisante pour la photorésistance avec 0,1 µF.

— Editorial Team

Advertisement 728x90

Lire ensuite