Kit Sensor de Umidade e Temperatura em Estojo de Nogueira Premium – Arduino + NeoPixel + Display TFT
Componentes e Materiais
| Componente | Quantidade |
|---|---|
| Arduino UNO | 1 |
| Anel NeoPixel Adafruit: WS2812 5050 RGB LED | 1 |
| Sensor de Temperatura DHT22 | 1 |
| Display TFT LCD Colorido 1.44" Adafruit com MicroSD - ST7735R | 1 |
| Protoboard (genérica) | 1 |
| Suporte para 4 pilhas AA | 1 |
| Fios jumpers (genéricos) | 1 |
Ferramentas e Máquinas Necessárias
- Ferro de solda (genérico)
- Pistola de cola quente (genérica)
Sobre o Projeto
A História por Trás deste Projeto
Aprenda como construímos um estojo de nogueira com encaixes tipo cauda de andorinha e usamos componentes Arduino fáceis de encontrar para criar um monitor de umidade e temperatura elegante e útil para a marcenaria. Este projeto DIY mostra um pouco de marcenaria com encaixes de nogueira e eletrônica para iniciantes usando um Arduino Uno e excelentes peças da Adafruit.
Moramos no centro do Texas, onde ocorrem grandes variações de umidade e temperatura na primavera, o que pode ser desastroso para certos projetos de marcenaria. Este projeto legal nos alerta quando a umidade está mudando ou começa a ficar alta, para que possamos tomar precauções, como mover nossos projetos de madeira para dentro de casa ou evitar usinagem durante o tempo de alta umidade. Também fica incrível e tem nosso logo!
Somos novos em Arduino e Eletrônica, então aprendemos conforme fomos fazendo. Estamos muito animados para fazer mais projetos agora que sabemos como é fácil criar coisas incríveis.
Assista ao Vídeo Detalhado da Construção!
Código
Código do Sensor da Oficina Arduino
#include
#include
#include
#include
#include
#include
#include
// Existem várias bibliotecas DHTXX online. Todas têm níveis variados de recursos.
// Definição dos Pinos
#define TFT_CS 10
#define TFT_RST 9
#define TFT_DC 8
#define DHT_PIN 2
#define PIXEL_PIN 6
#define PIXEL_NUM 24
#define SD_PIN 4
#define BMP_BUF 20
// Variáveis Globais
int currentColor = 9999; // (Números correspondem ao gráfico. Veja abaixo.)
CRGB leds[PIXEL_NUM];
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);
DHT22 dht(DHT_PIN);
int loopDelay = 2000; //ms
// SETUP
void setup() {
Serial.begin(9600);
Serial.println("Iniciando.");
// Inicia DHT
dht.begin();
// Inicializa Tela LCD
tft.initR(INITR_144GREENTAB);
// Inicializa Cartão SD
Serial.print("Inicializando cartão SD.");
if (!SD.begin(SD_PIN)) {
Serial.println("Falhou!");
return;
}
// Define fundo da tela como preto
tft.fillScreen(ST7735_BLACK);
// Inicializa LEDs
FastLED.addLeds(leds, PIXEL_NUM);
// Aguarda tudo estabilizar antes de iniciar o loop
delay(500);
}
// LOOP
void loop() {
// Obtém Dados do Sensor
dht.readTemperature();
dht.readHumidity();
int f = dht.temperature_F; // Graus em Fahrenheit
int h = dht.humidity; // Porcentagem
// Desenha ícone de graus
tft.fillCircle(102, 42, 6, ST7735_WHITE);
tft.fillCircle(102, 42, 4, ST7735_BLACK);
// Desenha Temperatura na Tela LCD
drawTemperature(f);
// Umidade
setHumidityColors(h);
// Imprime Dados no Monitor Serial
Serial.print("Temperatura: ");
Serial.println(f);
Serial.print("Umidade: ");
Serial.print(h);
Serial.println("%");
// Atraso
delay(1000);
}
// Desenha Bitmap - Para a Tela LCD
void bmpDraw(char *filename, uint8_t x, uint8_t y) {
File bmpFile;
int bmpWidth, bmpHeight;
uint8_t bmpDepth;
uint32_t bmpImageoffset;
uint32_t rowSize;
uint8_t sdbuffer[3*BMP_BUF];
uint8_t buffidx = sizeof(sdbuffer);
boolean goodBmp = false;
boolean flip = true;
int w, h, row, col;
uint8_t r, g, b;
uint32_t pos = 0, startTime = millis();
if((x >= tft.width()) || (y >= tft.height())) return;
if ((bmpFile = SD.open(filename)) == NULL) {
Serial.print("Arquivo bitmap não encontrado!");
return;
}
if(read16(bmpFile) == 0x4D42) {
read32(bmpFile);
(void)read32(bmpFile);
bmpImageoffset = read32(bmpFile);
read32(bmpFile);
bmpWidth = read32(bmpFile);
bmpHeight = read32(bmpFile);
if(read16(bmpFile) == 1) {
bmpDepth = read16(bmpFile);
if((bmpDepth == 24) && (read32(bmpFile) == 0)) {
goodBmp = true;
rowSize = (bmpWidth * 3 + 3) & ~3;
if(bmpHeight < 0) {
bmpHeight = -bmpHeight;
flip = false;
}
w = bmpWidth;
h = bmpHeight;
if((x+w-1) >= tft.width()) w = tft.width() - x;
if((y+h-1) >= tft.height()) h = tft.height() - y;
tft.setAddrWindow(x, y, x+w-1, y+h-1);
for (row=0; row= sizeof(sdbuffer)) {
bmpFile.read(sdbuffer, sizeof(sdbuffer));
buffidx = 0;
}
b = sdbuffer[buffidx++];
g = sdbuffer[buffidx++];
r = sdbuffer[buffidx++];
tft.pushColor(tft.Color565(r,g,b));
}
}
}
}
}
bmpFile.close();
if(!goodBmp) Serial.println("Formato BMP não reconhecido.");
}
uint16_t read16(File f) {
uint16_t result;
((uint8_t *)&result)[0] = f.read(); // LSB
((uint8_t *)&result)[1] = f.read(); // MSB
return result;
}
uint32_t read32(File f) {
uint32_t result;
((uint8_t *)&result)[0] = f.read();
((uint8_t *)&result)[1] = f.read();
((uint8_t *)&result)[2] = f.read();
((uint8_t *)&result)[3] = f.read();
return result;
}
// Desenha Temperatura na Tela LCD
void drawTemperature(int temp) {
int digits = numDigits(temp);
int x1_2 = 62;
int x2_2 = 32;
int x1_3 = 1;
int x2_3 = 1;
int x3_3 = 1;
int y = 38;
char digit1[12];
char digit2[12];
char digit3[12];
char digitStr1[24];
char digitStr2[24];
char digitStr3[24];
itoa(temp % 10, digit1,10);
strcpy(digitStr1, "");
strcat(digitStr1, digit1);
strcat(digitStr1, ".bmp");
if(digits == 2){
itoa((temp / 10) % 10, digit2,10);
strcpy(digitStr2, "");
strcat(digitStr2, digit2);
strcat(digitStr2, ".bmp");
}
if(digits == 3){
itoa((temp / 100) % 10, digit3,10);
strcpy(digitStr3, "");
strcat(digitStr3, digit3);
strcat(digitStr3, ".bmp");
}
if(digits > 2){
bmpDraw(digitStr1,x1_3,y);
bmpDraw(digitStr2,x2_3,y);
bmpDraw(digitStr3,x3_3,y);
} else {
bmpDraw(digitStr1,x1_2,y);
bmpDraw(digitStr2,x2_2,y);
}
}
int numDigits(int number){
int valLen = 0;
if(number > 99) valLen = 3;
else valLen = 2;
return valLen;
}
void setColors(int r, int g, int b){
for(int i = 0; i < PIXEL_NUM; i++){
leds[i].setRGB(r, g, b);
leds[i].fadeLightBy(125);
FastLED.show();
delay(100);
}
}
void setHumidityColors(int humidity){
// Gráfico de Cores de Umidade - Algo que criamos.
// Vermelho - 0-17%
// Laranja - 18-34%
// Amarelo - 35-51%
// Verde - 52-68%
// Azul - 69-85%
// Roxo - 86-100%
int cRed[3] = {255,0,0};
int cOrange[3] = {255,90,0};
int cYellow[3] = {255,255,0};
int cGreen[3] = {0,255,0};
int cBlue[3] = {0,175,255};
int cPurple[3] = {255,0,255};
int range = map(humidity, 0, 100, 0, 6);
switch (range) {
case 0: // Vermelho
if(currentColor == 0){ break; }
else { setColors(cRed[0], cRed[1], cRed[2]); currentColor = 0; }
break;
case 1: // Laranja
if(currentColor == 1){ break; }
else { setColors(cOrange[0], cOrange[1], cOrange[2]); currentColor = 1; }
break;
case 2: // Amarelo
if(currentColor == 2){ break; }
else { setColors(cYellow[0], cYellow[1], cYellow[2]); currentColor = 2; }
break;
case 3: // Verde
if(currentColor == 3){ break; }
else { setColors(cGreen[0], cGreen[1], cGreen[2]); currentColor = 3; }
break;
case 4: // Azul
if(currentColor == 4){ break; }
else { setColors(cBlue[0], cBlue[1], cBlue[2]); currentColor = 4; }
break;
case 5: // Roxo
if(currentColor == 5){ break; }
else { setColors(cPurple[0], cPurple[1], cPurple[2]); currentColor = 5; }
break;
}
}
Peças Personalizadas e Gabinetes
Design do estojo em nogueira (arquivo CAD).
Esquemáticos
O Fritzing não tinha a maioria dos componentes reais, então fiz o melhor para representar o fluxo das conexões.
Processo de manufatura
- Sensores de Umidade: Como Funcionam e Principais Aplicações
- Sensor DHT11: Como Funciona e Principais Aplicações
- Sensirion SVM30: Módulo Multi-Gás, Umidade e Temperatura All-in-One para Purificadores de Ar e HVAC
- Construa um Sensor de Temperatura Remoto com Raspberry Pi e Python – Guia Passo a Passo
- Monitoramento Contínuo de Temperatura e Umidade no Raspberry Pi com EzTemp
- Construa um Sistema de Monitoramento de Temperatura e Luz Multi-Sensor com Raspberry Pi e DS18B20
- Construa um Sistema Aeropônico Automatizado com Raspberry Pi e Sensor de Umidade
- Construa Monitor de Temperatura Doméstico com Raspberry Pi, MCP9808, InfluxDB e Grafana
- Verifique e Calibre Seu Sensor de Umidade para Medições Precisas
- Sensor Lab-On-Chip da NASA Goddard Fornece Monitoramento de Fluxo e Temperatura em Tempo Real