Particle Photon – Weather Station

Bonjour à tous, comment allez-vous? Aujourd’hui, je vous propose de vous faire découvrir mon design pour un baromètre connecté. Pour une fois, j’ai essayé de me focaliser surtout sur le rendu de l’objet. Alors certes, je peux avoir des goûts hors du commun… Mais où est l’intérêt de faire comme tout le monde???

Au niveau technique, cette station météo connectée est très simple. Je suis parti sur un micro de chez Particle : le Photon que je vous aie déjà présenté : Particule Photon

Pourquoi me direz-vous? Tout simplement, car il est petit, peu cher, très stable, très bien documenté et surtout très facile à prendre en main… 😍

J’ai donc volontairement choisi des composants les plus répandus possible et surtout les moins chers… Car il y a de la matière première et du temps d’usinage à prendre en compte dans la facture finale pour ce projet… 😐

Hardware :

Le schéma électrique est relativement simple :

Schema De Principe
Schema De Principe

Matières Premières :

  • Bloc massif de bois noble (hêtre, chêne, etc…) qu’il faut usiner avec une CNC.
  • Une petite plaque de PMMA qu’il faut découper au laser.

    Plaque PMMA
    Plaque PMMA
  • Un tube à essai pour géant afin de protéger les LEDS. J’ai eu une chance monstrueuse de tomber sur ce tube grâce à mon collègue de travail Théophile. Un grand merci à lui… 👏

    Tube
    Tube

Retour d’expérience :

Je crois que la plus grosse problématique sur ce projet fut de tout faire rentrer dans le boitier. Il a fallu travailler sur longueurs de câbles horriblement courtes ce qui est très désagréable, mais plus appréciable au regard… Les soudures ont reçu un soin particulier afin d’être les plus fines possible. Je dois dire que je préfère souder du 0402 plutôt que des longueurs de câbles aussi réduites… 😓

Le code permet également d’envoyer les données recueillies par le BMP085 sur ThingSpeak si vous rentrez une clé de channel. 😜

Il est alors très facile d’intégrer les graphiques sur un page web : http://anderson69s.com/meteo/ 😍

Juste avant de partager le code, voici une petite vidéo du rendu final :

Code :

Comme j’utilise la plate-forme de développement en ligne avec le Photon (Particle Build), je vais malheureusement être obligé de faire un copier/coller de celui-ci ici. Je peux également vous donner les liens des libraires que j’ai utilisés en ligne pour vous faciliter la tâche :

// This #include statement was automatically added by the Particle IDE.
#include "thingspeak/thingspeak.h"
// This #include statement was automatically added by the Particle IDE.
#include "neopixel/neopixel.h"
// This #include statement was automatically added by the Spark IDE.
#include "Adafruit_BMP085/Adafruit_BMP085.h"

#define PIXEL_COUNT 53 //Pin for LED
#define PIXEL_PIN D2
#define PIXEL_TYPE WS2812B

void LevelLed(int rangep, uint32_t c);
void rainbow(uint8_t wait);
void rainbowCycle(uint8_t wait);
uint32_t Wheel(byte WheelPos);

Adafruit_BMP085 bmp;
Adafruit_NeoPixel strip = Adafruit_NeoPixel(PIXEL_COUNT, PIXEL_PIN, PIXEL_TYPE);

ThingSpeakLibrary::ThingSpeak thingspeak ("VOTRE_CLE_THINGSPEAK");
int t = 0;
int p = 0;

void setup() {

	bmp.begin();
	strip.begin();
	strip.setBrightness(255);
    strip.show(); // Initialize all pixels to 'off'
}

void loop() {
    
    //////////////////////////////////////////////////////////
    int t = bmp.readTemperature() - 4;
    int p = bmp.readPressure() - 1000;
   
    bool valSett = thingspeak.recordValue(2, String(t, DEC));
    bool valSetp = thingspeak.recordValue(1, String(p, DEC));
    
    bool valsSentt = thingspeak.sendValues();
    bool valsSentp = thingspeak.sendValues();
    
    Particle.publish("Temperature", String(t, DEC));
    Particle.publish("Pression", String(p, DEC));
    
    ///////////////////////////////////////////////////////////
    for(int z=0; z<2; z++)
    {
      rainbowCycle(15);
    }
    //////////////////////////////////////////////////////////
    int rangep = map(p, 96500, 99250, 0, strip.numPixels()); 
    int ranget = map(t, -10, 50, 0, 5);
    switch (ranget) {
    case 0:
      LevelLed(rangep, strip.Color(255, 255, 255)); 
      break;
    case 1:    
      LevelLed(rangep, strip.Color(0, 0, 255));
      break;
    case 2:    
      LevelLed(rangep, strip.Color(0, 255, 0));
      break;
    case 3:   
      LevelLed(rangep, strip.Color(255, 255, 0));
      break;
    case 4:   
      LevelLed(rangep, strip.Color(255, 0, 0));
      break;
    }
    delay(5000);
    /////////////////////////////////////////////////////////
    for(int w=0; w<2; w++)
    {
      rainbow(15);
    }
    ////////////////////////////////////////////////////////
    switch (ranget) {
    case 0:
      LevelLed(rangep, strip.Color(255, 255, 255)); 
      break;
    case 1:    
      LevelLed(rangep, strip.Color(0, 0, 255));
      break;
    case 2:    
      LevelLed(rangep, strip.Color(0, 255, 0));
      break;
    case 3:   
      LevelLed(rangep, strip.Color(255, 255, 0));
      break;
    case 4:   
      LevelLed(rangep, strip.Color(255, 0, 0));
      break;
    }
    delay(5000);
}
/////////////////////////////////////////////////////////
void LevelLed(int rangep, uint32_t c)
{
    strip.show();
    for(int i=0; i<strip.numPixels(); i++)
    {
        strip.setPixelColor(i, 0);
    }
    for(int i=0; i<rangep; i++)
    {
        strip.setPixelColor(i, c);
        delay(100);
        strip.show();
    }
    
}
////////////////////////////////////////////////////////////////
void rainbow(uint8_t wait) {
  uint16_t i, j;

  for(j=0; j<256; j++) {
    for(i=0; i<strip.numPixels(); i++) {
      strip.setPixelColor(i, Wheel((i-j) & 255));
    }
    strip.show();
    delay(wait);
  }
}
////////////////////////////////////////////////////////////////
void rainbowCycle(uint8_t wait) {
  uint16_t i, j;

  for(j=0; j<256; j++) { // 1 cycle of all colors on wheel
    for(i=0; i<strip.numPixels(); i++) {
      strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) - j) & 255));
    }
    strip.show();
    delay(wait);
  }
}
/////////////////////////////////////////////////////////////
uint32_t Wheel(byte WheelPos) {
  if(WheelPos < 85) {
   return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
  } else if(WheelPos < 170) {
   WheelPos -= 85;
   return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  } else {
   WheelPos -= 170;
   return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
}

@Bientôt Anderson69s

2 réponses sur “Particle Photon – Weather Station”

    1. Bonjour Iooner.

      Le Photon me permet d’envoyer les données du bmp085 sur Thingspeak afin d’avoir des graphiques tracés en temps réel.

      Si vous vous rendez sur la page Météo vous pourrez observer les valeurs que j’envoie depuis le Photon sur internet.

      ++ Anders

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur la façon dont les données de vos commentaires sont traitées.

Traduction :