使用Wio终端实现一个微型的智能气象站
文件列表(压缩包大小 12.57M)
免费
概述
硬件清单
元件名称 | 数量 |
---|---|
Seeed Wio Terminal | 1 |
Seeed Grove DHT11 Temperature & Humidity Sensor | 1 |
应用软件和在线服务
一般来说,气象站项目需要将传感器连接到我们的微控制器平台上,并通过互联网连接到在线数据库实时读取数据,在液晶显示器上显示。今天分享这个气象站项目的智能版本,是通过Wio终端添加预测天气功能来实现的。使用板载的TensorFlow Lite模型,Wio终端能够使用实时温度和相对湿度数据进行半小时的天气预测!
除了Arduino IDE来编写Wio终端,还需要一台配置了Python 3的计算机。使用Python脚本(.py文件)和Python笔记本(.ipynb文件)。我选择的代码编辑器是Microsoft的Visual Studio code。
在开始之前,必须安装以下库。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)
硬件设置
将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解释器进行预测。
在编辑Arduino时要注意Wio终端上的内存只有192K字节。我的Wio终端在调用AllocateTensors()函数时多次冻结,我怀疑这是由于可用内存不足造成的。
我们的智能气象站现已准备就绪!下图展示了累积7次半小时读数后的结果。智能气象站将更新半个小时的数据进来!在测试中可以通过减小将读数放入模型输入的间隔的方式来检查解释器是否正常工作。
转载自https://www.hackster.io/supperted825/build-a-tinyml-smart-weather-station-with-wio-terminal-1ec8ee
如果遇到文件不能下载或其他产品问题,请添加管理员微信:ligongku001,并备注:产品反馈
评论(0)