当前位置: 首页 > news >正文

整形网站源码凡科网站建设

整形网站源码,凡科网站建设,网站建建设心的,黑客钓鱼网站的制作本教程将指导您制作一台专业级的空气质量检测仪。这个项目使用经济实惠的ESP8266和PMS5003传感器,配合OLED显示屏,不仅能实时显示PM2.5数值,还能通过手机APP随时查看数据。总成本70元,相比几百的用的便宜,用的心理踏实…

本教程将指导您制作一台专业级的空气质量检测仪。这个项目使用经济实惠的ESP8266和PMS5003传感器,配合OLED显示屏,不仅能实时显示PM2.5数值,还能通过手机APP随时查看数据。总成本70元,相比几百的用的便宜,用的心理踏实。

功能特点

  • 实时检测PM2.5和PM10浓度
  • OLED屏幕直观显示数据
  • WiFi无线连接,支持远程数据查看
  • 手机APP实时监控
  • 支持数据历史记录和趋势分析
  • 24小时持续监测

成品
在这里插入图片描述

网页
在这里插入图片描述

APP
在这里插入图片描述

硬件需求

[upl-image-preview url=https://forum.thingspanel.cn/assets/files/2024-12-20/1734656701-50998-image.png]

ESP8266开发板(如NodeMCU、Wemos D1 mini等)10元
PMS5003/PMS7003系列颗粒物传感器 50元
0.96寸OLED显示屏(I2C接口,128x64分辨率)9元
若干杜邦线

接线说明

PMS传感器接线(5V供电):

VCC → ESP8266的VIN(5V)
GND → ESP8266的GND
TX → D6(GPIO12)
RX → D5(GPIO14)

OLED显示屏接线:

VCC → 3.3V
GND → GND
SDA → D2(GPIO4)
SCL → D1(GPIO5)

准备工作

Arduino IDE配置:

安装ESP8266开发板支持
安装必要的库:

WiFiManager(用于WiFi配置)
PubSubClient(MQTT客户端)
Adafruit GFX和Adafruit SSD1306(OLED驱动)
ArduinoJson(JSON数据处理)

使用说明

首次使用:

给设备上电后,会创建一个名为"AP"的WiFi热点
用手机连接该热点
在弹出的配置页面中设置WiFi信息
设备会自动连接配置好的WiFi

正常使用:

设备每3秒更新一次显示屏数据
每10秒向MQTT服务器发送一次数据
OLED屏幕显示实时PM2.5数值

代码

#include <ESP8266WiFi.h>
#include <WiFiManager.h>
#include <PubSubClient.h>
#include <SoftwareSerial.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <ArduinoJson.h>// OLED显示屏设置
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
#define SCREEN_ADDRESS 0x3C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);// PMS传感器串口设置
#define PMS_RX 12  // D6
#define PMS_TX 14  // D5
SoftwareSerial pmsSensor(PMS_RX, PMS_TX);// MQTT设置
const char* mqtt_server = "47.115.210.16";
const int mqtt_port = 1883;
const char* mqtt_username = "cc1fb73f-ec43-3b37-522";
const char* mqtt_password = "b5c6d62";
const char* mqtt_client_id = "mqtt_d59ea842-b79";
const char* mqtt_topic = "devices/telemetry";// 时间设置
unsigned long lastMQTTPublish = 0;
const long MQTT_PUBLISH_INTERVAL = 10000;  // MQTT发布间隔10秒
const long DISPLAY_UPDATE_INTERVAL = 3000;  // 显示更新间隔3秒WiFiClient espClient;
PubSubClient client(espClient);// PMS数据结构
struct PMS_data {uint16_t pm1_0;uint16_t pm2_5;uint16_t pm10_0;uint16_t pm1_0_std;   // 添加标准颗粒物浓度uint16_t pm2_5_std;uint16_t pm10_0_std;bool valid;
} pms_data;void setup() {Serial.begin(115200);Serial.println("\n启动中...");// 初始化I2CWire.begin(4, 5);  // SDA = GPIO4 (D2), SCL = GPIO5 (D1)// 初始化OLEDif(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {Serial.println("OLED初始化失败");} else {Serial.println("OLED初始化成功");display.clearDisplay();display.setTextColor(SSD1306_WHITE);showInitScreen();}// 初始化PMS传感器Serial.println("初始化PMS传感器...");pmsSensor.begin(9600);pms_data.valid = false;// 配置WiFiWiFiManager wifiManager;if(!wifiManager.autoConnect("AP")) {Serial.println("配置失败,重启");ESP.restart();}// 配置MQTTclient.setServer(mqtt_server, mqtt_port);
}void loop() {static unsigned long lastDisplayUpdate = 0;unsigned long currentMillis = millis();if (!client.connected()) {reconnectMQTT();}client.loop();if (currentMillis - lastDisplayUpdate >= DISPLAY_UPDATE_INTERVAL) {if (readPMSdata()) {updateDisplay();}lastDisplayUpdate = currentMillis;}if (pms_data.valid && currentMillis - lastMQTTPublish >= MQTT_PUBLISH_INTERVAL) {publishData();lastMQTTPublish = currentMillis;}
}bool readPMSdata() {uint8_t buffer[32];uint16_t sum = 0;// 清空接收缓冲区while(pmsSensor.available()) {pmsSensor.read();}// 等待数据delay(1000);if (pmsSensor.available() < 32) {return false;}// 检查帧头if (pmsSensor.read() != 0x42 || pmsSensor.read() != 0x4D) {return false;}// 读取剩余数据pmsSensor.readBytes(buffer, 30);// 计算校验和sum = 0x42 + 0x4D;for (int i = 0; i < 28; i++) {sum += buffer[i];}// 验证校验和if (sum != ((buffer[28] << 8) | buffer[29])) {Serial.println("校验和错误");return false;}// 打印原始数据以供调试Serial.println("Raw data:");for(int i = 0; i < 30; i++) {Serial.printf("%02X ", buffer[i]);if((i + 1) % 8 == 0) Serial.println();}Serial.println();// 标准颗粒物浓度pms_data.pm1_0_std = (buffer[4] << 8) | buffer[5];    // 数据1:PM1.0标准pms_data.pm2_5_std = (buffer[6] << 8) | buffer[7];    // 数据2:PM2.5标准pms_data.pm10_0_std = (buffer[8] << 8) | buffer[9];   // 数据3:PM10标准// 大气环境浓度pms_data.pm1_0 = (buffer[10] << 8) | buffer[11];    // 数据4:PM1.0大气环境pms_data.pm2_5 = (buffer[12] << 8) | buffer[13];    // 数据5:PM2.5大气环境pms_data.pm10_0 = (buffer[14] << 8) | buffer[15];   // 数据6:PM10大气环境Serial.println("解析后的数据:");Serial.printf("标准颗粒物浓度 - PM1.0: %d, PM2.5: %d, PM10: %d\n", pms_data.pm1_0_std, pms_data.pm2_5_std, pms_data.pm10_0_std);Serial.printf("大气环境浓度 - PM1.0: %d, PM2.5: %d, PM10: %d\n", pms_data.pm1_0, pms_data.pm2_5, pms_data.pm10_0);// 验证数据合理性(暂时注释掉范围检查,看看实际数据)// if (pms_data.pm2_5 > 1000 || pms_data.pm1_0 > 1000 || pms_data.pm10_0 > 1000) {//     Serial.println("数据超出合理范围");//     return false;// }pms_data.valid = true;// 打印调试信息Serial.printf("PM1.0: %d, PM2.5: %d, PM10: %d\n", pms_data.pm1_0, pms_data.pm2_5, pms_data.pm10_0);return true;
}void updateDisplay() {display.clearDisplay();// 标题 - 确保不会折行display.setTextSize(1);display.setTextColor(SSD1306_WHITE);const char* title = "AIR QUALITY";int16_t titleWidth = strlen(title) * 6;display.setCursor((SCREEN_WIDTH - titleWidth) / 2, 2);display.print(title);// 单条分隔线display.drawLine(0, 12, SCREEN_WIDTH, 12, SSD1306_WHITE);// PM2.5值显示String pm25Str = String(pms_data.pm2_5);int16_t valueX = SCREEN_WIDTH - (pm25Str.length() * 12) - 8;  // 右边距离8像素int16_t valueY = 22;// PM2.5标签display.setTextSize(1);display.setCursor(8, valueY + 4);display.print("PM2.5");// PM2.5数值(反色显示)int16_t boxWidth = pm25Str.length() * 12 + 4;int16_t boxHeight = 18;display.fillRect(valueX - 2, valueY - 1, boxWidth, boxHeight, SSD1306_WHITE);display.setTextColor(SSD1306_BLACK);display.setTextSize(2);display.setCursor(valueX, valueY);display.print(pm25Str);// PM10显示(保持在一行内)display.setTextColor(SSD1306_WHITE);display.setTextSize(1);// PM10标签和值int16_t pm10Y = 48;display.setCursor(8, pm10Y);display.print("PM10");String pm10Str = String(pms_data.pm10_0);int16_t pm10ValueX = SCREEN_WIDTH - (pm10Str.length() * 6) - 35;  // 预留单位的空间display.setCursor(pm10ValueX, pm10Y);display.print(pm10Str);// 单位display.setCursor(SCREEN_WIDTH - 30, pm10Y);display.print("ug/m3");display.display();
}void publishData() {StaticJsonDocument<200> doc;doc["pm25"] = pms_data.pm2_5;doc["pm10"] = pms_data.pm10_0;char buffer[200];serializeJson(doc, buffer);if (client.publish(mqtt_topic, buffer)) {Serial.println("MQTT数据发送成功");Serial.println(buffer);} else {Serial.println("MQTT数据发送失败");}
}void reconnectMQTT() {while (!client.connected()) {Serial.println("尝试MQTT连接...");if (client.connect(mqtt_client_id, mqtt_username, mqtt_password)) {Serial.println("MQTT已连接");} else {Serial.print("MQTT连接失败, rc=");Serial.println(client.state());delay(2000);}}
}void showInitScreen() {display.clearDisplay();// 计算文本位置以实现居中显示int16_t startY = (SCREEN_HEIGHT - 32) / 2;  // 32是两行文本的总高度(16px每行)display.setTextSize(2);// 显示 "Air PM2.5"const char* line1 = "Air PM2.5";int16_t line1Width = strlen(line1) * 12;  // 每个字符宽度约12像素display.setCursor((SCREEN_WIDTH - line1Width) / 2, startY);display.println(line1);// 显示 "Monitor"const char* line2 = "Monitor";int16_t line2Width = strlen(line2) * 12;display.setCursor((SCREEN_WIDTH - line2Width) / 2, startY + 16);display.println(line2);display.display();delay(2000);
}

传感器手册

在这里插入图片描述
在这里插入图片描述


文章转载自:
http://dinncogoral.stkw.cn
http://dinncopeaceable.stkw.cn
http://dinncocrotaline.stkw.cn
http://dinncocommodity.stkw.cn
http://dinncoleporine.stkw.cn
http://dinncochoora.stkw.cn
http://dinncoagglutinative.stkw.cn
http://dinncocambridge.stkw.cn
http://dinnconickel.stkw.cn
http://dinncoquetzal.stkw.cn
http://dinncopivotal.stkw.cn
http://dinncoenigma.stkw.cn
http://dinncoanaclasis.stkw.cn
http://dinncodisutility.stkw.cn
http://dinncopicturedrome.stkw.cn
http://dinncolepidosis.stkw.cn
http://dinncoreynold.stkw.cn
http://dinncohesychast.stkw.cn
http://dinncocatastrophe.stkw.cn
http://dinncoxyphoid.stkw.cn
http://dinncomudflap.stkw.cn
http://dinncosion.stkw.cn
http://dinncocrossbred.stkw.cn
http://dinncopolymer.stkw.cn
http://dinncostymy.stkw.cn
http://dinncoantimycotic.stkw.cn
http://dinncohotpress.stkw.cn
http://dinncooutrigged.stkw.cn
http://dinncorefasten.stkw.cn
http://dinncourticariogenic.stkw.cn
http://dinncoflashcard.stkw.cn
http://dinncorootstalk.stkw.cn
http://dinncoflashboard.stkw.cn
http://dinncoannamese.stkw.cn
http://dinncointerdiffuse.stkw.cn
http://dinncohalfling.stkw.cn
http://dinncocotillion.stkw.cn
http://dinnconeurogram.stkw.cn
http://dinncoautarchist.stkw.cn
http://dinncoindefectible.stkw.cn
http://dinncoalmacantar.stkw.cn
http://dinncohelio.stkw.cn
http://dinncofelicitation.stkw.cn
http://dinncobeedie.stkw.cn
http://dinncoolent.stkw.cn
http://dinncohifi.stkw.cn
http://dinncodempster.stkw.cn
http://dinncohighball.stkw.cn
http://dinncoaura.stkw.cn
http://dinncobunko.stkw.cn
http://dinncoglabrate.stkw.cn
http://dinncoeucolloid.stkw.cn
http://dinncoyabbi.stkw.cn
http://dinncoerf.stkw.cn
http://dinncodelocalize.stkw.cn
http://dinncoicicle.stkw.cn
http://dinncomicrocalorie.stkw.cn
http://dinncojacal.stkw.cn
http://dinncomagcon.stkw.cn
http://dinncosnockered.stkw.cn
http://dinncomondayish.stkw.cn
http://dinncocimmerian.stkw.cn
http://dinncomultianalysis.stkw.cn
http://dinncoconglomeratic.stkw.cn
http://dinncomoonshine.stkw.cn
http://dinncosceneman.stkw.cn
http://dinncoquincentenary.stkw.cn
http://dinncodonable.stkw.cn
http://dinncocorymbiferous.stkw.cn
http://dinncoernet.stkw.cn
http://dinncoquicksilver.stkw.cn
http://dinncopromycelium.stkw.cn
http://dinncojungle.stkw.cn
http://dinnconapu.stkw.cn
http://dinncoalienator.stkw.cn
http://dinncobunnia.stkw.cn
http://dinncostructurally.stkw.cn
http://dinncowizardry.stkw.cn
http://dinncoresourcefully.stkw.cn
http://dinncoenergy.stkw.cn
http://dinncoindrawing.stkw.cn
http://dinncoswitzerland.stkw.cn
http://dinncoabolish.stkw.cn
http://dinncocomplicity.stkw.cn
http://dinncoattaboy.stkw.cn
http://dinncopapaverin.stkw.cn
http://dinncocomforter.stkw.cn
http://dinnconoggin.stkw.cn
http://dinncohindi.stkw.cn
http://dinncoayutthaya.stkw.cn
http://dinncophosphoroscope.stkw.cn
http://dinncoplummy.stkw.cn
http://dinncosoothsaying.stkw.cn
http://dinncomerca.stkw.cn
http://dinncotransplantate.stkw.cn
http://dinncogoss.stkw.cn
http://dinncodiplocardiac.stkw.cn
http://dinncodiplopod.stkw.cn
http://dinncoschnecken.stkw.cn
http://dinncospga.stkw.cn
http://www.dinnco.com/news/89661.html

相关文章:

  • 秦皇岛做网站优化价格搜索引擎网站优化推广
  • 淘宝客合伙人网站建设关键词优化排名软件
  • 旅游网站建设规划方案百度品牌
  • 电商网站开发的职责搜索引擎调词工具
  • 专注徐州网站开发互联网营销师含金量
  • 外贸购物网站模板百度关键词优化查询
  • 昆明网站建设价目表短视频seo优化
  • 51网站怎么打不开了台州seo网站排名优化
  • 营销型网站是什么seo排名策略
  • 给图像做标注的网站解释seo网站推广
  • 小学学校网站建设计划一点优化
  • 微信网站开发教程视频教程百度官方免费下载安装
  • 如何建设网站论文文献软件开发外包公司
  • 建设项目环境影响登记网站湖北天天外链
  • python可以写网页吗windows优化大师有哪些功能
  • 住房公积金网站怎么做减员网站如何进行seo
  • 网站开发前后台整个流程线下推广方法有哪些
  • 临汾做网站电话销售找客户最好的app
  • 网站网页设计专业公司成人职业培训机构
  • 建设企业官方网站官网快速提高网站关键词排名优化
  • 做经营性的网站备案条件推广发布任务平台app下载
  • 网站做接口到app 价格138ip查询网域名解析
  • pw域名网站百度搜索引擎优化案例
  • 网站服务器建立做网站比较好的公司有哪些
  • 想做一个网站怎么做网店推广的作用是
  • 做家教有什么好的资料网站新网域名注册官网
  • 做笔记的网站百度竞价推广账户优化
  • php asp网站开发教程凡科网怎么建网站
  • 个人网站如何制作教程软文网站有哪些
  • 坂田的做网站公司宁波免费建站seo排名