气象站Arduino
我决定写一篇详细的文章,讲述创建Arduino气象站的所有方面,因为很难一次覆盖整个过程。 我的气象站版本很方便,因为它的数据存储在计算机上。
需要什么- 使用Wifi路由器构建的本地网络
- 一台电脑
Arduino UNO(我使用了中文副本)。
- USB电缆,用于连接Arduino。
气压计BME280 5V I2C(温度,湿度,压力传感器)
- 带吹风机的焊台
- 焊料0.7毫米
- 通量。
Wi-Fi模块ESP8266 ESP-01版本
- 4电缆妈妈给爸爸做面包板。
- 用于面包板的4条公对母电缆
- 用于面包板的4条50厘米长的电缆。
- 8个细的热缩管,每个管长10厘米。
- 1个直径如此之大的热缩管,包括“ 4条50厘米长的面包板电缆”以及其他热缩管
网络设置
网络上的每台计算机都应看到服务器所在的设备,建议在网络上的所有计算机上安装相同的工作组。

点击放大。
您应该禁用bradmauser和其他防火墙。
在网络设置中,在无线适配器的属性中,在访问选项卡中,将复选框“允许其他用户访问”放在开头,然后-单击设置;
将所有复选标记放在设置中,您将看到服务的名称而不是数字。

点击放大。

点击放大。
您必须在路由器中打开端口80和3306 。 我将以Tenda路由器为例进行演示:首先,找到您的本地IP地址 ,为此,单击无线网络图标。 接下来,在打开的面板中,网络名称旁边,将显示“ 属性” 。 之后,向下滚动。

点击放大。
接下来,打开路由器的网页,输入http://192.168.0.1 ,输入路由器的密码,单击高级设置,再单击Virtal Server,然后首先输入本地IP和端口80,然后重复操作,但输入端口3306 。

点击放大。

