65.9K
CodeProject 正在变化。 阅读更多。
Home

树莓派的物联网家居设备

starIconstarIconstarIconstarIconstarIcon

5.00/5 (11投票s)

2018 年 3 月 13 日

CPOL

3分钟阅读

viewsIcon

15220

基于 Raspberry Pi、Linux、Swagger、Docker 和 .NET Core 的家庭物联网设备

引言

在构建了 IoT.Starter.Pi.Thing 系列的物联网胚胎后,我们现在准备向物联网家庭智能迈出更重要的一步。开发策略和环境基于以下内容:

  • Raspberry Pi:Raspbian GNU/Linux 9.1 Stretch Lite 已安装在 Raspberry Pi (RPI) 主机上,并且 debian:stretch-slim 镜像基于 .NET Core 2.1 Preview 1 构建。更多关于 RPI 设置的详细信息可在此处 这里 以及 wiki 中找到。
  • Swagger:API First Design 策略用于开发一个由 SwaggerHub 自动生成的 ASP.NET Core Web 服务器。Thing specification 展示了在家庭智能应用程序中使用的 `Thing` 胚胎的最小要求。每次 API 更改后,SwaggerHub 会自动生成更新的代码来构建 `home-srv` docker 镜像,最终推送到 DockerHub。
  • Docker:在快速的 Windows x64 机器上完成多阶段 docker 镜像构建,生成 Linux-arm 框架的代码。镜像被推送到云端,然后拉回到运行 Linux 的 Raspberry Pi 上。通过在 x64 和 Linux-arm 两端执行,docker-compose 命令有助于正确构建、部署和运行容器。
  • Lirc:由 RemoteAPI 驱动的 `IoT.Home.Thing` 模拟了传统的红外遥控器。Linux 红外遥控器已安装在 RPI 主机和 `home-srv` 容器上,为 `Thing` 增加了 IR 遥控器及其相应的 IR 代码。

请查看 IoT.Starter.Pi.Thing 以获取有关先前开发的更多详细信息。

创建新存储库

这是一个机会,可以将 `IoT.Starter.Pi.Thing` 用作此新项目的起点。第一步只是复制整个源代码作为 `IoT.Home.Thing` 的起点。然后,基于之前的文件,创建 `home-compose.yml`,如下所示:

version: "3"

services:
  io.swagger:
    container_name: home-srv
    image: josemottalopes/home-srv
    build:
      context: .
      dockerfile: Lirc/srv.Dockerfile
    ports:
    - "5000:5000"
    network_mode: bridge
    privileged: true
    restart: always
    devices:
      - /dev/mem:/dev/mem
    volumes:
    - /var/run/lirc:/var/run/lirc
    environment:
      - ASPNETCORE_ENVIRONMENT=Release

  home.ui:
    container_name: home-cli
    image: josemottalopes/home-cli
    build:
      context: .
      dockerfile: src/Home.UI/cli.Dockerfile
    ports:
    - "80:80"
    network_mode: bridge
    restart: always
    environment:
      - ASPNETCORE_ENVIRONMENT=Release
 
  ssl.proxy:
    container_name: ssl-proxy
    image: josemottalopes/home-ssl
    build:
      context: .
      dockerfile: Proxy/proxy.Dockerfile
    ports:
    - "443:443"
    network_mode: bridge
    restart: always

Raspberry# IO

当前的 Raspberry# IO 是一个适用于 Raspberry Pi 的 .NET/Mono IO 库,由 Raspberry# Community 发起。它已由 Ramon Balaguer 更新为 .NET Standard 1.6 兼容性。为了将 RPI 项目定位到 .NET Core 2,相同的库代码再次升级,现在是 .NET Core 2.1 Preview 1

增加了对 RPI3/BCM2835 的支持,这是基于 Michaltalaga 的 帖子。以下模块可用,您可以在 home/src 中查看。测试未包含。

  • Raspberry.System:包含处理器、主板、型号等的定义。
  • Raspberry.IO:包含数字和模拟引脚输入和输出的基本 I/O。
  • Raspberry.IO.Interop:Linux I/O 控制设备和内存管理。
  • Raspberry.IO.GeneralPurpose:通过内存访问 Raspberry Pi GPIO 引脚,支持边沿检测,允许亚毫秒级轮询输入引脚。
  • Raspberry.IO.SerialPeripheralInterface:提供 SPI 的初步支持,使用 Linux 内核 SPI 模块驱动程序。
  • Raspberry.IO.InterIntegratedCircuit:提供 I2C 的初步支持。
  • Raspberry.IO.Components:提供对各种组件的初步支持,包括将用作示例的 HC-SR04 距离检测器。

带 HC-SR04 的距离测量仪

HC-SR04 是一个超声波模块,提供非接触式测量功能,测量范围从 2 到 400 厘米。如图所示,它有四个引脚:

  • Vcc 和 Ground
  • 触发脉冲输入
  • 回声脉冲输出

如时序图所示,基本工作原理是:

  • 在触发输入上发出至少 10 微秒(microseconds)的高电平脉冲。
  • 模块自动发送八个 40 kHz 的声波。
  • 模块检测是否有信号返回,并根据声音发出和返回传感器所需的时间来提高回声输出引脚。
  • 已知声速为 340 m/s,即可计算出传感器到障碍物的距离。

仅为演示目的,HC-SR04 已连接到 GPIO 引脚:

  • 触发脉冲输入连接到 GPIO20,连接器引脚 38。
  • 回声脉冲输出连接到 GPIO21,连接器引脚 40。

然后,`GetHeaterState` 代码被调整为使用 Raspberry#IO 库中的 HC-SR04 距离检测器。

    /// <summary>
    /// 
    /// </summary>
    /// <remarks>gets the state of the heater</remarks>
    /// <param name="zoneId"></param>
    /// <response code="200">heater state</response>
    [HttpGet]
    [Route("/motta/home/1.0.1/temperature/{zoneId}/heater")]
    [ValidateModelState]
    [SwaggerOperation("GetHeaterState")]
    [SwaggerResponse(200, typeof(HeaterState), "heater state")]
    public virtual IActionResult GetHeaterState([FromRoute]string zoneId)
    {
        const ConnectorPin triggerPin = ConnectorPin.P1Pin38;
        const ConnectorPin echoPin = ConnectorPin.P1Pin40;

        double distance = 0;
        string state = null;

        Console.WriteLine("info: HC-SR04 distance measure");
        Console.WriteLine("      Trigger: {0}", triggerPin);
        Console.WriteLine("      Echo: {0}", echoPin);

        var driver = GpioConnectionSettings.DefaultDriver;

        using (var connection = new HcSr04Connection(
            driver.Out(triggerPin.ToProcessor()),
            driver.In(echoPin.ToProcessor())))

            try
            {
                distance = connection.GetDistance().Centimeters;
                Console.WriteLine(string.Format("{0:0.0}cm", distance).PadRight(16));
                //Console.CursorTop--;
            }
            catch (TimeoutException e)
            {
                state = "Timeout: " + e.Message;
            }

        if (state == null) state = string.Format("{0:0.0} cm", distance);

        HeaterState hs = new HeaterState
        {
            Id = zoneId,
            State = state
        };

        var hs_state = hs ?? default(HeaterState);
        return new ObjectResult(hs_state);
    }

最终结果可以通过 Swagger UI 获得,如下所示:

现在,`IoT.Home.Thing` 已配备了强大的软件,可用于改进家庭智能项目。

玩得开心!

喜欢吗?请给我一个 ⭐️!

历史

© . All rights reserved.