Pelajari bagaimana kami membuat kasing pas kenari dan menggunakan komponen Arduino yang mudah ditemukan untuk membuat monitor kelembaban dan suhu yang stylish dan berguna untuk toko kayu. Proyek DIY ini menampilkan sedikit pengerjaan kayu dengan kenari pas dan elektronik pemula menggunakan Arduino Uno dan beberapa bagian luar biasa dari Adafruit.
Kami tinggal di Texas Tengah di mana kami mendapatkan perubahan besar dalam Kelembaban dan Suhu di Musim Semi, yang dapat menjadi bencana bagi proyek pengerjaan kayu tertentu. Proyek keren ini membantu mengingatkan kita ketika kelembaban berubah atau mulai tinggi sehingga kita dapat mengambil tindakan pencegahan seperti memindahkan proyek kayu kita ke dalam rumah, atau tidak melakukan penggilingan selama cuaca kelembaban tinggi. Itu juga terlihat luar biasa dan memiliki logo manis kami!
Kami baru mengenal Arduino dan Elektronik, jadi kami belajar sambil berjalan saat membuat ini. Kami sangat bersemangat untuk membuat lebih banyak proyek sekarang karena kami tahu betapa mudahnya membuat hal-hal hebat.
Kode
- Kode Sensor Toko Kerja Arduino
Kode Sensor Toko Kerja ArduinoArduino
#include #include #include #include #include #include #include // Ada banyak perpustakaan DHTXX yang dapat Anda temukan online. Semuanya memiliki tingkat fitur yang berbeda-beda.// Menentukan Pin#menentukan TFT_CS 10#menentukan TFT_RST 9#menentukan TFT_DC 8#menentukan DHT_PIN 2#menentukan PIXEL_PIN 6#menentukan PIXEL_NUM 24#menentukan SD_PIN 4#menentukan BMP_BUF saat ini 20 // Warna Global =Variabel 9999; //(Angka sesuai dengan grafik. Lihat di bawah.)LED CRGB[PIXEL_NUM];Adafruit_ST7735 tft =Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);DHT22 dht(DHT_PIN);int loopDelay =2000; //ms// SETUPvoid setup() { Serial.begin(9600); Serial.println("Memulai."); // Mulai DHT dht.begin(); // Inisialisasi Layar LCD tft.initR(INITR_144GREENTAB); // Inisialisasi Kartu SD Serial.print("Inisialisasi kartu SD."); if (!SD.begin(SD_PIN)) { Serial.println("Gagal!"); kembali; } // Atur Latar Belakang Layar menjadi Hitam tft.fillScreen(ST7735_BLACK); // Inisialisasi LED FastLED.addLeds(leds, PIXEL_NUM); // Biarkan semuanya menyusul sebelum memulai loop delay(500);}// LOOPvoid loop() { // Dapatkan Data Sensor dht.readTemperature(); dht.readHumidity(); int f =dht.temperature_F; // Derajat dalam Fahrenheit int h =dht.humidity; // Persentase // Gambar Derajat Ikon tft.fillCircle(102, 42, 6, ST7735_WHITE); tft.fillCircle(102, 42, 4, ST7735_BLACK); // Menggambar Suhu di Layar LCD drawTemperature(f); // Kelembaban setHumidityColors(h); //Mencetak Data ke Serial Monitor Serial.print("Suhu:"); Serial.println(f); Serial.print("Kelembaban :"); Serial.print(h); Serial.println("%"); // Penundaan penundaan(1000); }// Draw Bitmap - Ini untuk Screenvoid LCD bmpDraw(char *nama file, uint8_t x, uint8_t y) { File bmpFile; int lebar bmp, tinggi bmp; // W+H dalam piksel uint8_t bmpDepth; // Kedalaman bit (saat ini harus 24) uint32_t bmpImageoffset; // Mulai dari data gambar dalam file uint32_t rowSize; // Tidak selalu =bmpWidth; mungkin memiliki padding uint8_t sdbuffer[3*BMP_BUF]; // buffer piksel (R+G+B per piksel) uint8_t buffidx =sizeof(sdbuffer); // Posisi saat ini di sdbuffer boolean goodBmp =false; // Setel ke true pada header yang valid parse boolean flip =true; // BMP disimpan dari bawah ke atas int w, h, baris, col; uint8_t r, g, b; uint32_t pos =0, startTime =milis(); if((x>=tft.width()) || (y>=tft.height())) return;// Serial.println();// Serial.print("Memuat Gambar Bitmap:'"); // Serial.print(nama file);// Serial.println('\''); // Buka file yang diminta pada kartu SD if ((bmpFile =SD.open(filename)) ==NULL) { Serial.print("File bitmap tidak ditemukan!"); kembali; } // Parsing header BMP if(read16(bmpFile) ==0x4D42) { read32(bmpFile); (batal) read32(bmpFile); bmpImageoffset =read32(bmpFile); //Serial.println()); read32(berkas bmp); bmpWidth =read32(bmpFile); bmpHeight =read32(bmpFile); if(read16(bmpFile) ==1) { bmpDepth =read16(bmpFile); //Serial.print("Kedalaman Bit:"); if((bmpDepth ==24) &&(read32(bmpFile) ==0)) { goodBmp =true; // Baris BMP diisi (jika diperlukan) hingga batas 4-byte rowSize =(bmpWidth * 3 + 3) &~3; // Jika bmpHeight negatif, gambar dalam urutan top-down. // Ini bukan kanon tetapi telah diamati di alam liar. if(bmpHeight <0) { bmpHeight =-bmpHeight; membalik =salah; } // Pangkas area yang akan dimuat w =bmpWidth; h =tinggi bmp; if((x+w-1)>=tft.width()) w =tft.width() - x; if((y+h-1)>=tft.height()) h =tft.height() - y; // Setel jendela alamat TFT ke batas gambar terpotong tft.setAddrWindow(x, y, x+w-1, y+h-1); for (row=0; row=sizeof(sdbuffer)) { bmpFile.read(sdbuffer, sizeof(sdbuffer)); buffidx =0; } // Konversi piksel dari format BMP ke TFT, tekan ke tampilan b =sdbuffer[buffidx++]; g =sdbuffer[buffidx++]; r =sdbuffer[buffidx++]; tft.pushColor(tft.Color565(r,g,b)); } } } } } bmpFile.close(); if(!goodBmp) Serial.println("Format BMP tidak dikenali.");}// Ini untuk Bitmap/LCD Screenuint16_t read16(File f) { hasil uint16_t; ((uint8_t *)&result)[0] =f.read(); // LSB ((uint8_t *)&hasil)[1] =f.read(); // MSB mengembalikan hasil;}// Ini untuk Bitmap/LCD Screenuint32_t read32(File f) { hasil uint32_t; ((uint8_t *)&result)[0] =f.read(); // LSB ((uint8_t *)&hasil)[1] =f.read(); ((uint8_t *)&result)[2] =f.read(); ((uint8_t *)&result)[3] =f.read(); // MSB mengembalikan hasil;}// Menggambar Suhu pada Layar LCDvoid drawTemperature(int temp) { // Mendapatkan Jumlah Digit dalam Suhu int digits =numDigits(temp); // Tentukan Posisi Kursor untuk Menggambar Bitmap int x1_2 =62; int x2_2 =32; int x1_3 =1; int x2_3 =1; int x3_3 =1; int y =38; karakter angka1[12]; karakter digit2[12]; karakter angka3[12]; karakter digitStr1[24]; karakter digitStr2[24]; karakter digitStr3[24]; // Dapatkan Digit Pertama itoa(temp % 10, digit1,10); //Serial.println(temp % 10); strcpy(digitStr1, ""); strcat(digitStr1, digit1); strcat(digitStr1, ".bmp"); // Dapatkan Digit Kedua if(digit ==2){ itoa((temp / 10) % 10, digit2,10); strcpy(digitStr2, ""); strcat(digitStr2, digit2); strcat(digitStr2, ".bmp"); } // Dapatkan Digit Ketiga if(digit ==3){ itoa((temp / 100) % 10, digit3,10); strcpy(digitStr3, ""); strcat(digitStr3, digit3); strcat(digitStr3, ".bmp"); } if(digit> 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); }}// Dapatkan jumlah digit suhu untuk menentukan penempatan pada screenint numDigits(int number){ int valLen =0; if(angka> 99) valLen =3; lain valLen =2; return valLen;}// Atur Warna LEDvoid setColors(int r, int g, int b){ for(int i =0; i Suku cadang dan penutup khusus
Skema
Fritzing tidak memiliki sebagian besar komponen yang sebenarnya jadi saya melakukan yang terbaik untuk mewakili aliran hal.