使用Wio终端实现一个微型的智能气象站

文件列表(压缩包大小 12.57M)

概述

元件清单

硬件清单

元件名称 数量
Seeed Wio Terminal 1
Seeed Grove DHT11 Temperature & Humidity Sensor 1

应用软件和在线服务

  • Arduino IDE
  • Microsoft Visual Studio Code

项目概况

项目介绍

一般来说,气象站项目需要将传感器连接到我们的微控制器平台上,并通过互联网连接到在线数据库实时读取数据,在液晶显示器上显示。今天分享这个气象站项目的智能版本,是通过Wio终端添加预测天气功能来实现的。使用板载的TensorFlow Lite模型,Wio终端能够使用实时温度和相对湿度数据进行半小时的天气预测!

项目需求

除了Arduino IDE来编写Wio终端,还需要一台配置了Python 3的计算机。使用Python脚本(.py文件)和Python笔记本(.ipynb文件)。我选择的代码编辑器是Microsoft的Visual Studio code。

温湿度数据的获取

  1. 自己测量和收集数据 可以使用一个简单的Arduino程序,定时采集环境数据,从而构建自己的数据集。
  2. 寻找一个免费的数据集或API 有许多api可用于获取天气数据,然而大多数都需要付费订阅才能访问。根据你的居住地,当地的机构或气象站可能免费提供这些数据。例如,新加坡的国家环境局(National Environmental Agency)为天气数据提供了一个API,可以通过编程方式免费查询历史天气数据。
  3. 用Python脚本获取数据 许多像Wunderground这样的网站免费提供详细的历史天气数据供参考,但是格式通常不易于处理,并非我们需要的CSV格式。我们可以通过使用程序抓取这些数据,这也是本项目使用的方法。 具体方法可以参考下面这两篇文章: Web Scraping Weather Data With Selenium Webdriver Scraping wunderground without API, using python

训练模型

在开始之前,必须安装以下库。Scikit-learn是另一个流行的机器学习库,它同时包括一些有用的数据处理功能。 pip install tensorflow scikit-learn 我们的主要目标是利用实时的温度和湿度数据来预测目前的天气状况,因此需要删除其他不需要的列。我们还将字符串中的温度和湿度值解析为整数值,同时将温度单位转换为开尔文(K)。 接下来很重要,可以到看到有三个列表将这些标签分为“No Rain”、“Might Rain”和“Rain”,对这些值进行一次性编码,用数字表示我们的类别。可以调整这些标签,使其更适合你居住的气候。

norain = ['Mostly Cloudy', 'Fair', ... , 'Partly Cloudy / Windy']
mightrain = ['Showers in the Vicinity', 'Thunder in the Vicinity', 'Thunder']
rain = ['Rain Shower', 'Light Rain Shower', 'Light Rain', ... , 'Light Rain / Windy']

接下来,为了更好地利用可用的输入数据,我们将只对给定的7个输入窗口执行一次预测。Wunderground的每个条目代表每隔半小时进行一次读操作。我们遵循这个原则,读取之前的6个半小时的数据来进行预测。 我们可以为模型提供更多的特征来识别输入和输出之间的模式,从而提高分类性能。你需要检查x和y数组的长度是否相同,确保此步骤已完成。

y = processed_data[["NoRain", "MightRain", "Rain"]].to_numpy()[7:]
rawx = processed_data.drop(columns = ["NoRain", "MightRain", "Rain"]).to_numpy()
 
x = []
temp = np.array(0)
for i in range(len(rawx)-7):
    temp = rawx[i:i+6].flatten()
    x.append(temp)
x = np.array(x)
x.shape, y.shape

下面的代码将数据拆分为训练和测试数据。

xtrain, xtest, ytrain, ytest = train_test_split(x, y, test_size = 0.20, random_state = 33)

之后继续定义我们的模型,如果你是机器学习的新手,可以访问这篇由Palash Sharma为初学者编写的短文

model = tf.keras.Sequential()
model.add(Dense(14, activation='relu'))
model.add(Dense(8, activation='relu'))
model.add(Dense(3, activation='softmax'))
 
model.compile(loss = 'categorical_crossentropy',
              optimizer = tf.optimizers.Adam(),
              metrics=['accuracy'])
 
model.fit(xtrain, ytrain, epochs=10, validation_split=0.1)

在Wio终端上实现机器学习

硬件设置

  • 将DHT11温湿度传感器插入Wio终端,如下图所示。

  • 安装Wio终端库 下载并安装Seeed DHT库。

  • 烧写Arduino代码 在向Wio终端烧写代码之前,有一件事需要注意。如果你更改了模型输出的标签,那么需要相应地编辑以下参数。

    const char* OUTPUTS[] = {
      "No Rain",
      "Might Rain",
      "Rain"
    };
    int NUM_OUTPUTS = 3;
    
  • Arduino代码亮点 最有挑战性的是如何构建FIFO(先进先出)结构来管理7个读取窗口。看看下面被截断的代码:

    if (array_count == 0 | millis() - dataMarker > 30 * 60000) {
        dataMarker = millis();
    
        for (int i=0; i<12; i++) {
          temp_hum_val[i] = temp_hum_val[i+2];
        }
    
        temp_hum_val[12] = reading[1] + 273.15;
        temp_hum_val[13] = reading[0];
        array_count ++;
    
        if (array_count > 7) array_count = 7;
        if (array_count == 7) {
          
          // Copy array into tensor inputs
          for (int i=0; i<14; i++) {
            tflInputTensor->data.f[i] = temp_hum_val[i];
          }
          
          // Run inference on data (not shown)
          // Get and display output (not shown)
        }
    }
    

    当我们第一次启动Wio终端时,array_count的初始值为0。我们将使用这个变量来记录我们已经完成的读取总数,以确保我们至少有7个阅读用于机器学习模型的预测数据。 for循环将所有值的指数向前移动2,并且删除最早的温度和湿度读数。然后把最新的传感器读数分配到队列的后面,并增加array_count值。

    for (int i=0; i<12; i++) {
          temp_hum_val[i] = temp_hum_val[i+2];
    }
    

    每隔半个小时,我们将再次运行这段代码来采样数据,直到我们建立了一个有14个值的数组(例如。一旦array_count的值达到7,我们将复制存储的temp_hum_val数组值到模型的输入指针,并开始调用TF Lite解释器进行预测。

管理Wio终端内存

在编辑Arduino时要注意Wio终端上的内存只有192K字节。我的Wio终端在调用AllocateTensors()函数时多次冻结,我怀疑这是由于可用内存不足造成的。

最终产品

我们的智能气象站现已准备就绪!下图展示了累积7次半小时读数后的结果。智能气象站将更新半个小时的数据进来!在测试中可以通过减小将读数放入模型输入的间隔的方式来检查解释器是否正常工作。

转载自https://www.hackster.io/supperted825/build-a-tinyml-smart-weather-station-with-wio-terminal-1ec8ee

理工酷提示:

如果遇到文件不能下载或其他产品问题,请添加管理员微信:ligongku666,并备注:产品反馈

评论(0)

0/250
免费
赞 1
收藏 0
评论 0
举报

网站声明:本站所有资源均为用户上传,如果侵犯了您的合法权益,请点击上方举报按钮,或添加管理员微信:ligongku666 ,并备注:举报。我们将快速核实并处理。

文件编号:1128
上传时间:2021-03-02
文件大小:12.57M

太阳照常升起

声望 • 710

分类:
电子/通信
标签:
iot嵌入式