Kit Sensor Kelembaban & Suhu Premium dengan Kotak Walnut – Arduino + NeoPixel + Layar TFT
Komponen dan Perlengkapan
| Arduino UNO | 1 |
| Adafruit NeoPixel Ring: WS2812 5050 RGB LED | 1 |
| Sensor Suhu DHT22 | 1 |
| Layar TFT LCD Warna 1.44 inci Adafruit dengan breakout MicroSD Card - ST7735R | 1 |
| Papan roti (breadboard umum) | 1 |
| Tampung baterai 4xAA | 1 |
| Kabel jumper (umum) | 1 |
Alat dan Mesin yang Diperlukan
| Pengkol (soldering iron umum) |
| Pistol lem panas (hot glue gun umum) |
Tentang Proyek Ini
Di Balik Proyek Ini
Kami mempelajari cara membuat kotak pasang walnut dan menggunakan komponen Arduino yang mudah ditemukan untuk membangun pemantau kelembaban dan suhu yang stylish serta berguna untuk bengkel kayu. Proyek DIY ini menggabungkan sedikit keterampilan kayu dengan pasang walnut serta elektronika tingkat pemula menggunakan Arduino Uno dan beberapa komponen unggulan dari Adafruit.
Kami tinggal di Texas Tengah, di mana fluktuasi kelembaban dan suhu yang besar terjadi pada musim semi, yang bisa merusak proyek kayu tertentu. Proyek cerdas ini membantu memberi peringatan ketika kelembaban berubah atau mulai tinggi, sehingga kami dapat mengambil langkah pencegahan seperti memindahkan proyek kayu ke dalam rumah, atau tidak melakukan penggergajian selama cuaca kelembaban tinggi. Tampilannya juga sangat keren dan memiliki logo favorit kami!
Kami baru dalam Arduino dan elektronika, jadi kami belajar sambil membuatnya. Kami sangat bersemangat untuk membuat lebih banyak proyek sekarang setelah mengetahui seberapa mudahnya menciptakan hal-hal yang hebat.
Tonton Video Pembangunan Detail!
Video tutorial tersedia untuk memandu Anda melalui setiap langkah pembangunan.
Kode
- Kode Sensor Bengkel Arduino
Kode Sensor Bengkel Arduino Arduino
#include <Adafruit_NeoPixel.h>
#include <Adafruit_ST7735.h>
#include <Adafruit_GFX.h>
#include <FastLED.h>
#include <SPI.h>
#include <SD.h>
#include <cactus_io_DHT22.h>
// Definisi pin
#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
// Variabel global
int currentColor = 9999;
CRGB leds[PIXEL_NUM];
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);
DHT22 dht(DHT_PIN);
int loopDelay = 2000; // ms
void setup() {
Serial.begin(9600);
Serial.println("Memulai...");
dht.begin();
tft.initR(INITR_144GREENTAB);
Serial.print("Menginisialisasi kartu SD...");
if (!SD.begin(SD_PIN)) {
Serial.println("Gagal!");
return;
}
tft.fillScreen(ST7735_BLACK);
FastLED.addLeds<NEOPIXEL, PIXEL_PIN>(leds, PIXEL_NUM);
delay(500);
}
void loop() {
dht.readTemperature();
dht.readHumidity();
int f = dht.temperature_F;
int h = dht.humidity;
tft.fillCircle(102, 42, 6, ST7735_WHITE);
tft.fillCircle(102, 42, 4, ST7735_BLACK);
drawTemperature(f);
setHumidityColors(h);
Serial.print("Suhu: ");
Serial.println(f);
Serial.print("Kelembaban: ");
Serial.print(h);
Serial.println("%");
delay(1000);
}
void bmpDraw(char *filename, uint8_t x, uint8_t y) {
// Fungsi untuk menggambar bitmap pada layar TFT
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;
if ((x >= tft.width()) || (y >= tft.height())) return;
if ((bmpFile = SD.open(filename)) == NULL) {
Serial.print("File bitmap tidak ditemukan!");
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;
}
int w = bmpWidth;
int 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 (int row = 0; row < h; row++) {
uint32_t pos = flip ? bmpImageoffset + (bmpHeight - 1 - row) * rowSize : bmpImageoffset + row * rowSize;
if (bmpFile.position() != pos) {
bmpFile.seek(pos);
buffidx = sizeof(sdbuffer);
}
for (int col = 0; col < w; col++) {
if (buffidx >= sizeof(sdbuffer)) {
bmpFile.read(sdbuffer, sizeof(sdbuffer));
buffidx = 0;
}
uint8_t b = sdbuffer[buffidx++];
uint8_t g = sdbuffer[buffidx++];
uint8_t r = sdbuffer[buffidx++];
tft.pushColor(tft.Color565(r, g, b));
}
}
}
}
}
bmpFile.close();
if (!goodBmp) Serial.println("Format BMP tidak dikenali.");
}
uint16_t read16(File f) {
uint16_t result;
((uint8_t *)&result)[0] = f.read();
((uint8_t *)&result)[1] = f.read();
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;
}
void drawTemperature(int temp) {
int digits = numDigits(temp);
int x1_2 = 62, x2_2 = 32;
int x1_3 = 1, x2_3 = 1, x3_3 = 1;
int y = 38;
char digit1[12], digit2[12], digit3[12];
char digitStr1[24], digitStr2[24], 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) {
return (number > 99) ? 3 : 2;
}
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) {
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:
if (currentColor != 0) setColors(cRed[0], cRed[1], cRed[2]);
currentColor = 0;
break;
case 1:
if (currentColor != 1) setColors(cOrange[0], cOrange[1], cOrange[2]);
currentColor = 1;
break;
case 2:
if (currentColor != 2) setColors(cYellow[0], cYellow[1], cYellow[2]);
currentColor = 2;
break;
case 3:
if (currentColor != 3) setColors(cGreen[0], cGreen[1], cGreen[2]);
currentColor = 3;
break;
case 4:
if (currentColor != 4) setColors(cBlue[0], cBlue[1], cBlue[2]);
currentColor = 4;
break;
case 5:
if (currentColor != 5) setColors(cPurple[0], cPurple[1], cPurple[2]);
currentColor = 5;
break;
}
}
Bagian Kustom dan Kotak
Skematik
Fritzing tidak memiliki sebagian besar komponen aktual, jadi saya melakukan representasi terbaik dari alur rangkaian.