Descubra cómo construimos una caja de nogal con cola de milano y cómo usamos componentes Arduino fáciles de encontrar para construir un monitor de humedad y temperatura elegante y útil para la carpintería. Este proyecto de bricolaje muestra un poco de carpintería con colas de milano de nogal y electrónica para principiantes utilizando un Arduino Uno y algunas piezas excelentes de Adafruit.
Vivimos en el centro de Texas, donde experimentamos cambios masivos en la humedad y la temperatura en la primavera, lo que puede ser desastroso para ciertos proyectos de carpintería. Este proyecto genial ayuda a alertarnos cuando la humedad está cambiando o comienza a aumentar para que podamos tomar precauciones como mover nuestros proyectos de madera a la casa o no hacer ningún fresado durante el clima de alta humedad. ¡También se ve increíble y tiene nuestro dulce logo!
Somos nuevos en Arduino y Electrónica, así que aprendimos sobre la marcha al hacer esto. Estamos muy emocionados de hacer más proyectos ahora que sabemos lo fácil que es hacer grandes cosas.
Código
- Código del sensor Arduino Work Shop
Código del sensor de taller de Arduino Arduino
#include #include #include #include #include #include #include // Hay un montón de bibliotecas DHTXX que puedes encontrar en línea. Todos tienen diferentes niveles de características. // Definir Pines # definir TFT_CS 10 # definir TFT_RST 9 # definir TFT_DC 8 # definir DHT_PIN 2 # definir PIXEL_PIN 6 # definir PIXEL_NUM 24 # definir SD_PIN 4 # definir BMP_BUF 20 // Global Variablesint currentColor =9999; // (Los números corresponden a la tabla. Ver más abajo.) 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 ("Iniciando"); // Comenzar DHT dht.begin (); // Inicializar la pantalla LCD tft.initR (INITR_144GREENTAB); // Inicializar la tarjeta SD Serial.print ("Inicializando la tarjeta SD"); if (! SD.begin (SD_PIN)) {Serial.println ("¡Falló!"); regreso; } // Establecer el fondo de la pantalla en negro tft.fillScreen (ST7735_BLACK); // Inicializar LEDs FastLED.addLeds (leds, PIXEL_NUM); // Deje que todo se ponga al día antes de iniciar el ciclo delay (500);} // LOOPvoid loop () {// Obtener los datos del sensor dht.readTemperature (); dht.readHumidity (); int f =dht.temperature_F; // Grados en Fahrenheit int h =dht.humidity; // Porcentaje // Dibujar icono de grados tft.fillCircle (102, 42, 6, ST7735_WHITE); tft.fillCircle (102, 42, 4, ST7735_BLACK); // Dibujar temperatura en la pantalla LCD drawTemperature (f); // Humedad setHumidityColors (h); // Imprimir datos en el monitor serial Serial.print ("Temperatura:"); Serial.println (f); Serial.print ("Humedad:"); Serial.print (h); Serial.println ("%"); // Retraso de retardo (1000); } // Dibujar mapa de bits - Esto es para la pantalla LCD bmpDraw (char * nombre de archivo, uint8_t x, uint8_t y) {Archivo bmpFile; int bmpWidth, bmpHeight; // W + H en píxeles uint8_t bmpDepth; // Profundidad de bits (actualmente debe ser 24) uint32_t bmpImageoffset; // Inicio de los datos de la imagen en el archivo uint32_t rowSize; // No siempre =bmpWidth; puede tener relleno uint8_t sdbuffer [3 * BMP_BUF]; // búfer de píxeles (R + G + B por píxel) uint8_t buffidx =sizeof (sdbuffer); // Posición actual en sdbuffer boolean goodBmp =false; // Establecer en verdadero en un encabezado válido parse boolean flip =true; // BMP se almacena de abajo hacia arriba int w, h, row, col; uint8_t r, g, b; uint32_t pos =0, hora de inicio =milis (); if ((x> =tft.width ()) || (y> =tft.height ())) return; // Serial.println (); // Serial.print ("Cargando imagen de mapa de bits:'"); // Serial.print (nombre de archivo); // Serial.println ('\' '); // Abrir el archivo solicitado en la tarjeta SD if ((bmpFile =SD.open (nombre de archivo)) ==NULL) {Serial.print ("¡Archivo de mapa de bits no encontrado!"); regreso; } // Analizar el encabezado BMP if (read16 (bmpFile) ==0x4D42) {read32 (bmpFile); (vacío) read32 (bmpFile); bmpImageoffset =read32 (bmpFile); //Serial.println ()); read32 (bmpFile); bmpWidth =read32 (bmpFile); bmpHeight =read32 (bmpFile); if (read16 (bmpFile) ==1) {bmpDepth =read16 (bmpFile); //Serial.print("Bit Depth:"); if ((bmpDepth ==24) &&(read32 (bmpFile) ==0)) {goodBmp =true; // Las filas BMP se rellenan (si es necesario) hasta un límite de 4 bytes. RowSize =(bmpWidth * 3 + 3) &~ 3; // Si bmpHeight es negativo, la imagen está en orden de arriba hacia abajo. // Esto no es canon pero se ha observado en la naturaleza. if (bmpHeight <0) {bmpHeight =-bmpHeight; flip =falso; } // Área de cultivo a cargar w =bmpWidth; h =bmpHeight; si ((x + w-1)> =tft.width ()) w =tft.width () - x; if ((y + h-1)> =tft.height ()) h =tft.height () - y; // Establecer la ventana de dirección TFT a los límites de la imagen recortada tft.setAddrWindow (x, y, x + w-1, y + h-1); for (fila =0; fila =sizeof (sdbuffer)) {bmpFile.read (sdbuffer, sizeof (sdbuffer)); buffidx =0; } // Convierta el píxel de formato BMP a TFT, presione para mostrar b =sdbuffer [buffidx ++]; g =sdbuffer [buffidx ++]; r =sdbuffer [buffidx ++]; tft.pushColor (tft.Color565 (r, g, b)); }}}}} bmpFile.close (); if (! goodBmp) Serial.println ("No se reconoce el formato BMP.");} // Esto es para el mapa de bits / LCD Screenuint16_t read16 (File f) {uint16_t result; ((uint8_t *) &resultado) [0] =f.read (); // LSB ((uint8_t *) &resultado) [1] =f.read (); // MSB devuelve resultado;} // Esto es para el mapa de bits / LCD Screenuint32_t read32 (Archivo f) {uint32_t result; ((uint8_t *) &resultado) [0] =f.read (); // LSB ((uint8_t *) &resultado) [1] =f.read (); ((uint8_t *) &resultado) [2] =f.read (); ((uint8_t *) &resultado) [3] =f.read (); // MSB devuelve el resultado;} // Dibuja la temperatura en la pantalla LCDvoid drawTemperature (int temp) {// Obtiene el número de dígitos en la temperatura int digits =numDigits (temp); // Definir posiciones de cursor para dibujar mapas de bits 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]; // Obtener el primer dígito itoa (temp% 10, digit1,10); //Serial.println(temp% 10); strcpy (digitStr1, ""); strcat (digitStr1, digit1); strcat (digitStr1, ".bmp"); // Obtener el segundo dígito if (dígitos ==2) {itoa ((temp / 10)% 10, digit2,10); strcpy (digitStr2, ""); strcat (digitStr2, digit2); strcat (digitStr2, ".bmp"); } // Obtener el tercer dígito if (dígitos ==3) {itoa ((temp / 100)% 10, digit3,10); strcpy (digitStr3, ""); strcat (digitStr3, digit3); strcat (digitStr3, ".bmp"); } if (dígitos> 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); }} // Obtener el número de dígitos de la temperatura para determinar la ubicación en screenint numDigits (int número) {int valLen =0; si (número> 99) valLen =3; else valLen =2; return valLen;} // Establecer LED Colorsvoid setColors (int r, int g, int b) {for (int i =0; i Piezas y carcasas personalizadas
Esquemas
Fritzing no tenía la mayoría de los componentes reales, así que hice todo lo posible para representar el flujo de las cosas.