首页 > 其他分享 >基于树莓派实现 --- 智能家居

基于树莓派实现 --- 智能家居

时间:2024-03-19 13:58:05浏览次数:24  
标签:树莓 struct int pfind cmd 智能家居 --- fd device

最效果展示

演示视频链接:基于树莓派实现的智能家居_哔哩哔哩_bilibiliicon-default.png?t=N7T8https://www.bilibili.com/video/BV1Tr421n7BM/?spm_id_from=333.999.0.0

PS:房屋模型的搭建是靠纸板箱和淘宝买的家居模型,户型参考了留学时短租的公寓~) 

前言

到目前为止,对于linux的嵌入式软件开发,从底层到上层都有了一定的认识。这个项目的初衷就是整合知识并以工厂模式的架构开发项目。

功能实现

  1. 实现了socket服务器远程控制卧室,餐厅,厕所,客厅4盏灯的开启和关闭
  2. 实现了语音控制卧室,餐厅,厕所,客厅4盏灯的开启和关闭
  3. 实现了当温度超过阈值的时候进行火灾报警,并且可以语音关闭警报
  4. 实现了进门前结合语音,OLED和摄像头的人脸识别
  5. 实现了实时的远程视频监控
  6. 实现OLED屏幕的实时温湿度显示

开发环境 & 实现思路

  • 开发板:树莓派3B+
  • 开发语言:C
  • 编程工具:Source Insight 3

工厂设计

对于这个项目的实现,采用上节学到的工厂模式来设计,从而提升整体代码的稳定性和可拓展性。

软件设计模式 --- 类,对象和工厂模式的引入-CSDN博客

 阅读功能需求后,结合工厂模式的思路可以先设计两个工厂:指令工厂设备工厂

  • 指令工厂:存储需要使用到的指令
  • 设备工厂:存储需要使用到的设备

工厂模式的主要的考量有两点:

1. 工厂的类
struct device //设备工厂
{
	char device_name[64]; //设备名称
	int status;

	int (*init)(); //初始化函数
	int (*open)(); //打开设备的函数
	int (*close)(); //关闭设备的函数
	int	(*read_status)(); //查看设备状态的函数
	
	
	struct device *next;
};


struct cmd //指令工厂
{
	char cmd_name[64]; //指令名称
	//char cmd_log[1024]; //指令日志
	int (*init)(int port, char *IP, char *UART, int BAUD); //初始化函数
	int (*accept)(int fd); //接受函数
	int (*cmd_handler)(struct device *phead, int fd); //处理指令的函数
	
	
	struct cmd *next;
};
2. 工厂的对象

实现思路Q&A

Q:如何实现socket服务器的远程控制?

A:使用之前学习的socket知识,创建一个服务端一个客户端,服务端负责创建套接字并绑定,然后阻塞监听;客户端负责建立连接后发送指令。指令在服务端通过指令工厂中socket对象的cmd_handler函数进行分析并作出相关动作。最后在main函数中使用一个线程不断阻塞等待新客户端的加入;使用另一个线程不断阻塞接受客户端传来的指令并分析。

参考我之前的博文:

标签:树莓,struct,int,pfind,cmd,智能家居,---,fd,device
From: https://blog.csdn.net/mjmmm/article/details/135516194

相关文章

  • .Net Core微服务 - Seq 日志聚合
    Seq简介Seq是一款使用现代化技术构建的结构化日志存储,查询,分析工具。比起ELK这种组合要轻量级许多。只需要一个安装包就具有数据存储,查询,图表分析功能。它对windows友好,直接提供了安装包。当然也可以使用docker来部署。Seq对于单个用户是免费的,这对于一些小团队并没有什......
  • .Net Core微服务 - Serilog+Seq记录日志
    Serilog介绍Serilog是用于.NET应用程序的诊断日志记录库。它易于设置,具有干净的API,并且可以在所有最新的.NET平台上运行。Serilog通过NuGet分发,项目包括一个Seirlog核心项目Seirlog和很多接收器sinks(超过100个),这些接收是通过插件的方式来实现将日志写入到各种终端、文件......
  • UI自动化测试中公认最佳的设计模式-POM
    p>什么是POM?POM是PageObjectModule(页面对象模式)的缩写,其目的是为了WebUI测试创建对象库。在这种模式下,应用涉及的每一个页面应该定义为一个单独的类。类中应该包含此页面上的页面元素对象和处理这些元素对象所需要的方法等。将流程所关联的页面作为对象,将对象串联起来,形成一个个......
  • 在cifar-10数据集上t-sne可视化效果最好(๑•̀ㅂ•́)و✧
    还是需要在python上面保存模型,加载模型,然后提取特征保存为mat文件就行了(但我现在只加载了64维特征,4096维特征还没试过,估计也可以但应该会又慢又不好看)①先放matlab可视化t-sne的代码%加载特征数据data=load('10_157_ckpt.pth.mat');features=data.features;labels=dat......
  • 同步-异步思考
    同步:一件事情执行结束后,才能执行下一件事. 1.只有一个线程:  2.有两个线程: 上面两个模型都是在执行任务2的时候,不会执行任务3,等任务2执行结束的时候才执行任务3伪代码:main(){定义变量a=1;a=awaitget_number_two();打印a的......
  • 探索GHD22020-2充电模块的奥秘
    随着科技的飞速发展,充电技术也在不断创新和进步。GHD22020-2高频充电模块,以其卓越的性能和高效的充电效率,成为了市场上的一颗璀璨明珠。GHD22020-2高频充电模块采用了先进的高频充电技术,能够实现快速、稳定的充电效果。相比传统充电方式,它拥有更高的充电效率,大大缩短了充电时......
  • C语言经典例题 --- 公因数、素数、闰年
    文章目录如何用代码实现求两个值之间的最大公因数呢?如何计算闰年?如何用代码实现判断一个数是否为素数如何用代码实现求两个值之间的最大公因数呢?代码如下:#include<stdio.h>intmain(){intm=0;intn=0;intmin=0;scanf("%d%d",&......
  • 二分查找法 - C语言
    二分查找法比如我买了件300以下的衣服,你好奇,想知道到底多少钱,我让你猜,你会怎么猜呢?答案:你每次会猜中间数,不会从1开始猜。#include<stdio.h>intmain()//二分查找法(折半查找法){ intleft=0; intmid=0; intn=0; intarr[]={1,2,3,4,5,6,7,8,9,10}; ......
  • SIT3051-3.3V 供电、1Mbps、待机与远程唤醒、低电流 CAN 总线收发,兼容替代MAX051
    SIT3051是一款应用于CAN协议控制器和物理总线之间的接口芯片,与具有CAN控制器的3.3V微处理器、微控制器(MCU)和数字信号处理器(DSP)或者等效协议控制器结合使用,具有高速、斜率控制、待机、低电流关断四种工作模式,共模范围可达-7V~+12V,可应用于工业自动化......
  • AtCoder Beginner Contest 345 A-F 题解
    A-LeftrightarrowQuestion给你一个由<、=和>组成的字符串\(S\)。请判断\(S\)是否是双向箭头字符串。字符串\(S\)是双向箭头字符串,当且仅当存在一个正整数\(k\),使得\(S\)是一个<、\(k\)个=和一个>的连接,且顺序如此,长度为\((k+2)\)。Solution按照题意......