Lav en elektrisk ventilator med FireBeetle Board ESP32: 8 trin (med billeder)

Lav en elektrisk ventilator med FireBeetle Board ESP32: 8 trin (med billeder)

Indholdsfortegnelse:

Anonim

Sommeren kommer med støt stigende varme. Nu er det et rigtigt tidspunkt at forberede en sommer ting - Derfor har jeg købt en lille fander på linjen; det er godt bortset fra at det ikke kan styre.

Men er dette et problem? Ingen! Som kreativ ingeniør er det min showtid!

forsyninger:

Trin 1: Hardware i brug

FireBeetle ESP32 controller × 1

FireBeetle Covers-Gravity I / O Expansion Shield × 1

Gravity: I2C OLED-2864 Skærm × 1

BME temperaturfugtighedsføler × 1

EC11J roterende encoder × 1

9g mikro servo (1,6kg) × 1

Dupont line × 10 Crust trykt af Overlord 3D printer × 1

* Intet behov for lodning under hele arbejdsprocessen.

Trin 2: Hardwareforbindelse

Tilslut I2C-grænsefladen af ​​OLED12864 direkte til I2C-grænsefladen af ​​Gravity Expansion Shield, og tilslut A af EC11J roterende encoder til D0, B til D1, C til D8. Derefter forbinder mikro servo til D3 og forbinder SPI interface af BME280 direkte til SPI interface af Gravity Expansion skjold, CS (Chip Select) til D5.

Kredsløbsdiagrammet er som nedenfor:

Trin 3: Udskriv skorpen med 3D-printer.

Klik her for at downloade programmet og kildekoden til 3D-udskrivning.

Dette er trykt af Overlord 3d printer.

Trin 4: Fastgør rotationsgiveren til skorstenen

Fix med holt-smelte lim

Tilslut EC11J til Gravity Board med Dupont

Trin 5: Fix OLED2864 til skorstenen

Tilslut OLED display til Gravity board med Dupont og tilslutningsgrænsefladen er I2C

Trin 6: Tilslut BME280

BME280 bruger SPI interface, se venligst det forrige kredsløbsdiagram for detaljer om tilslutning

Trin 7: Alloker fanen

Fjern lithiumbatteriet og tilslut ventilatorens strømforsyning til Vcc og GND fra FireBeetle ESP32, kant forbinder lithiumbatteriet med FireBeetle ESP32. Indstil derefter mikro servo til D3.

Fix Dupont-ledninger med holt-smeltelim

Sæt mikro servo med holt-smelte lim

Trin 8: Komplet maskinmontering

Dæk bunden og reparer den med smeltelim, og download programmet.

Kode

#include // Kun nødvendig for Arduino 1.6.5 og tidligere

