Mini Station méteo avec afficheur LCD TFT 3.6" et liaison BT vers SmarPhone.

Bonjour,

Je vous présente mon projet de mini station météo (un classique) avec un afficheur LCD TFT de 3.6 pouces.

  • carte arduino Mega
  • Sensor Shield arduino méga V2.0
  • LCD TFT 3.6 pouces 400*200 pixels
  • Sonde T° et humidité DHT 22 (pour l'intérieur)
  • Sonde T° DS18B20 étanche (pour Extérieur)
  • Sonde pression BMP 180
  • Module RTC DS3231
  • Module BT HC-06
  • Module SD-Card

Archivage sur une micro-sd , de la T° Ext et de la pression , toutes les 15 min.

Nouvelle boite (boitier pupitre) pour mettre tous les composants :

Archivage de l'heure des T° Ext Maxi et mini.

Affichage des T° Ext, Int et pression sur smartphone Android, via BT.

Pour la suite du projet, je vais travailler sur la gestion du tactile du lcd pour ajouter des informations en plus.

@+

#include <UTFT.h>
#include <DS3232RTC.h>    //http://github.com/JChristensen/DS3232RTC
#include <Time.h>         //http://www.arduino.cc/playground/Code/Time  
#include <Wire.h>         //http://arduino.cc/en/Reference/Wire (included with Arduino IDE)
#include <Adafruit_BMP085.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include "DHT.h"
#include <SPI.h>
#include <SD.h>

#define DHTPIN 17  // Sonde temperature DHT22  
#define DHTTYPE DHT22   
DHT dht(DHTPIN, DHTTYPE);

UTFT myGLCD(ILI9327,38,39,40,41); // Ecran TFT LCD 3.6 pouces

extern uint8_t SmallFont[];
extern uint8_t BigFont[];
extern uint8_t SevenSegNumFont[];

int heures;
int minutes;
int secondes;
int jour_mois;
int Mois;
int annee;
int pression_atm;
int temp_Ext;
float Tmax_Ext = 0;
float Tmin_Ext = 100;
float Tmax_Int = 0;
float Tmin_Int = 100; 

static long date_init;

int comp_sd=0;

int Intervalle = 15;

 
char myData[100]; 
File myFile;

const int chipSelect = 53; // port SD card
Sd2Card card;

const char* jour_semaine[] = {
                   "         \0",
                   "Dimanche \0",
                   "Lundi    \0",
                   "Mardi    \0",
                   "Mercredi \0",
                   "Jeudi    \0",
                   "Vendredi \0",
                   "Samedi   \0"};
                   
const char* mois[] = {
                   "   \0",
                   "Jan\0",
                   "Fev\0",
                   "Mar\0",
                   "Apr\0",
                   "Mai\0",
                   "Juin\0",
                   "Juillet\0",
                   "Aout\0",
                   "Sep\0",
                   "Oct\0",
                   "Nov\0",
                   "Dec\0"};


  
Adafruit_BMP085 bmp; // Sonde de pression atmospherique BMP 180

#define ONE_WIRE_BUS 10  // sonde de temperature DS18B20
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);


void setup()
{
  date_init=millis();
  sensors.begin();
  dht.begin();
  myGLCD.InitLCD();
  myGLCD.clrScr();
  myGLCD.setColor(255, 255, 255);
  myGLCD.fillScr(128, 208, 208);
  myGLCD.setBackColor(128, 208, 208);
  myGLCD.drawRect(5,5,395,235); 
  myGLCD.drawLine(5,25,395,25);
  myGLCD.drawLine(5,55,395,55);
  myGLCD.drawLine(5,115,395,115);
  myGLCD.drawLine(5,175,395,175);
  myGLCD.drawLine(5,220,395,220);
  myGLCD.setFont(SmallFont);
  myGLCD.print("Station Meteo Arduino", CENTER, 10);
   
  Serial.begin(9600);
  if (!bmp.begin()) {
 Serial.println("Could not find a valid BMP085 sensor, check wiring!");
 while (1) {}
  }
  setSyncProvider(RTC.get);   // the function to get the time from the RTC
  if(timeStatus() != timeSet)
  {
      Serial.println("Unable to sync with the RTC");
  }
    else
   {
      Serial.println("RTC has set the system time");
   }   
  Serial.print("Initialisation  SD card...");

  if (!SD.begin(53)) {
    Serial.println("Echec Initialisation carte SD ");
    myGLCD.print("Echec initialisation carte SD", 150, 222);
    return;
  }
  
  
}

