玩嗨 OpenHarmony:基于 OpenHarmony 的智慧牧场方案 4/4 室内管理系统篇

玩嗨 OpenHarmony:基于 OpenHarmony 的智慧牧场方案 4/4 室内管理系统篇

原文引自电子发烧友论坛 HarmonyOS技术社区 《基于OpenHarmony的智慧牧场》

1. 背景知识

1.1 室内管理系统的意义

在智慧牧场解决方案中,随着科技的发展,物联网、无线通信、大数据计算等技术的不断发展,在越来越多行业中得到应用,智能化生产的概念也深入人心。为提升养殖业的投入产出比、减少料肉/奶比、提升生产效率、改善养殖环境的生态环境、减低禽畜疫病滋生的可能性,打造一体化、数字式、自动化的管理模式。而室内管理系统,是其中的重中之重,也最为复杂。

1.2 室内管理系统涵盖内容

以养牛为例,利用光照、温、湿度、日照等传感器实时采集分析畜牛棚室内光照强度、空气和氨气、日照等环境参数,并自动调节开启或关闭所需设备(比如:包括天窗,水幕,风扇、水泵、污水处理等)。实时检测气态浓度、H2S浓度、CO2浓度、光照强度、气压、灰尘、环境噪声、环境温度、奶牛体温及录像图像,由模型分析,遥控或自动控制湿帘风机、喷淋滴灌、供暖照明、排风扇、开窗机等通风换气设备等设备。为了保证高产量、高质量、生态、安全的奶牛安全,确保室内环境最适合家畜生长并提高奶牛福利。

使用机器人和流水线饲喂奶牛,记录奶牛饮食数据,同时给每一头牛戴上智能项圈和计步手环,对牛只的身体状况和运动数据实时监控。同时监控用水用料的数据,动态调整投喂策略,包括投喂量和投喂频率(包括:饲喂机和自动饮水器)。

智能养牛的室内管理系统采用奶厅智能检测系统,自动识别奶牛身份,自动上传班次挤奶情况。同时可以根据温度自动控制风机、喷淋、和光照设备,保证每一头牛在极度舒适的情绪下产奶。

使用室内空气温控技术,实现从牧场产奶到零售终端全程冷链和无漏点式温度监控。

与此同时,在牛棚内设置摄像机等监测设备,对大棚内7-24小时连续监测,实现了奶牛养殖的智能化生产与科学管理。

2. 解决方案概要

该方案尝试用OpenHarmony实现光照强度检测、温湿度检测、水位控制和图传部分。

3.  硬件设计

3.1 光照检测传感器 BH1750

典型的电路应用如下:

I2C总线时序图如下:

3.2 湿度和温度传感器 SHT20

典型的电路应用如下:

时序图如下:

4. 软件设计

4.1 光照强度部分:

/***************************************************************
* 函数名称: Start_BH1750
* 说    明: 启动BH1750
* 参    数: 无
* 返 回 值: 无
***************************************************************/
void Start_BH1750(void)
{
    WifiIotI2cData bh1750_i2c_data = {0};
    uint8_t send_data[1] = {0x10};
    bh1750_i2c_data.sendBuf = send_data;
    bh1750_i2c_data.sendLen = 1;
    I2cWrite(WIFI_IOT_I2C_IDX_1, (BH1750_Addr << 1) | 0x00, &bh1750_i2c_data);
}
4.2 温湿度部分:

/***************************************************************
* 函数名称: Init_SHT30
* 说    明: 初始化SHT30,设置测量周期
* 参    数: 无
* 返 回 值: 无
***************************************************************/
void Init_SHT30(void)
{
    WifiIotI2cData sht30_i2c_data = {0};
    uint8_t send_data[2] = {0x22, 0x36};
    sht30_i2c_data.sendBuf = send_data;
    sht30_i2c_data.sendLen = 2;
    I2cWrite(WIFI_IOT_I2C_IDX_1, (SHT30_Addr << 1) | 0x00, &sht30_i2c_data);
}
4.3 水位控制部分:

