框架结构:

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的项目仓库:

用同样的方法安装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;}


}

如上捏,可以直接用