A usual weather station for domestic use must give us information about temperature and humidity, but a good weather station give us information about pressure, too.
I design a weater station with 2.2" TFT display with ILI9341 driver.
For control the colour display with ILI9341, I use graphical library named ucglib, derivated from u8glib library for monochrome graphical display.
I decided to use BMP180 sensor for give information about temperature and pressure & DHT11 sensor for give just humidity value, because is not accurate at temperature reading.
My schematic for sensors at Arduino Due is:
In my case, real ensemble is:
For DHT11 sensor must use a new library compatible with Due, I found in a article named Class for DHTxx sensors (xx = 11-21-22-33-44) and for BMP180 I use Adafruit-BMP085.
I write some original sketches for this weather station, and last is:
/*
original sketch by niq_ro from http://nicuflorica.blogspot.com & http://arduinotehniq.blogspot.com using ucglib library
version for 2.2" TFT with ILI9341 - 2014.07.29, Craiova - Romania
use Universal uC Color Graphics Library from https://code.google.com/p/ucglib/
*/
#include <SPI.h>
#include "Ucglib.h"
//Ucglib_ILI9341_18x240x320_HWSPI ucg(/*cd=*/ 6 , /*cs=*/ 5, /*reset=*/ 4); // at Uno
//Ucglib_ILI9341_18x240x320_HWSPI ucg(/*cd=*/ 26 , /*cs=*/ 24, /*reset=*/ 22); // at Mega
//Ucglib_ILI9341_18x240x320_SWSPI ucg(/*sclk=*/ 52, /*data=*/ 51, /*cd=*/ 26 , /*cs=*/ 24, /*reset=*/ 22); //at Mega
//Ucglib_ILI9341_18x240x320_SWSPI ucg(/*sclk=*/ 76, /*data=*/ 75, /*cd=*/ 26 , /*cs=*/ 24, /*reset=*/ 22); //at Mega
Ucglib_ILI9341_18x240x320_HWSPI ucg(/*cd=*/ 26 , /*cs=*/ 24, /*reset=*/ 22); //at Mega or Due
/*
Due |Mega | Uno | TFT - ILI9341
----------------------
D22 | D22 | D4 | RESET
D24 | D24 | D5 | CS
D26 | D26 | D6 | D/C
? | ? | LED (via 220 ohms resistor at 5V)
MOSI | D51 | D11 | MOSI
MISO | D50 | D12 | MISO
SCK | D52 | D13 | SCK
-----------------------------
with CD4050 adapter or 10k resistor, power supply and logical levels is 3.3V
schematic: http://nicuflorica.blogspot.ro/2014/07/afisaj-grafic-color-qvga-de-22-cu.html
*/
#include <dht.h>
// from http://playground.arduino.cc/Main/DHTLib
dht DHT;
// https://github.com/adafruit/Adafruit-BMP085-Library
#include <Wire.h>
#include <Adafruit_BMP085.h>
Adafruit_BMP085 bmp;
float t1, t2;
float t10, t20;
float t11, t21;
float t12, t22;
float t13, t23;
int h11, h12;
int p1, p2;
void setup() {
delay(1000);
bmp.begin();
ucg.begin(UCG_FONT_MODE_TRANSPARENT);
ucg.clearScreen();
ucg.setFont(ucg_font_ncenR14r);
ucg.setColor(255, 0, 255);
ucg.setColor(1, 255, 0,0);
ucg.setRotate90();
ucg.setColor(255, 255, 255); // culoare alba
ucg.drawFrame(0,0,320,240); //
ucg.setFont(ucg_font_courB24); // 20 pixel height
ucg.setColor(255, 0, 0); // culoare rosie
ucg.setPrintPos(60,30);
ucg.print("Ministatie");
ucg.setColor(0, 255, 0); // culoare verde
ucg.setColor(0, 255, 0);
ucg.setColor(0, 0, 255); // culoare albastru
ucg.setPrintPos(17, 60);
ucg.print("meteo cu DHT11");
ucg.setPrintPos(55, 90);
ucg.setColor(5, 255, 0); // culoare verde
ucg.print("si BMP180");
ucg.setFont(ucg_font_fur17r); // 17 pixel height
ucg.setColor(255, 255, 0); // culoare galbena
ucg.setPrintPos(25,120);
ucg.print("ecran grafic 2,2'' (5,6cm)");
ucg.setFont(ucg_font_courB24); // 20 pixel height
ucg.setColor(0, 255, 255); // culoare bleo
ucg.setPrintPos(10,150);
ucg.print("QVGA cu ILI9341");
ucg.setColor(255, 0, 255); // culoare mov
ucg.setPrintPos(20,180);
ucg.print("versiune 4.4.0");
ucg.setFont(ucg_font_fur17r); // 17 pixel height
ucg.setColor(255, 255, 255); // culoare alb
ucg.setPrintPos(60,210);
ucg.print("realizat de niq_ro");
delay(5000);
ucg.clearScreen();
t13=40.0;
h12=40.0;
p2 = 900;
}
void loop() {
// BMP180 part
int p1 = bmp.readPressure()/101.325;
p1 = p1 * 0.760;
// DHT11 part
int chk = DHT.read11(37);
delay(1000);
// timeout;
int h11 = DHT.humidity;
if (DHT.humidity < 0) h11 = 0;
// BMP180 part 2
t12 = bmp.readTemperature();
int t15 = t12;
float t16 = 10*t15;
t16 = t16/10;
t16 = t12;
if (t16 != t13)
{
temperaturi(t16, t13, 20, 0); // temperature, old temperature, x,y
termometre(t16, 20);
}
if (h11 != h12)
{
// umiditate(h11, h12, 115, 90); // humidity, old humidity, x, y
umiditate(h11, h12, 40, 180); // humidity, old humidity, x, y
barca (h11, h12);
}
if (p1 != p2)
{
presiune(p1, p2, 100, 60); // pressure, old pressure, x, y
// barca (h11, h12);
}
//}
delay (2000);
t13=t16;
h12=h11;
p2=p1;
} // final de program, se revine de la inceput
void temperaturi(float t3, float t4, int ics, int igrec)
{
int t5 = t3;
int t6 = t4;
ucg.setFont(ucg_font_courB24);
if (t3*t4 < 0)
{ucg.setColor(0, 0, 0);
for (int qy = 39 ; qy < 60; qy++)
{
ucg.drawHLine(ics+7, qy + igrec , 105);
}
}
int t51 = t5/10;
int t61 = t6/10;
ucg.setColor(0, 0, 0);
if (t51 != t61)
{
for (int qy = 39 ; qy < 60; qy++)
{
ucg.drawHLine(ics+28, qy + igrec , 21);
}
}
t5 = t3 - t51*10;
t6 = t4 - t61*10;
if (t5 != t6)
{
for (int qy = 39 ; qy < 60; qy++)
{
ucg.drawHLine(ics+49, qy + igrec , 21);
}
}
for (int qy = 39 ; qy < 60; qy++)
{
ucg.drawHLine(ics+91, qy + igrec , 21);
}
ucg.setColor(255, 0, 0);
ucg.setPrintPos(10 + ics, 30 + igrec);
//ucg.print("t :");
ucg.print("temperatura:");
ucg.setPrintPos(10 + ics, 60 + igrec);
if (t3 > 10.0) ucg.print("+");
else
if (t3>0.0) ucg.print(" +");
else
if (t3<0.0)
{
t3=-t3;
if (t3 > 10.0) ucg.print("-");
else
if (t3 > 0.0) ucg.print(" -");
}
if (t3==0.0) ucg.print(" ");
ucg.print(t3,1);
ucg.print(" C");
ucg.setFont(ucg_font_fur17r);
ucg.setPrintPos(30 + ics, 35 + igrec);
//if (igrec == 0) ucg.print("int");
//else ucg.print("ext");
ucg.setPrintPos(115 + ics, 50 + igrec);
ucg.print("o");
ucg.setPrintPos(75 + ics, 60 + igrec);
ucg.print(",");
}
void termometre (float t, int ics1)
{
ucg.setColor(255, 255, 255);
ucg.drawFrame(ics1-4,10,9,200);
ucg.drawCircle(ics1,220,10,UCG_DRAW_ALL);
for (int a = 0; a < 10; a++)
{
ucg.drawLine(ics1-5,20+20*a,ics1-7,20+20*a);
ucg.drawLine(ics1+5,20+20*a,ics1+7,20+20*a);
}
ucg.drawLine(ics1-10,140,ics1+10,140);
ucg.setFont(ucg_font_courB24);
ucg.setPrintPos(13 + ics1, 149);
ucg.print("0 C");
ucg.setFont(ucg_font_fur17r);
ucg.setPrintPos(37 + ics1, 135);
ucg.print("o");
int lin = 140 - 2*t;
ucg.setColor(0, 0, 0); // black
ucg.drawBox(ics1-2,21, 5, lin+5);
ucg.setColor(255, 0, 0);
ucg.drawDisc(ics1,220,8,UCG_DRAW_ALL);
ucg.drawBox(ics1-2,lin, 5, 210-lin);
}
void umiditate(int h3, int h4, int zet, int igrec1)
{
ucg.setFont(ucg_font_courB24); // 20 pixel height
// sterg semnul ??
int h51 = h3/10;
int h61 = h4/10;
ucg.setColor(0, 0, 0);
// sterg zeci daca e cazul
if (h51 != h61)
{
//ucg.setColor(255, 255, 0);
ucg.setColor(0, 0, 0);
for (int qy = 39 ; qy < 60; qy++)
{
// ucg.drawHLine(zet+28, qy + igrec1 , 21);
ucg.drawHLine(zet+40, qy + igrec1, 42);
}
}
int h5 = h3 - h51*10;
int h6 = h4 - h61*10;
// sterg unitati daca e cazul
//if ((t5 != t6) || (t5-t6>0.2))
if (h5 != h6)
{
//ucg.setColor(0, 255, 0);
ucg.setColor(0, 0, 0);
for (int qy = 39 ; qy < 60; qy++)
{
ucg.drawHLine(zet+79, qy + igrec1 , 21);
}
}
ucg.setColor(0, 255, 255);
ucg.setPrintPos(zet, 30 + igrec1);
ucg.print("umiditate:");
//ucg.setFont(ucg_font_fub42n); // 20 pixel height
ucg.setPrintPos(40 + zet, 60 + igrec1);
//if (h3 > 10) ucg.print("+");
if (h3 > 10) ucg.print(" ");
else
{
//ucg.setColor(255, 255, 255);
ucg.setColor(0, 0, 0);
for (int qy = 39 ; qy < 60; qy++)
{
ucg.drawHLine(zet+40, qy + igrec1 , 42);
}
if (igrec1 <30) ucg.setColor(255, 255, 0);
else ucg.setColor(0, 255, 255);
ucg.setPrintPos(61 + zet, 60 + igrec1);
//ucg.print("+");
ucg.print(" ");
}
ucg.print(h3);
ucg.print("%");
}
void barca (int h, int h2) // new humidity, old humidity.,
{
int xx = 280;
int yy = 230;
//sterg barca
//ucg.setColor(100,100,100);
ucg.setColor(0,0,0);
ucg.drawBox(xx-25, yy-20-h2, 50, 30);
//sterg apa
//ucg.setColor(125, 125, 125);
ucg.setColor(0, 0, 0);
ucg.drawBox(xx-35, yy+10-h2, 70, h2-h);
//desenez apa
ucg.setColor(0, 255, 255);
ucg.drawBox(xx-35, yy+10-h, 70, h);
//desenz barcuta;
//desenez carena
ucg.setColor(255, 255, 0);
ucg.drawBox(xx-20, yy-h, 40, 10);
ucg.drawTriangle(xx-25, yy-h, xx-20, yy-h, xx-20, yy+10-h);
ucg.drawTriangle(xx+25, yy-h, xx+20, yy-h, xx+20, yy+10-h);
//desenez catarg
ucg.drawBox(xx-1, yy-20-h, 2, 20);
//desenez velele
ucg.setColor(0, 0, 255); // vela albastra
ucg.drawTriangle(xx+2, yy-20-h, xx+2, yy-h, xx+20, yy-h);
ucg.setColor(255, 0, 0); // vela rosie
ucg.drawTriangle(xx-2, yy-15-h, xx-2, yy-h, xx-20, yy-h);
}
void presiune (int p3, int p4, int zeti, int igreci)
{
ucg.setFont(ucg_font_courB24); // 20 pixel height
// sterg semnul ??
int p51 = p3/10;
int p61 = p4/10;
//ucg.setColor(0, 0, 0);
ucg.setColor(100, 0, 0);
// sterg zeci daca e cazul
if (p51 != p61)
{
//ucg.setColor(255, 255, 255);
ucg.setColor(0, 0, 0);
for (int qy3 = 39 ; qy3 < 60; qy3++)
{
// ucg.drawHLine(zet+28, qy + igrec1 , 21);
// ucg.drawHLine(zeti+40, qy3 + igreci, 42);
ucg.drawHLine(zeti+61, qy3 + igreci, 42);
}
}
int p5 = p3 - p51*10;
int p6 = p4 - p61*10;
// sterg unitati daca e cazul
//if ((t5 != t6) || (t5-t6>0.2))
if (p5 != p6)
{
//ucg.setColor(0, 255, 0);
ucg.setColor(0, 0, 0);
for (int qy4 = 39 ; qy4 < 60; qy4++)
{
// ucg.drawHLine(zeti+79, qy4 + igreci , 21);
ucg.drawHLine(zeti+100, qy4 + igreci , 21);
}
}
ucg.setColor(255, 255, 0);
ucg.setPrintPos(zeti, 30 + igreci);
ucg.print("presiune:");
//ucg.setFont(ucg_font_fub42n); // 20 pixel height
ucg.setPrintPos(40 + zeti, 60 + igreci);
//if (h3 > 10) ucg.print("+");
if (p3 > 10) ucg.print(" ");
else
{
//ucg.setColor(255, 255, 255);
ucg.setColor(0, 0, 0);
for (int qy5 = 39 ; qy5 < 60; qy5++)
{
// ucg.drawHLine(zeti+40, qy5 + igreci , 42);
ucg.drawHLine(zeti+61, qy5 + igreci , 42);
}
ucg.setColor(255, 255, 0);
ucg.setPrintPos(61 + zeti, 60 + igreci);
//ucg.print("+");
ucg.print(" ");
}
ucg.print(p3);
ucg.print("mm Hg");
}
I made few movies in time of tests, and 2 are in (my) english:- weather station with Arduino Due on ILI9341 2.2" TFT display
Bibliography:
1)Afisaj grafic color QVGA de 2,2" cu integrat ILI9341 conectat la Arduino
2)Afisaj grafic color QVGA de 2,2" cu integrat ILI9341 conectat la Arduino (2)
3)Afisaj grafic color QVGA de 2,2" cu integrat ILI9341 conectat la Arduino (3)
4)Afisaj grafic color QVGA de 2,2" cu integrat ILI9341 conectat la Arduino (4)
5)Arduino Due si afisajul QVGA de 2,2" (5,6cm) comandat de ILI9341
6)How to Connect a ILI9341 Display
7)http://arduino.cc/ (whole site, includind forum)
This was very helpful, because I am about to build my own weather station in stages, around a Pro Mini (3.3v version) ILI9341 display and the same BMP180 and DHT11 sensors. I'll use the BMP 180 temp function to give indoor/outdoor temps.
ReplyDeleteLater I intend to add an ESP8266 for wireless web serving, and stage 3 will be wind speed/direction using a small turbine pulsing a honeywell SS41 Hall Effect sensor, together with an i2c compass module for wind direction.
Your breadboard wire tangle problems would be solved by C-shaped clips.. They sell them in packs of many sizes! They go flat on the board :P
ReplyDeleteThis is a prototype.. I use PCB, not wire...
DeleteHello,
ReplyDeleteCan i use this with a 1.8 tft display?.
Greetings.
if is with ST7735 see newist article ;)
DeleteHello Sir Nicu,can you give me link of datasheet 1,8" tft lcd spi 160*128 for me,I want to know about pins,i have lcd that (st7735s of ESR GM328 kit multi tester)
Deleteyou think I can search better than you using google?
Delete