static float GetVoltage(void)
{
    unsigned int ret;
    unsigned short data;

    ret = AdcRead(WIFI_IOT_ADC_CHANNEL_2, &data, WIFI_IOT_ADC_EQU_MODEL_8, WIFI_IOT_ADC_CUR_BAIS_DEFAULT, 0xff);
    if (ret != WIFI_IOT_SUCCESS)
    {
        printf("ADC Read Fail\n");
    }

    return (float)data * 1.8 * 4 / 4096.0;
}
4.4 图传部分:

#include "esp_camera.h"
#include <WiFi.h>

#define CAMERA_MODEL_AI_THINKER

#include "camera_pins.h"

const char* ssid = "**";
const char* password = "123456789";

void startCameraServer();

void setup() {
  Serial.begin(115200);
  Serial.setDebugOutput(true);
  Serial.println();

  camera_config_t config;
  config.ledc_channel = LEDC_CHANNEL_0;
  config.ledc_timer = LEDC_TIMER_0;
  config.pin_d0 = Y2_GPIO_NUM;
  config.pin_d1 = Y3_GPIO_NUM;
  config.pin_d2 = Y4_GPIO_NUM;
  config.pin_d3 = Y5_GPIO_NUM;
  config.pin_d4 = Y6_GPIO_NUM;
  config.pin_d5 = Y7_GPIO_NUM;
  config.pin_d6 = Y8_GPIO_NUM;
  config.pin_d7 = Y9_GPIO_NUM;
  config.pin_xclk = XCLK_GPIO_NUM;
  config.pin_pclk = PCLK_GPIO_NUM;
  config.pin_vsync = VSYNC_GPIO_NUM;
  config.pin_href = HREF_GPIO_NUM;
  config.pin_sscb_sda = SIOD_GPIO_NUM;
  config.pin_sscb_scl = SIOC_GPIO_NUM;
  config.pin_pwdn = PWDN_GPIO_NUM;
  config.pin_reset = RESET_GPIO_NUM;
  config.xclk_freq_hz = 20000000;
  config.pixel_format = PIXFORMAT_JPEG;
  //init with high specs to pre-allocate larger buffers
  if(psramFound()){
    config.frame_size = FRAMESIZE_UXGA;
    config.jpeg_quality = 10;
    config.fb_count = 2;
  } else {
    config.frame_size = FRAMESIZE_SVGA;
    config.jpeg_quality = 12;
    config.fb_count = 1;
  }

#if defined(CAMERA_MODEL_ESP_EYE)
  pinMode(13, INPUT_PULLUP);
  pinMode(14, INPUT_PULLUP);
#endif

  // camera init
  esp_err_t err = esp_camera_init(&config);
  if (err != ESP_OK) {
    Serial.printf("Camera init failed with error 0x%x", err);
    return;
  }

  sensor_t * s = esp_camera_sensor_get();
  //initial sensors are flipped vertically and colors are a bit saturated
  if (s->id.PID == OV3660_PID) {
    s->set_vflip(s, 1);//flip it back
    s->set_brightness(s, 1);//up the blightness just a bit
    s->set_saturation(s, -2);//lower the saturation
  }
  //drop down frame size for higher initial frame rate
  s->set_framesize(s, FRAMESIZE_QVGA);

#if defined(CAMERA_MODEL_M5STACK_WIDE)
  s->set_vflip(s, 1);
  s->set_hmirror(s, 1);
#endif

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");

  startCameraServer();

  Serial.print("Camera Ready! Use 'http://");
  Serial.print(WiFi.localIP());
  Serial.println("' to connect");
}

void loop() {
  // put your main code here, to run repeatedly:
  delay(10000);
}

写在最后

我们最近正带着大家玩嗨OpenHarmony。如果你有好玩的东东,欢迎投稿,让我们一起嗨起来!有点子,有想法,有Demo,立刻联系我们:

合作邮箱:zzliang@atomsource.org