В этом проекте мастер познакомит нас со своей работой — метеостанцией Mini-TV на базе ESP32. Это забавный проект, который он сделал во время рождественских каникул, и он должен быть относительно простым для людей любого уровня подготовки. Вот данные о погоде, которые он будет отображать:
Текущая температура
Минимальная температура
Максимальная температура
Атмосферное давление
Влажность
Скорость ветра
Для изготовления такого устройства мастер использовал следующие
Инструменты и материалы:
-Дисплей;
-Модуль ESP32 ;
-Акриловые краски;
-Литий-полимерный аккумулятор 3,7 В;
-Модуль зарядки TP4056;
-Повышающий модуль MT3608;
-Ползунковый переключатель;
-Провода;
-Микрокнопка;
-Мультиметр;
-Паяльные принадлежности;
-3D-принтер;
Шаг первый: подключение
Первым шагом мастер собирает и проверяет схему. С помощью мультиметра настраивает выходное напряжение на повышающем модуле до 5В. Если выходное напряжение слишком высокое, ESP32 может сгореть, но, если оно слишком низкое, схема не будет работать. Убедитесь, что все ваши соединения надежны и нет возможности короткого замыкания.
Подключения:
Li-Po—TP4056
Vs —> B+
GND —> B-
TP4056 MT3608
OUT+—>VIN+
OUT(-)—>ползунковый переключатель —>VIN(-)
MT3608 ESP32
VOUT+—>VIN
VOUT(-)—>GND
ESP32 дисплей
3v3—>VCC
GND—>GND
18—>CLK
4—>MOSI(DIN)
22—>DC
21—>CS
RST—>23
ESP32 кнопка
3v3 -> левая ножка
GND -> правая ножка
15 -> правая верхняя ножка
Шаг второй: корпус
Корпус мастер напечатал на 3D-принтере. После печати покрасил акриловыми красками.
Файл для печати можно скачать ниже.
MINITV.stl
Шаг третий: код
Пароль и имя Wi-Fi нужно будет ввести вручную. Затем он переходит в программу «Open Weather Map», создает учетную запись и заходит в систему. После регистрации пользователю предоставляется ключ API. Его нужно скопировать и вставить в строку 17. Чтобы найти строку, нужно перейти в меню File>Preferences>Display Line Numbers. В строках 19 и 20 указываем название города и код страны. Нужно установить следующие библиотеки:
WiFi.h, HTTPClient.h, Arduino_JSON.h, SPI.h, Adafruit_SSD1351.h и Adafruit_GFX.h.
Чтобы их установить, переходим в Tools>Manage Libraries. Дальше нужно добавить устройство ESP32 в менеджере плат. Переходим в File> Preferences> Additional Boards Manager URLs:. Копируем в строку URL: https://dl.espressif.com/dl/package_esp32_index.json . Если позже вам потребуется добавить дополнительные адреса для другого проекта, просто добавьте запятую после этого URL-адреса и добавьте его.
Код можно скачать ниже.
Показать / Скрыть текст#include <WiFi.h>
#include <HTTPClient.h>
#include <Arduino_JSON.h>
#include <SPI.h>
#include <Adafruit_SSD1351.h>
#include <Adafruit_GFX.h>
//uint16_t time = millis();
const char* ssid = "Your Network Name Here";//enter the name of your Wi-Fi network
const char* password = "Your Network Password Here";//enter the password to your network
const int buttonPin = 15;
int buttonState = 0;
// Your Domain name with URL path or IP address with path
String openWeatherMapApiKey = "aBunchOfRandomNumbers&LettersGoHere";//your open weather map API key
String city = "New York";//Your city name, New York is an example I dont actually live there
String countryCode = "US";// Your country code
String jsonBuffer;
////OLED SETUP///////////////
// Screen dimensions
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 128 // Change this to 96 for 1.27" OLED.
// You can use any (4 or) 5 pins
#define SCLK_PIN 18
#define MOSI_PIN 4
#define DC_PIN 22
#define CS_PIN 21
#define RST_PIN 23
// Color definitions
#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFF
Adafruit_SSD1351 tft = Adafruit_SSD1351(SCREEN_WIDTH, SCREEN_HEIGHT, CS_PIN, DC_PIN, MOSI_PIN, SCLK_PIN, RST_PIN);
///////////////////////////////
void setup() {
Serial.begin(9600);
tft.begin();
pinMode(buttonPin, INPUT);
WiFi.begin(ssid, password);
Serial.println("Connecting");
while(WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Connected to WiFi network with IP Address: ");
Serial.println(WiFi.localIP());
}
void loop() {
buttonState = digitalRead(buttonPin);
// Send an HTTP GET request
if (buttonState == HIGH) {
Serial.println("Button was pressed");
tft.fillScreen(BLACK);
//////////////
tft.fillRect(0, 0, 18, 128, WHITE );
tft.fillRect(18, 0, 37, 128, YELLOW);
tft.fillRect(37, 0, 56, 128, CYAN);
tft.fillRect(56, 0, 75, 128, GREEN);
tft.fillRect(75, 0, 94, 128, MAGENTA);
tft.fillRect(94, 0, 113, 128, RED);
tft.fillRect(113, 0, 128, 114, BLUE);
tft.fillRect(0, 114, 128, 14, BLACK);
//////////////
//lcdTestPattern();
delay(1200);
// Check WiFi connection status
if(WiFi.status()== WL_CONNECTED){
String serverPath = "http://api.openweathermap.org/data/2.5/weather?q=" + city + "," + countryCode + "&APPID=" + openWeatherMapApiKey;
jsonBuffer = httpGETRequest(serverPath.c_str());
Serial.println(jsonBuffer);
JSONVar myObject = JSON.parse(jsonBuffer);
// JSON.typeof(jsonVar) can be used to get the type of the var
if (JSON.typeof(myObject) == "undefined") {
Serial.println("Parsing input failed!");
return;
}
int Kelvin = myObject["main"]["temp"];
int FTemp = (((Kelvin — 273.15) * 9) / 5) + 32;
int KelvinMIN = myObject["main"]["temp_min"];
int FTemp_MIN = (((KelvinMIN — 273.15) * 9) / 5) + 32;
int KelvinMAX = myObject["main"]["temp_max"];
int FTemp_MAX = (((KelvinMAX — 273.15) * 9) / 5) + 32;
int Pressure = myObject["main"]["pressure"];
int Humidity = myObject["main"]["humidity"];
int WindSpeed = myObject["wind"]["speed"];
//char test = myObject["weather"];
Serial.print("JSON object = ");
Serial.println(myObject);
Serial.println(JSON.typeof(myObject));
Serial.print("Temperature: ");
Serial.println(FTemp);
Serial.print("Temperature MIN: ");
Serial.println(FTemp_MIN);
Serial.print("Temperature MAX: ");
Serial.println(FTemp_MAX);
Serial.print("Pressure: ");
Serial.println(Pressure);
Serial.print("Humidity: ");
Serial.println(Humidity);
Serial.print("Wind Speed: ");
Serial.println(WindSpeed);
Serial.print("Weather description: ");
Serial.println(myObject["weather"]);
String SFTemp = String(FTemp);
String SFTemp_MIN = String(FTemp_MIN);
String SFTemp_MAX = String(FTemp_MAX);
String SPressure = String(Pressure);
String SHumidity = String(Humidity);
String SWindSpeed = String(WindSpeed);
//probably should have made a function for this, but guess what, I didnt, so deal with it.
tft.fillScreen(BLACK);
tft.setCursor(40, 16);
tft.setTextSize(4);
tft.setTextColor(YELLOW);
tft.print(SFTemp);
tft.setTextSize(2);
tft.setCursor(90, 13);
tft.print("o");
tft.setCursor(0,50);
tft.setTextSize(1);
tft.setTextColor(BLUE);
tft.print("Minimum Temp: " + SFTemp_MIN);
tft.setCursor(0,62);
tft.setTextSize(1);
tft.setTextColor(BLUE);
tft.print("Maximum Temp: " + SFTemp_MAX);
tft.setCursor(0,74);
tft.setTextSize(1);
tft.setTextColor(BLUE);
tft.print("Pressure: " + SPressure + "hPa");
tft.setCursor(0, 86);
tft.setTextSize(1);
tft.setTextColor(BLUE);
tft.print("Humidity: " + SHumidity + "%");
tft.setCursor(0, 98);
tft.setTextSize(1);
tft.setTextColor(BLUE);
tft.print("Wind Speed: " + SWindSpeed + "mph");
}
else {
Serial.println("WiFi Disconnected");
}
}
}
String httpGETRequest(const char* serverName) {
HTTPClient http;
// Your IP address with path or Domain name with URL path
http.begin(serverName);
// Send HTTP POST request
int httpResponseCode = http.GET();
String payload = "{}";
if (httpResponseCode>0) {
Serial.print("HTTP Response code: ");
Serial.println(httpResponseCode);
payload = http.getString();
}
else {
Serial.print("Error code: ");
Serial.println(httpResponseCode);
}
// Free resources
http.end();
return payload;
delay(1000);
}
Теперь нужно установить все в корпус и подключится к домашней сети.
Источник (Source)
Становитесь автором сайта, публикуйте собственные статьи, описания самоделок с оплатой за текст. Подробнее здесь.
Подборки: esp32 погода 3D принтер
Источник: