越是不可能,越要创造无限可能!目前在人工智能的领域里探索

认证信息

认证项目: 基于Arduino的天气判断模型

项目简介:该项目基于DHT11湿度模块以及DS18B20测温模块,经过模型训练后,可以输出实时的天气情况,并将数据保存在数据库中。该项目可以应用在智能家居,如智能晾衣架,智能窗户等;

最近上手了DHT11湿度模块以及DS18B20测温模块,于是想着能不能用温度和湿度这两个数据做些什么。我们知道:

温度与湿度在一定程度上和天气有关,下雨时,湿度会高一些;晴天时,湿度会略低一些

因此我们可以根据这一点来判断天气,下面是这次实践的4大步骤:

01 使用Arduino获取温度与湿度数据

获取数据首先需要一些硬件:

Arduino UNO开发板(其他型号的也ok)

DS18B20测温模块

DHT11湿度模块(自带测温模块,但是精度没有DS18B20高)

如果没有的话,我们也可以通过网络爬虫抓取中国天气网当前时段所有城市的天气数据(python+xpath)。

有了硬件以后我们便可以开始了,首先是连线:

湿度模块

测温模块

连线方式很简单,首先GND表示接地,接到开发板上任意的GND即可

VCC可以理解为电源,开发板上有3.3V和5V两种,接到哪一个都行

剩下的就是一些数据传输的接口了:

这里有一排接口,随便接哪个都OK的(请自行忽略那个帽子掉了的杜邦线)

接下来我们打开Arduino的IDE,导入库及定义引脚

初始化设置

循环体

floattempC = sensors.getTempCByIndex( 0); //获取索引号0的传感器摄氏温度数据if(tempC != DEVICE_DISCONNECTED_C) //如果获取到的温度正常{Serial.print( "temputer:");Serial.print(tempC);Serial.print( "℃");Serial.print( ",");}sensors.requestTemperatures; //发起新的温度转换// Serial.print("Tempeature:"); //打印出Tempeature:// Serial.println(tem); //打印温度结果Serial.print( "humidity:"); //打印出Humidity:Serial.print(hum); //打印出湿度结果Serial.print( "%"); //打印出%}delay( 5000);}

下面是输出结果:

很好,现在已经可以获取温度和湿度数据了!

02 使用正则表达式清洗数据并保存到MySQL

这时我们需要用到python,先来读取以下串口的数据:

serialPort = "COM6"#串口baudRate = 9600#波特率ser = serial.Serial(serialPort, baudRate, timeout= 0.5)print( "参数设置:串口=%s ,波特率=%d"% (serialPort, baudRate))

whileTrue:str = ser.readline.decode( 'utf-8')ifstr.strip!= '':print(str)

这里设置了一个条件判断,不为空行时才输出,不然输出时会有很多空行

输出时,带有一些文字,这时我们用正则表达式处理,把文字去掉,只留数值加上符号:

先把逗号前面的内容捕获,然后把temputer以及冒号出去,最后把最后面的逗号也除去即可:

湿度的处理方法同上:

下面我们只需要把这些数据存到数据库即可,先进入MySQL建个表:

设置4个属性,分别是id,温度,湿度以及更新时间,下面我们用python把数据存进去:

连接数据库

存入数据

connection.close请自行放在循环体外,数据全部存入后再执行该条语句

来看下数据表:

因为是每5秒获取一次数据,所以变化不大,但是如果放一天,还是能看出变化的:

可以看出,从早上到中午,温度越来越高,而湿度是越来越低

03 构建SVM分类器并训练模型

这里我们需要用到一个机器学习库sklearn:

创建它很简单:

难就难在我们怎么导入数据?

这里我手动对数据做了处理,添加上了标签:

数据量太大,就不全部展示了哈哈哈,简单介绍一下,这里有四个标签:

Sunny

Cloudy

Rainy

Snowy

为了便于数据加载,这里我们把标签转换成数值:

下面我们处理好的数据读取进来:

有了数据以后,就可以开始训练了:

计算一下各项指标:

defprint_accuracy(clf,x_train,y_train,x_test,y_test):#分别打印训练集和测试集的准确率 score(x_train,y_train):表示输出x_train,y_train在模型上的准确率print( 'trianing prediction:%.3f'%(clf.score(x_train, y_train)))print( 'test data prediction:%.3f'%(clf.score(x_test, y_test)))#原始结果与预测结果进行对比 predict表示对x_train样本进行预测,返回样本类别show_accuracy(clf.predict(x_train), y_train, 'traing data')show_accuracy(clf.predict(x_test), y_test, 'testing data')

最后在主函数里整体调用:

if__name_ _== '__main__':main

来看一下准确率:

接近100%了,看来模型效果不错,下面我们来实际测试一下

04 把模型应用到Arduino实时检测天气上

if__name__ == '__main__':main

这是最基础版的,下面我们把Arduino返回的数据导入:

if__name__ == '__main__':main

结合了前面几部分的内容:

这样便可以实时地输出天气结果了!

读完上文,你可能会有疑问, 如何成为柴火认证会员?

申请柴火认证会员,目前有两条渠道:

如果你有技术背景,可通过提交项目直接申请认证;

如果你是技术小白,欢迎报名参加 『柴 火新一代信息技术』培训,通过结业项目进行认证;

特大好消息!『柴火新一代信息技术』 硬件开发入门首期培训班(开班时间:5月16-17日,周末),已经开始招生啦 (点击了解详情)!通过这个培训,你可以:

通过课程设计的 70%实操 ,动手造物,搭建项目原型,入门硬件开发

三证加持 ,拿到柴火创客空间颁发的培训证书&国家工信部教育与考试中心颁发的专项技术中级证书,以及柴火认证会员证书

背靠柴火近10年 国际创客社区资源 积累,融入国际创客社区圈子

点击上图,前往了解更多培训招生详情

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