void loop()
{
  myGLCD.setFont(SmallFont);
  myGLCD.print("Nb ecritures SD: ", 10, 222);
  myGLCD.printNumI(comp_sd,140,222);
  myGLCD.print("Intervalle en min: ", 200, 222);
  myGLCD.printNumI(Intervalle,350,222);
  affiche_heure(10,60);
  affiche_date(10,30);
  pression(190,60);
  temperatures_humidite(15,120);
  if (millis()>=date_init + (Intervalle*60000))
 {
  sdcar(); 
  date_init=millis(); 
 }
  
  delay(1000);
  
   
}

void affiche_heure(int x, int y)
{
  heures=hour();
  minutes = minute();
  secondes =second();
  myGLCD.setFont(SevenSegNumFont);
  myGLCD.printNumI(heures, x, y, 2 ,'0');
  myGLCD.printNumI(minutes, x+70, y, 2 ,'0');
  myGLCD.setFont(BigFont);
  myGLCD.printNumI(secondes, x+135, y, 2 ,'0');
      
}

void affiche_date (int x, int y)
{
  jour_mois= day();
  annee=year();
  myGLCD.setFont(BigFont);
  myGLCD.setColor(255,255,0);
  myGLCD.print(jour_semaine[weekday()], x, y);
  myGLCD.printNumI(jour_mois, x+120, y, 2);
  myGLCD.print(mois[month()], x+170, y, 2);
  myGLCD.printNumI(annee, x+305, y, 2);
  myGLCD.setColor(255, 255, 255);
  
}

void pression (int x, int y)
{
  myGLCD.setFont(SevenSegNumFont);
  pression_atm = ((bmp.readPressure()/100)+17);
  myGLCD.printNumI(pression_atm,x,y);
  myGLCD.setFont(BigFont);
  myGLCD.setColor(255, 255, 0);
  myGLCD.print("hPa",x+130,y);
  myGLCD.setColor(255, 255, 255);
} 

void temperatures_humidite (int x, int y)
{
  int humidite = dht.readHumidity();
  int temp_Int = dht.readTemperature();
  // Temperature DS 3231
  float c = RTC.temperature() / 4.;
  sensors.requestTemperatures();
  myGLCD.setFont(SevenSegNumFont);
  temp_Ext=int (sensors.getTempCByIndex(0));
  myGLCD.printNumI(temp_Ext,x,y,2,1);
  myGLCD.setFont(SmallFont);
  myGLCD.print("O", x+68, y);
  myGLCD.setFont(BigFont);
  myGLCD.print("C", x+75, y);
  myGLCD.print("Ext", x+65, y+35);
  myGLCD.setFont(SevenSegNumFont);
  myGLCD.printNumI(temp_Int,x+130,y);
  myGLCD.setFont(SmallFont);
  myGLCD.print("O", x+195, y);
  myGLCD.setFont(BigFont);
  myGLCD.print("C", x+205, y);
  myGLCD.print("Int", x+195, y+35);
  myGLCD.setFont(SevenSegNumFont);
  myGLCD.printNumI(humidite,x+280,y);
  myGLCD.setFont(BigFont);
  myGLCD.print("%", x+350, y);
  if (hour()==00 && minute()==00)
  {
   Tmax_Ext=0;
   Tmin_Ext=100;
   Tmax_Int=0;
   Tmin_Int=100;
 }
 if (Tmax_Ext<temp_Ext)
 {
      Tmax_Ext=temp_Ext;
 }
 if (temp_Ext<Tmin_Ext)
 {
      Tmin_Ext=temp_Ext;
 }
  if (Tmax_Int<temp_Int)
 {
      Tmax_Int=temp_Int;
 }
 if (temp_Int<Tmin_Int)
 {
      Tmin_Int=temp_Int;
 }
 myGLCD.setFont(BigFont);
 myGLCD.setColor(255, 255, 255);
 myGLCD.print("TMax_Ext:", x, y+60);
 myGLCD.printNumI(Tmax_Ext,x+140,y+60);
 myGLCD.print("TMin_Ext:", x, y+80);
 myGLCD.printNumI(Tmin_Ext,x+140,y+80);
 myGLCD.setColor(255, 0, 0);
 myGLCD.print("TMax_Int:", x+190, y+60);
 myGLCD.printNumI(Tmax_Int,x+330,y+60);
 myGLCD.print("TMin_Int:", x+190, y+80);
 myGLCD.printNumI(Tmin_Int,x+330,y+80);
 myGLCD.setColor(255, 255, 255);
}