#include #include "SSD1306.h" // alias for `#include 'SSD1306Wire.h" `#include" OLEDDisplayUi.h "#include" images.h "#include #include #define SEA_LEVEL_PRESSURE 1013.25f #define BME_CS D5 SimpleTimer timer; int timeCounter = 0; boolean uiEnable = true; DFRobot_BME280 bme (BME_CS); // SPI SSD1306 display (0x3c, D7, D6); Servo mymotor; OLEDDisplayUi ui (& display); enum model {MODEL_NULL, MODEL_LEFT, MODEL_RIGHT, MODEL_BUTTON}; enum setFrame {SET_NULL, SET_FRAME_2_ON, SET_FRAME_2_OFF, SET_FRAME_3_ON, SET_FRAME_3_OFF}; enum motorModel {MOTOR_AUTO, MOTOR_STATIC}; char commondModel = MODEL_NULL; char setFrameValue = SET_NULL; char motorState = MOTOR_STATIC; int encoderPinA = D0; int encoderPinB = D1; int knapPin = D8; flygtige int lastEncoded = 0; flygtig lang encoderValue = 0; lang lastencoderValue = 0; int sidsteMSB = 0; int lastLSB = 0; int speedValue = 5; int angleValue = 90; booleanske dir = true; int frameIndex = 0; lang readEncoderValue (void) {return encoderValue / 4; } boolsk isButtonPushDown (void) {if (! digitalRead (buttonPin)) {forsinkelse (5); hvis (! digitalRead (buttonPin)) {while (! digitalRead (buttonPin)); returnere sandt; }} returnere falsk; } void msOverlay (OLEDDisplay * display, OLEDDisplayUiState * tilstand) {hvis (frameIndex == 0) returnerer; skærm> setTextAlignment (TEXT_ALIGN_RIGHT); skærm> setFont (ArialMT_Plain_10); display-> drawString (128, 0, String (angleValue)); } void drawFrame1 (OLEDDisplay * display, OLEDDisplayUiState * tilstand, int16_t x, int16_t y) {display-> setTextAlignment (TEXT_ALIGN_LEFT); skærm> setFont (ArialMT_Plain_24); display-> drawString (15 + x, 10 + y, "ChoCho"); } void drawFrame2 (OLEDDisplay * display, OLEDDisplayUiState * tilstand, int16_t x, int16_t y) {float temp = bme.temperatureValue (); float pa = bme.pressureValue (); float hum = bme.altitudeValue (SEA_LEVEL_PRESSURE); flyde alt = bme.humidityValue (); // Viser de 3 inkluderede standardstørrelser. Skrifttyperne kommer fra SSD1306Fonts.h file // Udover standard skrifttyper vil der være et program til at konvertere TrueType-skrifttyper til dette format display-> setTextAlignment (TEXT_ALIGN_LEFT); skærm> setFont (ArialMT_Plain_16); display-> drawString (x, y, String ("Temp:") + String (temp)); display-> drawString (x, 17 + y, String ("Hum:") + String (alt)); display-> drawString (x, 34 + y, String ("Pa:") + String (pa)); } void drawFrame3 (OLEDDisplay * display, OLEDDisplayUiState * tilstand, int16_t x, int16_t y) {// Tekstjustering demo display-> setFont (ArialMT_Plain_16); // Koordinaterne definerer venstre startpunkt for tekstdisplayet-> setTextAlignment (TEXT_ALIGN_LEFT); display-> drawString (x, y, "Set Speed"); display-> drawString (40 + x, y + 17, streng (speedValue)); } void drawFrame4 (OLEDDisplay * display, OLEDDisplayUiState * tilstand, int16_t x, int16_t y) {// Tekstjustering demo display-> setFont (ArialMT_Plain_16); // Koordinaterne definerer venstre startpunkt for tekstdisplayet-> setTextAlignment (TEXT_ALIGN_LEFT); display-> drawString (x, y, "FAN Model"); hvis (motorstat == MOTOR_STATIC) {display-> drawString (40 + x, y + 27, "STATIC"); } ellers hvis (motorState == MOTOR_AUTO) {display-> drawString (40 + x, y + 27, "AUTO"); }} // Dette array holder funktionspegerne til alle rammer // rammer er de enkelte visninger, der glider i FrameCallback rammer = {drawFrame1, drawFrame2, drawFrame3, drawFrame4}; // hvor mange rammer er der? int frameCount = 4; // Overlejringer er statisk tegnet oven på en ramme f.eks. et ur overlayCallback overlays = {msOverlay}; int overlaysCount = 1; void ec11Init (void) {pinMode (encoderPinA, INPUT); pinMode (encoderPinB, INPUT); pinMode (buttonPin, INPUT); digitalWrite (encoderPinA, HIGH); // drej pullup modstand på digitalWrite (encoderPinB, HIGH); // drej pullup modstand på attachInterrupt (D0, updateEncoder, CHANGE); attachInterrupt (D1, updateEncoder, CHANGE); } void displayInit (void) {ui.setTargetFPS (60); ui.setActiveSymbol (activeSymbol); ui.setInactiveSymbol (inactiveSymbol); ui.setIndicatorPosition (BOTTOM); ui.setIndicatorDirection (LEFT_RIGHT); ui.setFrameAnimation (SLIDE_LEFT); ui.setFrames (frames, frameCount); ui.setOverlays (overlays, overlaysCount); ui.disableAutoTransition (); ui.switchToFrame (frameIndex); ui.init (); display.flipScreenVertically (); } void motorInit (void) {mymotor.attach (D3); mymotor.write (speedValue); } void updateUi (void) {if (timeCounter> 50) {display.displayOff (); uiEnable = false; } ellers {display.displayOn (); uiEnable = true; timeCounter ++; } hvis (commondModel == MODEL_RIGHT) {frameIndex ++; hvis (frameIndex> 3) frameIndex = 0; ui.switchToFrame (frameIndex); } ellers hvis (commondModel == MODEL_LEFT) {frameIndex--; hvis (frameIndex <0) frameIndex = 3; ui.switchToFrame (frameIndex); } commondModel = MODEL_NULL; } void updateMotor (void) {if (motorState == MOTOR_AUTO) {hvis (dir == true) {angleValue + = speedValue; } ellers {angleValue - = speedValue; }} hvis (angleValue> 180) dir = false; ellers hvis (angleValue <0) dir = true; mymotor.write (angleValue); } void doButton (void) {if (isButtonPushDown ()) {hvis (uiEnable == false) {commondModel = MODEL_NULL; } ellers {commondModel = MODEL_BUTTON; } timeCounter = 0; } hvis (readEncoderValue ()! = 0) {long value = readEncoderValue (); hvis (uiEnable == true) {hvis (værdi> 0) {commondModel = MODEL_RIGHT; } ellers {commondModel = MODEL_LEFT; }} timeCounter = 0; encoderValue = 0; } hvis (frameIndex == 2) {hvis (commondModel == MODEL_BUTTON) {hvis (setFrameValue == SET_FRAME_2_ON) {setFrameValue = SET_FRAME_2_OFF; } ellers {setFrameValue = SET_FRAME_2_ON; } commondModel = MODEL_NULL; } hvis (setFrameValue == SET_FRAME_2_ON) {hvis (commondModel == MODEL_RIGHT) {speedValue ++; } else if ((commondModel == MODEL_LEFT)) {speedValue--; } hvis (speedValue> 20) speedValue = 20; hvis (speedValue <0) speedValue = 0; commondModel = MODEL_NULL; }} hvis (frameIndex == 3) {hvis (commondModel == MODEL_BUTTON) {hvis (setFrameValue == SET_FRAME_3_ON) {setFrameValue = SET_FRAME_3_OFF; } ellers {setFrameValue = SET_FRAME_3_ON; } commondModel = MODEL_NULL; } hvis (setFrameValue == SET_FRAME_3_ON) {if ((commondModel == MODEL_RIGHT) || (commondModel == MODEL_LEFT)) {motorState = (motorState == MOTOR_AUTO)? MOTOR_STATIC: MOTOR_AUTO; } commondModel = MODEL_NULL; }}} tomrumsopsætning () {ec11Init (); displayInit (); motorInit (); bme.begin (); timer.setInterval (200, updateUi); timer.setInterval (50, updateMotor); } tomgangsløbe () {int remainingTimeBudget = ui.update (); hvis (remainingTimeBudget> 0) {forsinkelse (remainingTimeBudget); } doButton (); timer.run (); } void updateEncoder ()

LOL ~ godt klaret!