1.8 TFT LCD - mcworkshop

Vai ai contenuti

1.8 TFT LCD

Technical Pages
Stazione meteo
TFT 1.8 Arduino Uno CH340 DHT 11 / DHT 22
temperatura, umidità e indice di calore

click per ingrandire
fig. 1

fig. 2

La stazione meteo è composta da Arduino compatibile, un DHT 11 sostituibile con DHT 22, e un TFT da1,8 basato su ST7735. A differenza di altre stazioni lo sketch calcola anche l'indice di calore, in inglese heat index e abbreviato HI. L’Umidex Index è l’indice bioclimatico che descrive il disagio fisiologico causato dalla combinazione della temperatura e dell’umidità dell’aria. In generale con un indice di calore inferiore a 29, seppur soggettivamente, non dovremmo percepire alcun disagio. Da 30 in sù, invece, dovremmo percepire una sensazione di disagio alla quale vanno associati comportamenti idonei. A 40, per esempio potremmo percepire malessere ed è comunque bene non fare attività fisica; a 46 siamo in soglia di pericolo e dopo i 54 le tabelle indicano pericolo di morte o colpo di calore. Ho suddiviso gli allarmi in 6 livelli: LIV 1 OK, LIV 2, LIV 3, ATTENZIONE LIV 4, PERICOLO LIV 5, ALLARME LIV MAX. Il sensore DHT11 non ama essere interrogato troppo spesso. Ho inserito quindi nel codice le seguenti righe:
unsigned long current = millis();
if ((current - last) >= 65000) {
La prima visualizzazione delle grandezze fisiche, dopo aver alimentato Arduino, le vedrete dopo 65.000 milli secondi, e anche ogni refresh avverrà dopo questo tempo. Appena acceso il sistema visualizzerete una schermata priva di ogni informazione (fig.2), trascorso il tempo impostato lo schermo vi apparirà come in figura 1.
Le connessioni del tft. Eistono almeno 2 modi per eseguire i collegamenti: utilizzare tutti gli ingressi analogici, oppure i pin da 8 a 13. Il tft riporta sui pin di uscita le seguenti diciture: CS, RST, RS, SDA, CLK NC, NC, NC, GND, GND, VCC.
Un GND può essere ignorato così come i pin NC. Restano: CS, RST, RS, SDA, CLK, GND, VCC.

- ATTENZIONE NON BASATE LE VOSTRE ATTIVITA' FIDANDOVI DI UN SOLO STRUMENTO AMATORIALE! -
- NON MI ASSUMO ALCUNA RESPONSABILITA' DERIVANTE DALL'USO -
Per quanto concerne la sensoristica potete consultare le pagine seguenti:

I collegamenti
VCC  5V
GND GND

DHT 11 al pin 7 come da sketch  #define DHTPIN 7

RST 8
RS 9
CS 10
SDA 11
CLK 13



i collegamenti definiti nello scketc
#define TFT_RST 8      (RST)
#define TFT_DC 9        (RS)
#define TFT_CS 10       (CS)
#define TFT_MOSI 11  (SDA)
#define TFT_SCLK 13  (CLK)

-------
Il codice lo trovate qui: https://pastebin.com/ynZLukLk

/*Stazione meteo
  16-4-2021
  display tft 1.8
  DHT11 si può sostituire con DHT 22
  open code mcworkshop
  Visualizzazione su monitor seriale attiva
  Interrogazione del DHT11 ogni 65 secondi
*/
#define TFT_CS 10
#define TFT_DC 9
#define TFT_RST 8
#define TFT_SCLK 13
#define TFT_MOSI 11
//
#include <Adafruit_GFX.h>
#include <Adafruit_ST7735.h>
#include <SPI.h>
#include <stdio.h>
//
#include <DHT.h>
#define DHTPIN 7 // DHT11 data pin is connected to Arduino 7 pin.
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
unsigned long last = 0;
//
#if defined(__SAM3X8E__)
#undef __FlashStringHelper::F(string_literal)
#define F(string_literal) string_literal
#endif
//Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);
//
#define COLOR1 ST7735_WHITE
#define COLOR2 ST7735_BLACK
//White theme
//#define COLOR1 ST7735_BLACK
//#define COLOR2 ST7735_WHITE
int text_color_humidex;
float humidity, temperature, humidex;
String message;
//
void setup(void)
{
 Serial.begin(9600);
 dht.begin();
 Serial.println("DHT Sensor Initalized");
 tft.initR(INITR_BLACKTAB);
 tft.fillScreen(COLOR2);
}
void testdrawtext(char* text, uint16_t color)
{
 tft.setCursor(0, 0);
 tft.setTextColor(color);
 tft.setTextWrap(true);
 tft.print(text);
}
void loop()
{
 unsigned long current = millis();
 if ((current - last) >= 65000) {
   humidity = dht.readHumidity();
   temperature = dht.readTemperature();
   Serial.print("umidità:   "); Serial.println(humidity);
   Serial.print("temperatura:   "); Serial.println(temperature);
   //humidex
   humidex = calculate_humidex(temperature, humidity);
   //
   tft.drawRect(0, 0, 128, 160, COLOR1);
   tft.drawLine(0, 50, 128, 50, COLOR1);
   tft.drawLine(0, 100, 128, 100, COLOR1);
   //
   temperature_to_lcd(temperature, 4);
   humidity_to_lcd(humidity, 55);
   humidex_to_lcd(humidex, 105);
   if ((current - last) >= 65000)
   {
     last = current;
   }
 }
}
//tft
void temperature_to_lcd(float temperature, unsigned char text_position)
{
 int text_color;
 tft.setCursor(4, text_position);
 tft.setTextColor(COLOR1, COLOR2);
 tft.setTextSize(1);
 tft.print("Temperatura:");
 tft.setTextSize(3);
 if (temperature > 0)
 {
   text_color = ST7735_BLUE;
 }
 else
 {
   text_color = ST7735_BLUE;
 }
 tft.setCursor(1, text_position + 20);
 fix_number_position(temperature);
 tft.setTextColor(text_color, COLOR2);
 tft.print(temperature, 1);
 tft.setCursor(108, text_position + 20);
 tft.print("C");
 tft.drawChar(90, text_position + 20, 247, text_color, COLOR2, 2);
}
//humidity tft
void humidity_to_lcd(float humidity, unsigned char text_position)
{
 tft.setTextColor(COLOR1, COLOR2);
 tft.setCursor(4, text_position);
 tft.setTextSize(1);
 tft.println("Umidita':");
 tft.setTextSize(3);
 tft.setCursor(1, text_position + 20);
 fix_number_position(humidity);
 tft.print(humidity, 1);
 tft.print(" %");
}
//Humidex tft indice di calore
void humidex_to_lcd(float humidex, unsigned char text_position)
{
 tft.setCursor(4, text_position);
 tft.setTextSize(1);
 tft.println("Humidex [6 livelli]:");
 tft.setTextSize(3);
 tft.setCursor(1, text_position + 17);
 if ((humidex >= 21) && (temperature < 44))
 {
   fix_number_position(humidex);
   get_humidex_color_warning_message(humidex);
   tft.setTextColor(text_color_humidex, COLOR2);
   tft.print(humidex, 1);
   tft.setCursor(108, text_position + 17);
   tft.print("C");
   tft.drawChar(90, text_position + 17, 247, text_color_humidex, COLOR2, 2); //degree symbol
   tft.setCursor(3, text_position + 43);
   tft.setTextSize(1);
   tft.print(message);
 }
 else
 {
   tft.print(" --.-");
   tft.setCursor(108, text_position + 17);
   tft.print("C");
   tft.drawChar(90, text_position + 17, 247, COLOR1, COLOR2, 2); //degree symbol
   tft.setCursor(1, text_position + 43);
   tft.setTextSize(1);
   tft.println(" ");
 }
 ;
}
void fix_number_position(float number)
{
 if ((number >= -40) && (number < -9.9))
 {
   ;
 }
 if ((number >= -9.9) && (number < 0.0))
 {
   tft.print(" ");
 }
 if ((number >= 0.0) && (number < 9.9))
 {
   tft.print(" ");
 }
 if ((number >= 9.9) && (number < 99.9))
 {
   tft.print(" ");
 }
 if ((number >= 99.9) && (number < 151))
 {
   tft.print("");
 }
}
uint16_t Color565(uint8_t r, uint8_t g, uint8_t b)
{
 return ((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3);
}
//function to calculete Humidex
float calculate_humidex(float temperature, float humidity)
{
 float e;
 e = (6.112 * pow(10, (7.5 * temperature / (237.7 + temperature))) * humidity / 100); //vapor pressure
 float humidex = temperature + 0.55555555 * (e - 10.0); //humidex
 return humidex;
}
void get_humidex_color_warning_message(float humidex)
{
 if ((humidex >= 21) && (humidex < 27))
 {
   text_color_humidex = Color565(0, 255, 0);
   message = "LIV 1 OK ";
 }
 if ((humidex >= 27) && (humidex < 30))
 {
   text_color_humidex = Color565(255, 255, 0);
   message = "LIV 2 ";
 }
 if ((humidex >= 30) && (humidex < 35))
 {
   text_color_humidex = Color565(255, 255, 0);
   message = "LIV 3 ";
 }
 if ((humidex >= 35) && (humidex < 40))
 {
   text_color_humidex = Color565(255, 0, 0);
   message = " ATTENZIONE LIV 4 ";
 }
 if ((humidex >= 40) && (humidex < 55))
 {
   text_color_humidex = Color565(255, 0, 0);
   message = "PERICOLO LIV 5 ";
 }
 if ((humidex >= 55))
 {
   text_color_humidex = Color565(255, 0, 0);
   message = "ALLARME LIV MAX ";
 }
}
Sito non a scopo di lucro /sito didattico, hobbistico / no pubblicità / no aggiornamento periodico / schemi e codici di pubblico dominio
ultimo aggiornamento: 12/09/21
Privacy Policy
Cookie Policy
Clicca sulle scritte!
Torna ai contenuti