void sdcar()
{
  heures=hour();
  minutes = minute();
  secondes =second();
  Mois=month();
  jour_mois= day();
  annee=year();
  sensors.requestTemperatures();
  temp_Ext=(sensors.getTempCByIndex(0));
  pression_atm = int ((bmp.readPressure()/100)+17);
  sprintf(myData,"%u/%u/%u    %u:%u:%u  %u  %u", annee,Mois,jour_mois,heures,minutes,secondes,temp_Ext,pression_atm); 
  myFile = SD.open("Meteo2.txt", FILE_WRITE);
  myFile.println(myData);
  myFile.close();
  myFile = SD.open("Meteo2.txt");
  // Lecture du contenu du fichier
  if (myFile) {
  Serial.println("Meteo2.txt:");
  while (myFile.available()) {
  Serial.write(myFile.read());
  }
  // Fermeture fichier
  myFile.close();
  } else {
  
  Serial.println("erreur ouverture meteo2.txt");
  }
  comp_sd = comp_sd+1;
  
}

Station_meteo_TFT_v1.ino (4.99 KB)

Bonjour, il est super sympa ton projet :wink: , c'est tout-à-fait ce que je souhaiterais faire avec mes élèves. Tu pourrais me dire comment en faire un ? Que j'essaie pendant les vacances et que je prépare ça ensuite pour la rentrée... Merci...

Salut,

Que veut tu savoir, pour réaliser ce montage, les principaux composant viennent d'ebay.

  • Sensor Shield arduino méga V2.0

http://www.ebay.fr/itm/Sensor-Shield-arduino-mega-V2-0-/161762724649?

  • LCD TFT 3.6 pouces 400*200 pixels

http://www.ebay.fr/itm/231453055102?_trksid=p2060353.m2749.l2649&ssPageName=STRK%3AMEBIDX%3AIT

Les autres composants se trouvent sans soucis sur le Net, je peut fournir le schéma de câblage si nécessaire.

Tes élèves ont quel niveaux ?.
@+

Merci, je viens de trouver tous les capteurs et le TFT (j'ai bien trouvé le même et celui-là -http://www.ebay.fr/itm/171591395025- t'en penses quoi ?), j'ai des Méga et des shields.

Sinon, c'est pour des 4ème et 3ème, ce sera au programme l'année prochaine, alors ça fait un petit moment que je m'autoforme, car nous n'avons pas d'autre possibilité -pour l'instant ?- et avec le reste du boulot à faire, et bien je n'avance pas vite.

Cette année j'ai utilisé et les élèves aussi, Ardublock, mais pour certains projets il faudra que je fasse les lignes de prog, et dans le programme il faudra aussi qu'ils apprennent le codage...

C'est avec des projets de ce type que je me forme et que j'essaie d'avancer. Si tu peux et tu veux m'aider c'est super, je suis un nul en la matière, donc j'ai besoin d'aide dans la réalisation et la programmation...

Ensuite je pourrais aider à mon tour quelques collègues intéressés qui en auront besoin.

Salut,

