框架结构:
esp32作为主控/气压/温湿度传感器/wifi获取当日天气/OLED屏幕/3d打印框架
part 1: Ardunio IDE 上开发 ESP32 on win
第一步:安装 Ardunio IDE
从官网下载安装就行:https://www.arduino.cc/en/softwares
第二步: 安装esp32 的开发板:
在 ardunio ide左上角文件 >首选项>其他开发板管理 输入
这个地址:https://dl.espressif.com/dl/package_esp32_index.json
(还能顺便改成中文)
然后重启一下ide 在开发板管理器里面搜索esp32 安装第一个就可以在 项目>开发板里面找到esp32了
之后找到你的esp型号,选择端口就可以了(也许需要装个驱动,谁知道呢)
Part2:连接必要之设备
主要都是IIC协议连接 如果想仔细了解IIC协议可以自己去学一学,这里主要是靠别人的库
第一步:物理连接
iic 是总线连接 也就是说只需要两根线就可以与所有从设备通信了(确信)
上拉电阻可选(esp32内置上拉电阻)
个人喜欢用面包板上面的其中一条+-电源线来做sda scl线,各种设备插上去非常爽.
这里你应该连接所有的传感器和屏幕在一起
第二步:获取传感器数据
使用BMP280作为气压传感器,SHT31作为温湿度传感器.
其实bmp280就可以有温度功能,但是好像不太准qwq
bmp280:adafruit/Adafruit_BMP280_Library: Arduino Library for BMP280 sensors (github.com)
SHT31:adafruit/Adafruit_SHT31: Arduino Library for SHT31 Digital sensors (github.com)
是阿道夫的库,实际用的时候各种b问题多到爆炸
如果买传感器的店铺给了库建议用他给的
如何安装库:
在项目地址:\Arduino\libraries下把解压的库文件夹放进去就可以了qwq
根据库的不同建议去抄一抄实例代码的,这里给一些格式化的方法:
char a[50];
char b[50];
char c[50];
sprintf(a,"Tem:%.2f C",sht31.readTemperature());
sprintf(b,"Pre:%.2f hpa",bmp280.readPressureValue()/100);
sprintf(c,"Hum:%.2f \%",sht31.readHumidity());
这里完成后就应该能
第三步:使OLED屏幕亮起来
这里是使用U8G2这个库,非常的好用
用同样的方法安装u8g2库
一下为一个简单的实例程序
#include <U8g2lib.h>
U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
//这上面那个是初始化类,请去u8g2项目库寻找自己屏幕的合适类
void setup() {
u8g2.begin();
u8g2.enableUTF8Print();
}
void loop() {
u8g2.setFont(u8g2_font_commodore64_tr); //请去项目仓库查看需要的字体写在这里
u8g2.firstPage();
do {
char a[50];
char b[50];
char c[50];//请自行决定要显示的内容吧
u8g2.setCursor(0, 20);
u8g2.print(a);
u8g2.setCursor(0, 40);
u8g2.print(b);
u8g2.setCursor(0, 60);
u8g2.print(c);
} while ( u8g2.nextPage() );
}
值得一提的是,请注意u8g2库对于屏幕的0坐标是在左上角,请务必确认排版,字体大小,谨防显示不出来
第四步:连接你的传感器们
物理连接方式如上已写
请根据自己传感器的类型把程序粘在一起(不是
对于此例,天气数据api来源于和风天气(好像是8)请自行填写密钥
这里给出最终代码
#include <Arduino.h>
#include <U8g2lib.h>
#include <Wire.h>
#include "DFRobot_BMP280.h"
#include "stdio.h"
#include "Adafruit_SHT31.h"
#include <ESP32_Heweather.h>
U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
DFRobot_BMP280 bmp280;
bool enableHeater = false;
uint8_t loopCnt = 0;
Adafruit_SHT31 sht31 = Adafruit_SHT31();
//const char* ssid = "@";
const char* ssid = "@"; // WiFi名称
//const char* password = "@"; // WiFi密码
const char* password = "@";
String UserKey = "@"; // 私钥 https://dev.heweather.com/docs/start/get-api-keyx
String Location = "@"; // 城市代码 https://github.com/heweather/LocationList,表中的 Location_ID
String Unit = "m"; // 公制-m/英制-i
String Lang = "en"; // 语言 英文-en/中文-zh
float ROUND = 0.5; // 更新间隔<小时>空气质量API 1小时更新一次
WeatherNow weatherNow; // 建立weatherNow对象
WeatherForecast WeatherForecast;
AirQuality AirQuality;
int qwq = 34;
char line_1[50];
char line_2[50];
char line_3[50];
char line_4[50];
char line_5[50];
char line_6[50];
void setup() {
ConnectWiFi();
delay(2000); //连接wifi
weatherNow.config(UserKey, Location, Unit, Lang);
WeatherForecast.config(UserKey, Location, Unit, Lang);
AirQuality.config(UserKey, Location, Unit, Lang);
u8g2.begin();
u8g2.enableUTF8Print();
Serial.begin(9600);
if (!bmp280.begin()) {
Serial.println("Could not find a valid BMP280 sensor!");
while (1);//别动,删了就挂壁
}//sht31
while (!Serial)
delay(10); // will pause Zero, Leonardo, etc until serial console opens
Serial.println("SHT31 test");
if (! sht31.begin(0x44)) { // Set to 0x45 for alternate i2c addr
Serial.println("Couldn't find SHT31");
while (1) delay(1);
}
//sht31
/*Serial.print("Heater Enabled State: ");
if (sht31.isHeaterEnabled())
Serial.println("ENABLED");
else
Serial.println("DISABLED");*/
}
void loop() {
/*
Serial.print("Temperature = ");
Serial.print(bmp280.readTemperatureValue());
Serial.println(" *C");
Serial.print("Pressure = ");
Serial.print(bmp280.readPressureValue());
Serial.println(" Pa");
Serial.print("Altitude = ");
Serial.print(bmp280.readAltitudeValue(1013.25)); // this should be adjusted to your local forcase
Serial.println(" m");
Serial.println();
delay(2000);
*/
float t = sht31.readTemperature();
char a[50];
char b[50];
char c[50];
sprintf(a,"Tem:%.2f C",sht31.readTemperature());
sprintf(b,"Pre:%.2f hpa",bmp280.readPressureValue()/100);
sprintf(c,"Hum:%.2f \%",sht31.readHumidity());
u8g2.setFont(u8g2_font_commodore64_tr);
u8g2.firstPage();
do {
u8g2.setCursor(0, 20);
u8g2.print(a);
u8g2.setCursor(0, 40);
u8g2.print(b);
u8g2.setCursor(0, 60);
u8g2.print(c);
} while ( u8g2.nextPage() );
delay(3000);
ShowWeather();
delay(3000);
}
// 连接WiFi
void ConnectWiFi(){
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
Serial.print("Connecting to ");
Serial.print(ssid);
int i = 0;
while (WiFi.status() != WL_CONNECTED && (i < 10)) {
delay(1000);
Serial.print('.');
i++;
}
if (i == 10) { // 10s失败
Serial.println("WiFi Connection Failed");
} else { // 成功
}
}
void ShowWeather(){
if(qwq>30){
if(weatherNow.get()){
WeatherForecast.get();
AirQuality.get();
sprintf(line_1,"BeiJing ChangPing");
sprintf(line_2,"Temp now:%d`C L:%d`C",weatherNow.getTemp(),WeatherForecast.getTempMin(0));
sprintf(line_3,"Now:%s Next:%s",weatherNow.getWeatherText(),WeatherForecast.getTextDay(1));
sprintf(line_4,"Wind: %d Fells: %d`C",weatherNow.getWindScale(),weatherNow.getFeelLike());
sprintf(line_5,"Rain: %3.1fmm Uv: %d",weatherNow.getPrecip(),WeatherForecast.getUvIndex(0));
sprintf(line_6,"AIR QUALITY:%s",AirQuality.getCategory());
u8g2.setFont(u8g2_font_6x13_tf);
u8g2.firstPage();
do {
u8g2.setCursor(0, 10);
u8g2.print(line_1);
u8g2.setCursor(0,20);
u8g2.print(line_2);
u8g2.setCursor(0, 30);
u8g2.print(line_3);
u8g2.setCursor(0, 40);
u8g2.print(line_4);
u8g2.setCursor(0, 50);
u8g2.print(line_5);
u8g2.setCursor(0, 60);
u8g2.print(line_6);
} while ( u8g2.nextPage() );
delay(2000);
qwq = 0;
}
else {
qwq = 30; // 更新失败
u8g2.setFont(u8g2_font_commodore64_tr);
u8g2.firstPage();
do {
u8g2.setCursor(0, 30);
u8g2.print("ERROR code");
u8g2.setCursor(0, 50);
u8g2.print(weatherNow.getServerCode());
}
while ( u8g2.nextPage() );
ConnectWiFi();
}
}
else{
u8g2.setFont(u8g2_font_6x13_tf);
u8g2.firstPage();
do {
u8g2.setCursor(0, 10);
u8g2.print(line_1);
u8g2.setCursor(0, 20);
u8g2.print(line_2);
u8g2.setCursor(0, 30);
u8g2.print(line_3);
u8g2.setCursor(0, 40);
u8g2.print(line_4);
u8g2.setCursor(0, 50);
u8g2.print(line_5);
u8g2.setCursor(0, 60);
u8g2.print(line_6);
} while ( u8g2.nextPage() );
delay(2000);
qwq = qwq + 1;}
}
如上捏,可以直接用