|
|
(未显示7个用户的40个中间版本) |
第1行: |
第1行: |
− | {| style="width: 840px;"
| + | === 详细内容 === |
− | |-
| |
− | |
| |
− | ==概述== | |
− | *项目名称:开源WiFi气象站系统
| |
− | *目的:获取身边实时的温度、湿度、光照甚至pm2.5数据
| |
− | *难度:中
| |
− | *耗时:5小时
| |
− | *制作者:
| |
− | *简介:
| |
− | 它能够获取你身边实时的温度、湿度、光照甚至pm2.5数据,并且在屏幕上显示出来,如果你需要,甚至可以将其接入互联网,只要有一台能上网的手机或者计算机,任何地方、任何时候都能查看到这些数据。而这套系统完全由Microduino来实现,非常简单。
| |
− | ==材料清单== | |
− | *Microduino设备
| |
− | {|class="wikitable"
| |
− | |-
| |
− | |模块||数量||功能
| |
− | |-
| |
− | |[[Microduino-Core+/zh]]||1||核心板
| |
− | |-
| |
− | |[[Microduino-USBTTL/zh]] ||1||下载程序
| |
− | |-
| |
− | |[[Microduino-WiFi/zh]] ||1||连接网络
| |
− | |-
| |
− | |[[Microduino-Temp&Hum/zh]] ||1||数字温湿度传感器
| |
− | |-
| |
− | |[[Microduino-Air quality/zh]] ||1||空气质量传感器
| |
− | |-
| |
− | |[[Microduino-Light/zh]] ||1||光照传感器
| |
− | |-
| |
− | |[[Microduino-OLED/zh]] ||1||显示
| |
− | |}
| |
− | *其他设备
| |
− | {|class="wikitable"
| |
− | |-
| |
− | |模块||数量||功能
| |
− | |-
| |
− | |Micro-USB线||1||下载程序、供电
| |
− | |-
| |
− | |[[Microduino-USBTTL/zh]] ||1||下载程序
| |
− | |-
| |
− | |GP2Y1010AU0F ||1||pm2.5传感器
| |
− | |-
| |
− | |螺丝 ||7||固定模块
| |
− | |-
| |
− | |螺丝刀 ||1||固定螺丝
| |
− | |-
| |
− | |外壳 ||1||
| |
− | |}
| |
− | [[File:气象站物料.jpg||1000px|center]]
| |
| | | |
− | ==实验原理==
| + | 此部分内容维基现已停止维护,该部分的详细内容全部转移至IdeaLab网站上,请移步[https://www.idealab.cc/course/5a69513f8459d000199e6cca/class/5a5845d8fec664000f6a7c63 WIFI气象站——制作]上进行查看。以下是IdeaLab访问流程。 |
− | 气象站专用板上安装了多参数传感器,包括数字温湿度传感器(Microduino-Tem&Hum)、光照强度传感器(Microduino-Light)、空气质量传感器(Microduino-Air)和pm2.5传感器(GP2Y1010AU0F)。每个传感器均与Microduino-Sensorhub连接,由Microduino核心(Microduino Core+)对传感器数据分析处理,以直观的文字提示方式在OLED中显示。同时通过Microduino CC3000模块(wifi)使Microduino核心连接到网络,与mCotton物联网平台通讯并以直观的文字和图表信息反馈给用户,用户只需要用通过能上网的手机或者计算机,在任何地方任何时候都能查看到这些数据,用户甚至可以设置传感器值来触发微博,与大家一起分享你的生活。
| |
− | 总的来说,用户通过气象站可以随时随地感受的身边环境的变化,把无形变有形,去感受大自然的瞬息万变。
| |
− | [[File:Wifistationtheory.jpg||600px|center]]
| |
| | | |
− | 本系统由传感器、协调器、网络适配器、OLED显示器、mCotton物联网平台五个部分组成,综合了传感技术、网络通信技术、OLED显示技术和物联网技术。传感器主要完成温度、湿度、光照参数、空气质量的采集,协调器分析处理采集的数据,同时通过网络适配器连接到网络与mCotton物联网平台通信,从而可以在mCotton物联网平台下查看到这些数据。
| + | == IdeaLab访问流程 == |
| + | '''1、打开网址([https://www.ideaxcollege.cn/ ideaxcollage])。''' |
| | | |
− | [[File:Wifistationtheory1.jpg||600px|center]]
| + | '''2、点击右上角登录按钮。''' |
| | | |
− | *管理平台构成
| + | [[文件:1.png]] |
− | 管理平台大致可分为两个部分:一是Microduino核心控制,负责采集传感器数据,并且连接到互联网。二是mCotton物联网平台,负责将数据以曲线形式直观显示给用户,用户可以随时随地查看,并且可以设置微博触发,分享你的生活环境。如图2-2所示:
| |
− | *主要传感器
| |
| | | |
− | [[File:Wifistationtheory2.jpg||600px|center]]
| + | '''3、登录/注册账号。''' |
| | | |
− | 下图展示了本系统的处理流程。数据采集系统:主要负责对环境温度、湿度、光照强度等数据的采集。传感器采集的数据上传到Microduino核心,具有扩展方便等优点。
| + | [[文件:2.png]] |
− | 无线传输系统:该系统主要将设备采集到的数据,通过无线网络传送到服务器上,使用WiFi传输数据。
| |
− | 数据处理系统:该系统负责对采集的数据进行上传存储、直观显示,用户可随时随地通过电脑和手机等终端进行查询。
| |
| | | |
− | [[File:Wifistationtheory3.jpg||600px|center]]
| + | '''4、点击课程,在课程列表中找到《Microduino创新编程》课程并点击打开。''' |
| | | |
− | ==文档==
| + | [[文件:8.png]] |
− | http://pan.baidu.com/s/1qWQp1la
| |
− | 提取码:p3di
| |
| | | |
− | ==调试过程==
| + | '''5、点击“报名学习”。''' |
− | *搭建服务器
| |
− | 气象站既然要连入互联网,一个用来储存和显示的服务器必不可少,首先我们需要搭建好一个网络服务器。
| |
− | *关于mCotton
| |
− | 目前定位于做一个开放的通用物联网平台,主要提供传感器数据的接入,存储和展现服务,为所有的开源软硬件爱好者、制造型企业,提供一个物联网项目的平台,
| |
− | 使得硬件和制造业者能够在不关心服务器实现细节和运维的情况下,拥有交付物联网化的电子产品的能力。
| |
− | 我们只需在mCotton注册一个账号,它会提供给你一个唯一的API KEY,这个便是用来在服务器里判别唯一身份之用的。
| |
− | mCotton作为一个开放的公共物联网接入平台,目的是为服务所有所有的爱好者和开发者,使传感器数据的接入、存储和展现变得轻松简单。
| |
− | 下面我们介绍一下如何使用mCotton平台完成您的轻松接入。
| |
− | *注册
| |
− | 打开mCotton的主页:somvpn.cn:3000,在页面中点击”Sign in/Join”,然后会弹出登录/注册框,再点击“Create account”进入用户注册页面。
| |
| | | |
− | [[File:mcottonsign1.jpg||600px|center]] | + | [[文件:9.png]] |
| | | |
− | 在用户注册页面,填写相关信息后点击完成注册
| + | '''6、输入姓名。''' |
| | | |
− | [[File:mcottonsign2.jpg||600px|center]] | + | [[文件:5.png]] |
− | *增加设备
| |
− | 登陆后点击”Projects“进入工程页面
| |
| | | |
− | [[File:mcottonsign3.jpg||600px|center]]
| + | '''7、点击“课程目录”。''' |
| | | |
− | 在工程页面中找到”Weather Station”项目,点击其中的“Assemble to My Devices”按钮,可以添加自己的设备
| + | [[文件:10.png]] |
| | | |
− | [[File:mcottonsign4.jpg||600px|center]]
| + | '''8、选择相应课程进行学习。''' |
| | | |
− | 在“Name”中输入自己的设备名称,然后点击“Submit”按钮发布
| + | [[文件:11.png]] |
− | | |
− | [[File:mcottonsign5.jpg||600px|center]] | |
− | *获得APIKEY
| |
− | 发布完毕后就可以在“My Garage”页面中看到自己的设备
| |
− | [[File:mcottonsign6.jpg||600px|center]]
| |
− | 找到自己发布的气象站设备,可以看到该设备专属的设备ID,记下它
| |
− | [[File:mcottonsign7.jpg||600px|center]]
| |
− | *下载程序
| |
− | 将Microduino-Core+与Microduino-USBTTL叠加(无上下顺序),通过USB数据线与电脑连接起来
| |
− | [[File:download1.jpg||400px|center]]
| |
− | 确认你搭建了Microduino的开发环境,否则参考附录1-Arduino IDE安装指导。
| |
− | [[File:Gettingstarted.jpg||400px|center]]
| |
− | 打开Arduino IDE编程软件,点击 【文件】->【打开】
| |
− | [[File:Dl1.jpg||600px|center]]
| |
− | 浏览到项目程序地址,点击“weatherCC3000.ino”程序打开
| |
− | [[File:WiFiStationopen.jpg||600px|center]]
| |
− | [[File:WiFiStationopen2.jpg||600px|center]]
| |
− | 在def.h文件中需要设置相应的配置参数:
| |
− | #define WLAN_SSID “你要连接的WiFi的网络名”
| |
− | #define WLAN_PASS “你要连接的WiFi的密码”
| |
− | #define WEBSITE “设置的服务器地址”
| |
− | #define WEBSITEPORT “设置的服务器端口号”
| |
− | #define APP_KIT_ID “步骤3获得的设备ID号”
| |
− | [[File:WiFiStationopen3.jpg||600px|center]]
| |
− | 点击“工具”,在板选项里面选择板卡(Microduino-Core+),在处理器选项里面选择处理器(Atmega644pa@16M,5V),再在端口选项里面选择正确的端口号,然后直接烧录程序
| |
− | [[File:WiFiStationopen4.jpg||600px|center]]
| |
− | | |
− | ==拼装气象站==
| |
− | *'''Step1''':将OLED屏和A1用螺丝固定在一起
| |
− | [[File:Waetherstep1.jpg||600px|center]]
| |
− | *'''Step2''':把B1~B5用B6拼接在一起
| |
− | [[File:Waetherstep2.jpg||600px|center]]
| |
− | *'''Step3''':将Core+,USBTTL,Hub连接在一起并且用螺丝螺帽固定在A2上,再将传感器连接线连接在PM2.5传感器上
| |
− | PM2.5传感器使用胶水黏在底板上
| |
− | [[File:Waetherstep3.jpg||600px|center]]
| |
− | *'''Step4''':将B7,B8,B9按照如图所示分别拼接到温湿度传感器,气体传感器和光照传感器上
| |
− | [[File:Waetherstep4.jpg||600px|center]]
| |
− | *'''Step5''':按说明图上所示的位置将温湿度传感器、气体传感器和光照传感器连接到Hub板上
| |
− | 再分别将传感器固定在Step2中内部四周B1和B2组合的卡槽上,完成后将A1和A2分别接在其顶部和底部
| |
− | [[File:Waetherstep5.jpg||600px|center]]
| |
− | *'''Step6''':完成上述步骤后用B0进行固定,之后插上USB线,气象站完成
| |
− | | |
− | 设置完成后就可以在OLED上看到各个传感器的数据
| |
− | 同时在mCotton上设置好的设备上也能看到气象站上传的数据
| |
− | [[File:WiFiStation10.jpg||600px|center]]
| |
− | | |
− | ==程序说明==
| |
− | 国内可用:
| |
− | *主程序部分
| |
− | <source lang="cpp">
| |
− | //1,屏幕显示部分=============================
| |
− | #include"Arduino.h"
| |
− | #include "U8glib.h"
| |
− | //2,传感器部分================================
| |
− | #include <Wire.h>
| |
− | #include "I2Cdev.h"
| |
− | #include <AM2321.h>
| |
− | #include <SoftwareSerial.h>
| |
− | //3,WIFI部分================================
| |
− | #include <Adafruit_CC3000.h>
| |
− | #include <ccspi.h>
| |
− | #include <SPI.h>
| |
− | #include <string.h>
| |
− | #include "utility/debug.h"
| |
− | //4,自定义部分=============================
| |
− | #include "def.h"
| |
− | #include "oled.h"
| |
− | #include "wifi.h"
| |
− | #include "sensor.h"
| |
− |
| |
− | #define INTERVAL_LCD 200 //OLED及传感器刷新时间间隔
| |
− | #define INTERVAL_NET 30000 //传感器数据上传时间间隔
| |
− |
| |
− | unsigned long lcd_time = millis(); //OLED及传感器更新计时器
| |
− | unsigned long net_time = millis(); //传感器数据上传更新计时器
| |
− |
| |
− | void setup(void)
| |
− | {
| |
− | Serial.begin(115200); //初始化波特率
| |
− | setup_wifi(); //初始化WIFI
| |
− | }
| |
− |
| |
− | void loop(void)
| |
− | {
| |
− |
| |
− | if (lcd_time > millis()) lcd_time = millis();
| |
− | if (millis() - lcd_time > INTERVAL_LCD)
| |
− | {
| |
− | SensorUpdate(); //更新传感器
| |
− | volcd(sensorTemp, sensorHumi, sensorLight, sensorPM25, sensorEtoh); //更新OLED显示
| |
− | lcd_time = millis(); //更新计时器
| |
− | }
| |
− |
| |
− | if (net_time > millis()) net_time = millis();
| |
− | if (millis() - net_time > INTERVAL_NET)
| |
− | {
| |
− | updateWeatherData(sensorTemp, sensorHumi, sensorLight, sensorPM25, sensorEtoh); //上传传感器数据
| |
− | net_time = millis(); //更新计时器
| |
− | }
| |
− | }
| |
− | </source>
| |
− | *用户配置部分
| |
− | def.h
| |
− | <source lang="cpp">
| |
− | #define WLAN_SSID "AZURE" //WIFI网络名
| |
− | #define WLAN_PASS "azure001" //WIFI密码
| |
− | | |
− | #define WEBSITE "mcotton.microduino.cn" //服务器网址
| |
− | #define WEBSITEPORT 8080 //服务器端口号
| |
− | #define APP_KIT "TLcrn6vaAahjnvKR2" //设备ID号#define APP_KIT "YourDeviceID" //设备ID号
| |
− | | |
− | #define WEBPAGE "/api/v1.0/d"
| |
− | #define WEBUTTONPAGE "/api/v1.0/ce"
| |
− | </source>
| |
− | *OLED显示部分
| |
− | <source lang="cpp">
| |
− | U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE); //设置OLED型号
| |
− | //-------字体设置,大、中、小
| |
− | #define setFont_L u8g.setFont(u8g_font_7x13)
| |
− | #define setFont_M u8g.setFont(u8g_font_fixed_v0r)
| |
− | #define setFont_S u8g.setFont(u8g_font_chikitar)
| |
− | | |
− | //温度计图案
| |
− | const unsigned char bmp_tem[] U8G_PROGMEM =
| |
− | {
| |
− | 0xE0,0x81,0x30,0x83,0x10,0x82,0x10,0x82,0x10,0xFA,0x10,0x82,
| |
− | 0x10,0x82,0x10,0xFA,0x10,0x82,0xD0,0x82,0xD0,0xFA,0xD0,0x82,
| |
− | 0xD0,0x82,0xD0,0xFA,0xD0,0x82,0xD0,0x82,0xD0,0xFA,0xD0,0x82,
| |
− | 0xD0,0x82,0xD8,0x86,0xC4,0x88,0xF2,0x93,0xFB,0xB7,0xF9,0xA7,
| |
− | 0xFD,0xAF,0xFD,0xAF,0xF9,0xA7,0xFA,0x97,0xF2,0x93,0xC4,0x88,
| |
− | 0x18,0x86,0xF0,0x83
| |
− | };
| |
− | | |
− | //水滴图案
| |
− | const unsigned char bmp_hum[] U8G_PROGMEM =
| |
− | {
| |
− | 0x00,0x00,0x01,0x00,0x00,0x01,0x00,0x80,0x03,0x08,0x80,0x03,0x18,0x80,0x07,0x1C,
| |
− | 0xC0,0x07,0x3C,0xC0,0x07,0x3E,0xE0,0x0F,0x3E,0xE0,0x0F,0x7A,0xF0,0x1F,0x7B,0xF8,
| |
− | 0x1F,0x72,0xF8,0x1F,0x3E,0xF8,0x3F,0x1C,0xFC,0x3F,0x00,0xFC,0x7F,0x00,0xFE,0x7F,
| |
− | 0x00,0xFE,0x7F,0x00,0xFE,0x7F,0x00,0xFF,0xFF,0x00,0xFF,0xFF,0x00,0xFF,0xFF,0x00,
| |
− | 0xF3,0xFF,0x00,0xF2,0x7F,0x00,0xE6,0x7F,0x00,0xC6,0x7F,0x00,0x0E,0x3F,0x00,0x3C,
| |
− | 0x1E,0x00,0xF8,0x1F,0x00,0xE0,0x07,0x00,0x80,0x01
| |
− | };
| |
− | | |
− | //显示函数
| |
− | void osd_setup(int _osd_setup,char* _osd_text) {
| |
− | u8g.firstPage();
| |
− | do {
| |
− | setFont_L;
| |
− | u8g.setPrintPos(4, 30);
| |
− | u8g.print(_osd_text);
| |
− | u8g.drawFrame(0,48,128,14);
| |
− | if(_osd_setup)
| |
− | u8g.drawBox(0+2,48+2,map(_osd_setup,0,5,0,128-4),14-4);
| |
− | }
| |
− | while( u8g.nextPage() );
| |
− | }
| |
− | | |
− | | |
− | //显示函数
| |
− | void volcd(float temp, float humi, float light, float pm25, float etoh) {
| |
− | u8g.firstPage();
| |
− | do {
| |
− | u8g.setDefaultForegroundColor();
| |
− | | |
− | u8g.drawXBMP( 4, 1, 15, 32, bmp_tem);
| |
− | u8g.drawXBMP( 70, 2, 24, 30, bmp_hum);
| |
− | | |
− | setFont_M; //设置字体为大
| |
− | u8g.setPrintPos(20, 16); //设置文字开始坐标
| |
− | u8g.print("`C ");
| |
− | setFont_L; //设置字体为大
| |
− | u8g.setPrintPos(20, 32); //设置文字开始坐标
| |
− | u8g.print(temp , 1); //温度
| |
− | | |
− | setFont_M; //设置字体为大
| |
− | u8g.setPrintPos(100, 16); //设置文字开始坐标
| |
− | u8g.print("%");
| |
− | setFont_L; //设置字体为大
| |
− | u8g.setPrintPos(100, 32); //设置文字开始坐标
| |
− | u8g.print(humi , 0); //湿度
| |
− | | |
− | setFont_L; //设置字体
| |
− | u8g.setPrintPos(4, 49); //设置文字开始坐标
| |
− | u8g.print(light , 0); //光照强度
| |
− | setFont_M; //设置字体
| |
− | u8g.print(" Lux");
| |
− | | |
− | setFont_L; //设置字体
| |
− | u8g.setPrintPos(4, 63); //设置文字开始坐标
| |
− | u8g.print(pm25 , 1); //光照强度
| |
− | setFont_M; //设置字体
| |
− | u8g.print(" ug/m3");
| |
− | | |
− | | |
− | setFont_L; //设置字体
| |
− | u8g.setPrintPos(80, 49); //设置文字开始坐标
| |
− | u8g.print(etoh , 0); //光照强度
| |
− | setFont_M; //设置字体
| |
− | u8g.print(" ppm");
| |
− | | |
− | | |
− | setFont_M; //设置字体为大
| |
− | u8g.setPrintPos(80, 63); //设置文字开始坐标
| |
− | u8g.print(" LED:");
| |
− | | |
− | }
| |
− | while( u8g.nextPage() );
| |
− | }
| |
− | | |
− | | |
− | void volcdsetup(char* zi,unsigned int x,unsigned int y) {
| |
− | //#ifdef OLED
| |
− | u8g.firstPage();
| |
− | do {
| |
− | setFont_L;
| |
− | u8g.setPrintPos(x, y);
| |
− | u8g.print(zi);
| |
− | }
| |
− | while( u8g.nextPage() );
| |
− | //#endif
| |
− | }
| |
− | </source>
| |
− | *传感器数据采集部分
| |
− | <source lang="cpp">
| |
− | #include <SoftwareSerial.h>
| |
− | #include <AM2321.h>
| |
− | | |
− | AM2321 am2321;
| |
− | SoftwareSerial pmSerial(4,5); //PM2.5传感器通讯软串口
| |
− | | |
− | float sensorTemp; //温度值
| |
− | float sensorHumi; //湿度值
| |
− | float sensorPM25; //pm2.5浓度
| |
− | float sensorLight; //光照强度
| |
− | float sensorEtoh; //空气质量
| |
− | | |
− | //读取pm2.5传感器
| |
− | float PM25(){
| |
− | int data_s = 0; //串口接收数据
| |
− | int num = -1; //串口接收数据计数
| |
− | int sum = 0; //校验和
| |
− | int cal[5]; //接收数据缓存
| |
− | float dustDensity = 0; //PM2.5浓度
| |
− |
| |
− | pmSerial.begin(2400); //首先启动软串口
| |
− | pmSerial.flush(); //清空串口缓存
| |
− |
| |
− | while(1)
| |
− | {
| |
− | if(pmSerial.available() > 0) //串口缓存有数据
| |
− | {
| |
− | data_s = pmSerial.read(); //读取串口缓存数据
| |
− | if(data_s == 0xAA) //得到数据帧起始位
| |
− | {
| |
− | num = 0; //开始计数
| |
− | }
| |
− | else if(num >= 0)
| |
− | {
| |
− | num++; //读到数据,计数+1
| |
− | cal[num-1] = data_s; //数据保存到缓存中
| |
− | if(num == 6) //读到数据帧最后一位
| |
− | {
| |
− | sum = cal[0] + cal[1] + cal[2] + cal[3]; //计算校验和
| |
− | if(sum == cal[4] && cal[5] == 0xFF) //校验和匹配,数据帧最后一位为0xFF,说明接收的数据帧正常
| |
− | {
| |
− | dustDensity = (cal[0]*256 + cal[1])*(5.0/1024)*550; //计算PM2.5浓度,单位ug/m3
| |
− | }
| |
− | else //接收的数据不正常
| |
− | {
| |
− | dustDensity = 0; //浓度清零
| |
− | }
| |
− | break;
| |
− | }
| |
− | }
| |
− | }
| |
− | }
| |
− | pmSerial.end(); //关闭软串口
| |
− | return dustDensity; //返回值
| |
− | }
| |
− | | |
− | //更新传感器数据
| |
− | void SensorUpdate() {
| |
− | | |
− | //获取pm2.5浓度
| |
− | sensorPM25 = PM25();
| |
− | //获取温度,湿度
| |
− | am2321.read();
| |
− | sensorTemp = am2321.temperature / 10.0;
| |
− | sensorHumi = am2321.humidity / 10.0;
| |
− | //获取光照强度
| |
− | sensorLight = map(analogRead(A0), 0, 1023, 0, 255);
| |
− | //获取空气质量
| |
− | sensorEtoh= map(analogRead(A2), 0, 1023, 0, 30);
| |
− | | |
− | }
| |
− | </source>
| |
− | | |
− | ==视频==
| |
− | |}
| |