Je vais faire des photos du câblage de la carte arduino méga, en ce qui concerne le LCD il semble être le même que celui que j'utilise, par contre il n'y a pas la référence du contrôleur graphique, et donc cela va poser un soucis lors de l'utilisation du LCD, de plus celui-ci vient de Chine donc délais important de livraison.

Tu est de quelle région, je suis dans le 28, si tu n'est pas trop loin on pourrait se voir.

@+

Ok, merci, je vais rester sur ta TFT alors, je ne suis pas encore capable de gérer ce genre de changement. Puisque tu veux bien m'aider je vais commander le matos. Je suis dans le 86 Sud, près de Poitiers, alors ça dépend où tu es dans le 28, si c'est au nord, ça peu faire loin...

Poitiers cela est trop loin de chez moi, donc on va continuer par ce site.

OK, on continue ici...
J'ai petit blog sur lequel je diffuse mes activités :

Salut,

Je mettrais demain les photos de la station, par contre il faut aussi des câbles pour relier l'arduino shield aux différents composants.

http://www.ebay.fr/itm/171060292865?_trksid=p2060353.m1438.l2649&var=470261897677&ssPageName=STRK%3AMEBIDX%3AIT

Câbles en femelle /femelle.

@+

Ok, merci. C'est bon pour les câbles, j'ai ce qu'il faut, tout est commandé... Ce week-end je ne sais pas si je serais bien présent, pour cause d'anniversaire, le mien... Alors je ne peux m'éclipser... ;o)

Salut,

Bonne anniversaire, voici les photos.

La première : carte arduino mega + Sensor Shield arduino méga V2.0
La seconde : capteur DHT 22 , module RTC, en bas a droite capteur de pression.
La troisième : vue d'ensemble du projet, avec les cables de liaisons LCD --> Mega.

Les capteurs sont pour le moment dans un boite à part, mais je vais acheter une boite plus grande pour mettre le tout dedans.

Pour info, je suis aussi comme toi dans l'enseignement, sauf qu'il sont en Term SI.

Voila.
@+

IMGP3503.JPG

Salut,

Merci, ça ne se passe pas trop mal...
Merci également pour les photos.

A bientôt

Bonjour,

Bien que je sois en travaux à la maison, je vais être plus disponible. :slight_smile:

J'ai bien regardé les photos, si tu pouvais m'envoyer le schéma ce serait sympa... :wink:

J'ai vu que tu as placé le DHT22 sur une plaque d'essais, peux tu me dire pourquoi tu as mis une résistance ?

Salut,

Pour le schéma des capteurs, voir fichier joint, il est nécessaire de mettre une résistance de 4.7K entre Vcc et la sortie signal aussi bien pour le DTH 22 que DS18B20, c'est le constructeur des capteurs qui l'impose.

J'ai utilisé une plaque d'essai car cela est plus pratique pour souder la résistance, mais cela n'est pas obligatoire.

Je ferais un schéma pour le câblage du LCD un peut plus tard.

@+

Merci pour le schéma... C'est bien clair. Ce matin j'ai reçu deux RTC DS3231, pour un proto pour moi, afin de montrer aux élèves que cela fonctionne, je procède ainsi habituellement, et pour un autre ensemble pour les élèves.

Il manque juste des connecteurs et les piles, j'ai ce qu'il faut...

Tu vas devoir souder des pins sur le deuxième connecteurs du DS3231, si tu veux pouvoir relier facilement le BMP180 au DS3231.

Si pourrais mettre un photo de mon montage si cela n'est pas clair.

@+

Oui, j'ai les pins je vais les souder... Tu n'utilises le sensor shield que pour l'écran ?

Le shield est utilisé pour les capteurs et le lcd, si je n avais pas eu de capteurs le LCD se monte directement sur le mega et dans ce cas c'est beaucoup plus simple .

Salut,

Je vais mettre ce WE ou Lundi normalement le schéma de câblage du LCD, j'ai aussi des travaux à faire des mon bureau.

@+

Bonjour, et merci pour ton message. Je viens de recevoir ce matin les deux écrans TFT, mais il me manque encore quelques capteurs... J'attends donc ton schéma... :slight_smile: