功能簡介:
該項目是基于STM32F407-RT-SPARK開發板的智能花盆。通過溫濕度傳感器和光照傳感器,它能夠監測花盆土壤當前的溫濕度和附近的光照強度,并將這三項數據實時顯示在LCD屏上。它還能夠監測花盆是否傾倒,監測到花盆傾倒后,蜂鳴器會發出警報,直到按下按鍵,警報停止。同時,它還配備了rw007模塊,能將這些數據實時上傳到onenet平臺。
硬件框架:
使用到的模塊包括:LCD屏、溫濕度傳感器、光照傳感器、蜂鳴器、物理按鍵
圖一 硬件實物圖與使用到的模塊
圖二 硬件框架圖
軟件框架:
圖三 軟件框架圖
軟件模塊說明及部分代碼:
1.六軸傳感器線程:
六軸傳感器模塊測量花盆的偏航角、橫滾角和俯仰角,并將測量數據發送給CPU進行判斷,若花盆傾倒,記錄異常數據。
icm20608_device_t devvv = RT_NULL;
rt_err_t result;
devvv = icm20608_init(i2c_bus_namee);
if (devvv == RT_NULL)
{
LOG_E("The sensor initializes failure");
return 0;
}
else
{
LOG_D("The sensor initializes success");
}
/* 對 icm20608 進 行 零 值 校 準: 采 樣 10 次, 求 取 平 均 值 作 為 零 值 */
result = icm20608_calib_level(devvv, 10);
if (result == RT_EOK)
{
LOG_D("The sensor calibrates success");
LOG_D("accel_offset: X%6d Y%6d Z%6d", devvv- >accel_offset.x, devvv- >accel_offset.y, devvv- >accel_offset.z);
}
else
{
LOG_E("The sensor calibrates failure");
icm20608_deinit(devvv);
return 0;
}
rt_int16_t accel_x, accel_y, accel_z;
/* 讀 取 三 軸 加 速 度 */
result = icm20608_get_accel(devvv, &accel_x, &accel_y, &accel_z);
if (result == RT_EOK)
{
LOG_D("current accelerometer: accel_x%6d, accel_y%6d, accel_z%6d",
accel_x, accel_y, accel_z);
}
else
{
LOG_E("The sensor does not work");
break;
}
2.LCD顯示線程:
該線程初始化后會持續讀取溫度、濕度和光照數據,并將其實時顯示在LCD顯示屏上。
lcd_clear(WHITE);
lcd_set_color(WHITE, RED);
lcd_show_string(10, 0, 16, "Hello!");
lcd_set_color(WHITE, BLACK);
lcd_show_string(10, 26, 32, "Temperature:");
lcd_show_string(10, 90, 32, "Humidity:");
lcd_show_string(10, 160, 32, "Light:");
lcd_set_color(WHITE, BLUE);
lcd_show_num(30, 26+32, temperature, 2, 32);
lcd_show_string(65,26+32,32,"C");
lcd_show_num(30, 90+32, humidity, 2, 32);
lcd_show_string(65, 90+32, 32, "%");
lcd_show_num(30, 160+32, brightness, 2, 32);
lcd_show_string(80, 160+32, 32, "lux");
3.光強傳感器線程:
光強傳感器模塊將記錄光強數據,用于LCD顯示和云端顯示。
brightness = ap3216c_read_ambient_light(devv);
LOG_D("current brightness: %d.%d(lux).", (int)brightness, ((int)(10 * brightness) % 10));
4.rw007線程(Onenet):
讀取rw007模塊傳來的溫濕度數據、光照數據并存儲到云端以圖表方式進行顯示;若傾倒角度數據異常,會在云端進行報警。
int onenet_publish_digit(int argc, char **argv)
{
if (argc != 3)
{
LOG_E("onenet_publish [datastream_id] [value] - mqtt pulish digit data to OneNET.");
return -1;
}
if (onenet_mqtt_upload_digit(argv[1], atoi(argv[2])) < 0)
{
LOG_E("upload digit data has an error!n");
}
return 0;
}
int onenet_publish_string(int argc, char *argv)
{
if (argc != 3)
{
LOG_E("onenet_publish [datastream_id] [string] - mqtt pulish string data to OneNET.");
return -1;
}
if (onenet_mqtt_upload_string(argv[1], argv[2]) < 0)
{
LOG_E("upload string has an error!n");
}
return 0;
}
/ onenet mqtt command response callback function */
static void onenet_cmd_rsp_cb(uint8_t *recv_data, size_t recv_size, uint8_t **resp_data, size_t *resp_size)
{
char res_buf[] = { "cmd is received!n" };
LOG_D("recv data is %.sn", recv_size, recv_data);
/ user have to malloc memory for response data */
*resp_data = (uint8_t *) ONENET_MALLOC(strlen(res_buf));
strncpy((char *)*resp_data, res_buf, strlen(res_buf));
resp_size = strlen(res_buf);
}
/ set the onenet mqtt command response callback function */
int onenet_set_cmd_rsp(int argc, char *argv)
{ onenet_set_cmd_rsp_cb(onenet_cmd_rsp_cb);
return 0;
}
MSH_CMD_EXPORT(onenet_set_cmd_rsp, set cmd response function);
#endif / FINSH_USING_MSH */
5.溫濕度線程:
溫濕度傳感器模塊測量土壤的溫濕度,并記錄測量數據。
temperature=(int)temperature+(int)(temperature10)%10;
humidity=(int)humidity+(int)(humidity10)%10;
brightness=(int)brightness+(int)(brightness*10)%10;
rt_thread_mdelay(100);
onenet_mqtt_upload_digit("temperature", temperature);
rt_thread_mdelay(100);
onenet_mqtt_upload_digit("humidity", humidity);
rt_thread_mdelay(100);
onenet_mqtt_upload_digit("brightness", brightness);
6.蜂鳴器線程:
讀取六軸傳感器數據,并對花盆的傾倒狀態進行判斷。若花盆傾倒,蜂鳴器報警,可通過開發板上的按鍵關閉蜂鳴器。
/* 設置按鍵引腳為輸入模式 */
rt_pin_mode(PIN_KEY1, PIN_MODE_INPUT_PULLUP);
rt_pin_mode(PIN_WK_UP, PIN_MODE_INPUT_PULLUP);
/* 設置蜂鳴器引腳為輸出模式 */
rt_pin_mode(PIN_BEEP, PIN_MODE_OUTPUT);
/* 設置按鍵中斷模式與中斷回調函數 */
rt_pin_attach_irq(PIN_KEY1, PIN_IRQ_MODE_FALLING, irq_callback, (void *) PIN_KEY1);
rt_pin_attach_irq(PIN_WK_UP, PIN_IRQ_MODE_FALLING, irq_callback, (void *) PIN_WK_UP);
/* 使能中斷 */
rt_pin_irq_enable(PIN_KEY1, PIN_IRQ_ENABLE);
rt_pin_irq_enable(PIN_WK_UP, PIN_IRQ_ENABLE);
int topple;
int X,Y,Z;
X=devvv->accel_offset.x;
Y=devvv->accel_offset.y;
Z=devvv->accel_offset.z;
if(abs(Y)<=10000){
topple=0;
rt_pin_write(PIN_BEEP,PIN_LOW);
LOG_D("KEY1 interrupt. beep off.");
}
else{
topple=1;
rt_pin_write(PIN_BEEP,PIN_HIGH);
LOG_D("WK_UP interrupt. beep on.");
break;
}
Onenet頁面展示
-
STM32
+關注
關注
2272文章
10925瀏覽量
357643 -
LCD屏
+關注
關注
0文章
122瀏覽量
15522 -
蜂鳴器
+關注
關注
12文章
893瀏覽量
46107 -
溫濕度傳感器
+關注
關注
5文章
581瀏覽量
35855 -
STM32F407
+關注
關注
15文章
188瀏覽量
29657 -
OneNET
+關注
關注
1文章
51瀏覽量
12879
發布評論請先 登錄
相關推薦
評論