Leer hoe we een walnoothouten zwaluwstaartkast hebben gebouwd en eenvoudig te vinden Arduino-componenten hebben gebruikt om een stijlvolle en nuttige vochtigheids- en temperatuurmonitor voor de houtwinkel te bouwen. Dit doe-het-zelf-project toont een beetje houtbewerking met walnootzwaluwstaarten en beginnerselektronica met behulp van een Arduino Uno en enkele uitstekende onderdelen van Adafruit.
We wonen in Centraal-Texas, waar we in de lente enorme schommelingen in vochtigheid en temperatuur krijgen, wat rampzalig kan zijn voor bepaalde houtbewerkingsprojecten. Dit coole project helpt ons te waarschuwen wanneer de luchtvochtigheid verandert of hoog begint te worden, zodat we voorzorgsmaatregelen kunnen nemen, zoals het verplaatsen van onze houtprojecten naar huis, of niet frezen tijdens het hoge luchtvochtigheidsweer. Het ziet er ook geweldig uit en heeft ons lieve logo!
Arduino en elektronica zijn nieuw voor ons, dus we leerden gaandeweg bij het maken hiervan. We zijn erg enthousiast om meer projecten te maken nu we weten hoe gemakkelijk het is om geweldige dingen te maken.
Code
- Arduino werkplaatssensorcode
Arduino-werkplaatssensorcodeArduino
#include #include #include #include #include #include #include // Er zijn een heleboel DHTXX-bibliotheken die je online kunt vinden. Ze hebben allemaal verschillende niveaus van functies.// Define Pins#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 // Global Variablesint currentColor =9999; //(Cijfers komen overeen met grafiek. Zie hieronder.)CRGB leds [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("Bezig met opstarten."); // Begin DHT dht.begin(); // Initialiseer LCD-scherm tft.initR (INITR_144GREENTAB); // Initialiseer SD-kaart Serial.print ("Initialiseren SD-kaart."); if (!SD.begin(SD_PIN)) { Serial.println("Mislukt!"); opbrengst; } // Schermachtergrond instellen op zwart tft.fillScreen (ST7735_BLACK); // Initialiseer LED's FastLED.addLeds(leds, PIXEL_NUM); // Laat alles inhalen voordat de lusvertraging (500) wordt gestart;}// LOOPvoid loop() { // Get Sensor Data dht.readTemperature(); dht.readVochtigheid(); int f =dht.temperatuur_F; // Graden in Fahrenheit int h =dht.vochtigheid; // Percentage // Teken gradenpictogram tft.fillCircle(102, 42, 6, ST7735_WHITE); tft.fillCircle(102, 42, 4, ST7735_BLACK); // Teken temperatuur op LCD-scherm drawTemperature(f); // VochtigheidssetHumidityColors(h); //Gegevens afdrukken naar seriële monitor Serial.print ("Temperatuur:"); Serieel.println(f); Serial.print("Vochtigheid:"); Seriële.print(h); Serieel.println("%"); // Vertragingsvertraging (1000); }// Draw Bitmap - Dit is voor het LCD-schermvoid bmpDraw(char *bestandsnaam, uint8_t x, uint8_t y) { Bestand bmpFile; int bmpBreedte, bmpHoogte; // B+H in pixels uint8_t bmpDepth; // Bitdiepte (moet momenteel 24 zijn) uint32_t bmpImageoffset; // Begin van afbeeldingsgegevens in bestand uint32_t rowSize; // Niet altijd =bmpWidth; heeft mogelijk opvulling uint8_t sdbuffer [3*BMP_BUF]; // pixelbuffer (R+G+B per pixel) uint8_t buffidx =sizeof(sdbuffer); // Huidige positie in sdbuffer boolean goodBmp =false; // Ingesteld op true op geldige header parse boolean flip =true; // BMP wordt van onder naar boven opgeslagen int w, h, rij, col; uint8_t r, g, b; uint32_t pos =0, startTime =millis(); if((x>=tft.width()) || (y>=tft.height())) return;// Serial.println();// Serial.print("Laden van bitmapafbeelding:'"); // Serial.print(bestandsnaam);// Serial.println('\''); // Open het gevraagde bestand op SD-kaart if ((bmpFile =SD.open(bestandsnaam)) ==NULL) { Serial.print ("Bitmap-bestand niet gevonden!"); opbrengst; } // BMP-header ontleden if(read16(bmpFile) ==0x4D42) { read32(bmpFile); (void)read32(bmpFile); bmpImageoffset =read32(bmpFile); //Seriële.println()); read32(bmpFile); bmpWidth =read32(bmpFile); bmpHeight =read32(bmpFile); if(read16(bmpFile) ==1) { bmpDepth =read16(bmpFile); //Serial.print ("Bitdiepte:"); if((bmpDepth ==24) &&(read32(bmpFile) ==0)) { goodBmp =true; // BMP-rijen worden opgevuld (indien nodig) tot 4-byte grens rowSize =(bmpWidth * 3 + 3) &~3; // Als bmpHeight negatief is, staat de afbeelding in de volgorde van boven naar beneden. // Dit is geen canon, maar is in het wild waargenomen. if(bmpHeight <0) { bmpHeight =-bmpHeight; omdraaien =onwaar; } // Te laden gewasgebied w =bmpWidth; h =bmpHoogte; if((x+w-1)>=tft.breedte()) w =tft.breedte() - x; if((y+h-1)>=tft.height()) h =tft.height() - y; // Stel TFT-adresvenster in op geknipte beeldgrenzen tft.setAddrWindow(x, y, x+w-1, y+h-1); for (row=0; row=sizeof(sdbuffer)) {bmpFile.read(sdbuffer, sizeof(sdbuffer)); buffx =0; } // Converteer pixel van BMP naar TFT-formaat, druk op om b =sdbuffer [buffidx++] weer te geven; g =sdbuffer[buffidx++]; r =sdbuffer[buffidx++]; tft.pushColor(tft.Color565(r,g,b)); } } } } } bmpFile.close(); if(!goodBmp) Serial.println("BMP-formaat niet herkend.");}// Dit is voor de Bitmap/LCD Screenuint16_t read16(File f) { uint16_t result; ((uint8_t *)&result)[0] =f.lezen(); // LSB ((uint8_t *)&result)[1] =f.read(); // MSB retourneert resultaat;}// Dit is voor de Bitmap/LCD Screenuint32_t read32 (File f) { uint32_t result; ((uint8_t *)&result)[0] =f.lezen(); // LSB ((uint8_t *)&result)[1] =f.read(); ((uint8_t *)&result)[2] =f.read(); ((uint8_t *)&result)[3] =f.read(); // MSB retourneert resultaat;}// Teken temperatuur op LCD-schermvoid drawTemperature (int temp) { // Get aantal cijfers in de temperatuur int digits =numDigits (temp); // Definieer cursorposities om bitmaps te tekenen int x1_2 =62; int x2_2 =32; int x1_3 =1; int x2_3 =1; int x3_3 =1; int y =38; char cijfer1[12]; char cijfer2[12]; char cijfer3[12]; char digitStr1[24]; char digitStr2[24]; char digitStr3[24]; // Get First Digit itoa (temp % 10, digit1,10); //Serial.println(temp% 10); strcpy(digitStr1, ""); strcat(cijferStr1, cijfer1); strcat(digitStr1, ".bmp"); // Haal het tweede cijfer op als (cijfers ==2) { itoa ((temp / 10) % 10, cijfer 2,10); strcpy(digitStr2, ""); strcat(cijferStr2, cijfer2); strcat(digitStr2, ".bmp"); } // Haal het derde cijfer op als (cijfers ==3){ itoa((temp / 100) % 10, digit3,10); strcpy(digitStr3, ""); strcat(cijferStr3, cijfer3); strcat(digitStr3, ".bmp"); } if(cijfers> 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); }}// Haal het aantal cijfers in temperatuur op om de plaatsing op screenint te bepalen numDigits(int number){int valLen =0; if(getal> 99) valLen =3; anders valLen =2; return valLen;}// Set LED Colorsvoid setColors(int r, int g, int b){ for(int i =0; i Aangepaste onderdelen en behuizingen
Schema's
Fritzing had niet de meeste van de eigenlijke componenten, dus ik deed mijn best om de stroom van dingen weer te geven.