点击放大。
我们需要以下组件:
- Apache-来自气象站的数据将在此处发送。
- PHP-将从气象站获取数据,并保存数据库。
- Mysql-将存储温度的数据库,因为仅使用PHP意味着不可能为多台计算机和其他设备提供显示。
- HeidiSQL-查看器和数据库编辑器(您可以使用其他任何名称,例如:“ PhpMyAdmin”)。
我不会详细描述Apache服务器的设置,因为Internet上有很多信息,主要是将Apache和MySQL配置为在本地网络上可见。
之后,在数据库中创建一个表格-温度将保存在该表格中。
我在服务器上的处理程序页面(传感器读数)的示例:
PHP代码$link = mysqli_connect(" ", "root", " ", " "); if (!$link) { echo ": MySQL." . PHP_EOL; echo " errno: " . mysqli_connect_errno() . PHP_EOL; echo " error: " . mysqli_connect_error() . PHP_EOL; exit; } echo " MySQL !" . PHP_EOL; echo " : " . mysqli_get_host_info($link) . PHP_EOL; if(isset($_GET['temp'])){ $c=$_GET['temp']; $vlah=$_GET['vlah']; $davlen=$_GET['davlen']; $sql = "UPDATE `temp1` SET `C`='$c',`vlah`='$vlah',`davlen`='$davlen' WHERE `id`='1'";
3.配置esp8266
将esp-01连接到适配器,并按如下所示将其连接到Arduino: Rx-RX,TX-TX,GND-GND,VCC-5V ;
将RESET Arduino端口接地 。

点击放大。
将arduino连接到计算机,打开Arduino IDE ,然后打开Serial Monitor ,然后指定Rate 115200 ,然后
NL和CR 。

点击放大。
- 输入AT命令。
- 突出显示确定 。
- 输入AT + RESTORE ,它将询问模块出厂设置。
- 输入AT + CWMODE_CUR = 1 ,这将使模块进入客户端模式。
- 输入AT + CWJAP_CUR =“网络名称”,“密码” -连接到wifi。
- 如果已建立连接,请突出显示“ 确定” 。
配置bme280和最终版本
根据图连接结论(注意该图显示了没有适配器的esp8266,但实际上它需要连接到适配器,并且已经从
4个输出适配器具有与图中所示相同的功能。 )

点击放大。
打开Arduino IDE并粘贴以下代码:
Arduino IDE代码 #include <Wire.h> void setup(){ Wire.begin(); Serial.begin(9600); while (!Serial); Serial.println("\nI2C Scanner"); } void loop(){ byte error, address; int nDevices; Serial.println("Scanning..."); nDevices = 0; for(address = 8; address < 127; address++ ){ Wire.beginTransmission(address); error = Wire.endTransmission(); if (error == 0){ Serial.print("I2C device found at address 0x"); if (address<16) Serial.print("0"); Serial.print(address,HEX); Serial.println(" !"); nDevices++; } else if (error==4) { Serial.print("Unknow error at address 0x"); if (address<16) Serial.print("0"); Serial.println(address,HEX); } } if (nDevices == 0) Serial.println("No I2C devices found\n"); else Serial.println("done\n"); delay(5000);
打开串行监视器 ,并记住突出显示的IC2地址。
下载传感器库 , 触摸库,然后将其解压缩到C:\ Users \ user \ Documents \ Arduino 。 开门
C:\ Users \ user \ Documents \ Arduino \ libraries \ Adafruit_BME280_Library-master并更改地址:

点击放大。
打开Arduino IDE并输入代码:
Arduino IDE代码 #include <SoftwareSerial.h> #define RX 10// esp8266 #define TX 11// esp8266 String AP = "Aleks"; // String PASS = "1brui47ci881"; // String HOST = "192.168.0.185";// String PORT = "80";// String field = "field1"; int countTrueCommand; int countTimeCommand; boolean found = false; int valSensor = 1; SoftwareSerial esp8266(RX,TX); #include <Wire.h> #include <SPI.h> #include <Adafruit_Sensor.h> #include <Adafruit_BME280.h> #define BME_SCK 13 #define BME_MISO 12 #define BME_MOSI 11 #define BME_CS 10 #define SEALEVELPRESSURE_HPA (1013.25) Adafruit_BME280 bme; // I2C //Adafruit_BME280 bme(BME_CS); // hardware SPI //Adafruit_BME280 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK); // software SPI unsigned long delayTime; void setup() { Serial.begin(9600); bool status; // default settings // (you can also pass in a Wire library object like &Wire2) status = bme.begin(); if (!status) { Serial.println("Could not find a valid BME280 sensor, check wiring!"); while (1); } esp8266.begin(115200); sendCommand("AT",5,"OK"); sendCommand("AT+CWMODE=1",5,"OK"); sendCommand("AT+CWJAP=\""+ AP +"\",\""+ PASS +"\"",20,"OK"); sendCommand("AT+CIPMUX=1",5,"OK"); } void loop() { float vlah=bme.readPressure() / 100.0F; sendCommand("AT+CIPSTART=0,\"TCP\",\""+ HOST +"\","+ PORT,15,"OK"); String cmd = "GET /?temp="+String(bme.readTemperature())+"&vlah="+String(vlah)+"&davlen="+String(bme.readHumidity())+" HTTP/1.1\r\nHost: 192.168.0.185\r\n\r\n";// GET ,temp,vlah,davlen . sendCommand("AT+CIPSEND=0," +String(cmd.length()+4),4,">"); esp8266.println(cmd);delay(1500);countTrueCommand++; sendCommand("AT+CIPCLOSE=0",5,"OK"); delay(100000); } void printValues() { Serial.print("Temperature = "); Serial.print(bme.readTemperature()); Serial.println(" *C"); Serial.print("Pressure = "); Serial.print(bme.readPressure() / 100.0F); Serial.println(" hPa"); Serial.print("Humidity = "); Serial.print(bme.readHumidity()); Serial.println(" %"); Serial.println(); } void sendCommand(String command, int maxTime, char readReplay[]) { Serial.print(countTrueCommand); Serial.print(". at command => "); Serial.print(command); Serial.print(" "); while(countTimeCommand < (maxTime*1)) { esp8266.println(command);//at+cipsend if(esp8266.find(readReplay))//ok { found = true; break; } countTimeCommand++; } if(found == true) { Serial.println("OYI"); countTrueCommand++; countTimeCommand = 0; } if(found == false) { Serial.println("Fail"); countTrueCommand = 0; countTimeCommand = 0; } found = false; }
做完了 温度数据将作为变量传输到数据库。
如您所见,我的气象站需要具备Web编程方面的初步知识,但这样做是值得的。