858|0

19

帖子

3

TA的资源

一粒金砂(中级)

楼主
 

【DigiKey创意大赛】门廊灯的实现-作品提交 [复制链接]

 

作品名称:门廊灯的实现
作者:你家吃的

 

一 作品介绍

    本作品作为一个自制智慧控制模块中心的实现。主要使用stm32mp1 作为控制中心,作为开发板集成度很好,网络模块很全面,使用开发板的有线网络,创建tcp服务端,实现100客户端位置,便于以后的控制模块扩展。

    控制中心发送控制指令,来控制门廊灯的灯效。

    设计的被控制模块为门廊灯模块,模块采用esp32芯片,除了基本的灯效控制,还利用了该模块的无线功能,创建tcp客户端,连接控制中心,接受控制中心的控制指令。

    目前灯效实现了数字的显示。以后使用过程中根据喜好继续扩展灯效。

 
二、系统框图

    门廊灯控制芯片和门廊灯灯集成在一块模块上,实现主要的功能。创建客户端后时刻监控服务器发送过来的控制指令,并实现相应的灯效。

    控制中心创建服务器后,接收用户输入的指令,目前使用控制台输入控制指令,并把指令发送到第一个客户端句柄。

    如下是 门廊灯的模块图,主要有一个esp32芯片和一个4*5灯盘。灯使用了ws2812b灯珠,使用一根线可控制所有的灯。设计了一个mos管,可实现灯的开启关闭。不过测试过程中,没调试出来,所以临时短接了mos管,删除了灯盘的开关功能。

三、各部分功能说明

3.1 控制中心

    采用了STM32MP157开发板,STM32MP157是一款双核主处理器+实时协处理器的soc,主处理器采用ARM Cortex-A7,频率可达650MHz, 实时协处理器采用Cortex-M4,频率可达209Mhz。最大支持1GByte的DDR3/3L, 具有千兆以太网。除了Cortex-A7 以及Cortex-M4之外的部件被称为核外外设或片上外设。 如GPIO、USART(串口)、I2C、SPI等都叫做片上外设.

将上图的主要功能可以归类为: Cortex A7内核、Cortex M4核的协处理器、总线、易失性存储、 可持久性存储、时钟、定时器、电源管理、高速通信、低速通信、网络、多媒体、 模拟信号处理、LCD控制器、安全和IO输入输出等。

3.2 esp32

   门廊灯模块采用ESP32­WROVER­E模组。ESP32-WROVER通用型 Wi-Fi + Bluetooth + Bluetooth LE MCU 模组,功能强大,用途广泛,可以用于低功耗传感器网络和要求极高的任务,例如语音编码、音频流和 MP3 解码等。采用 PCB 板载天线。CPU 时钟频率的调节范围为 80 MHz 到 240 MHz。用户可以关闭 CPU 的电源,利用低功耗协处理器监测外设的状态变化或某些模拟量是否超出阈值。ESP32 还集成了丰富的外设,包括电容式触摸传感器、SD 卡接口、以太网接口、高速 SPI、UART、I2S 和 I2C 等。Wi-Fi 支持极大范围的通信连接,也支持通过路由器直接连接互联网;而蓝牙可以让用户连接手机或者广播 Bluetooth LE Beacon 以便于信号检测。ESP32 芯片的睡眠电流小于 5 µA,使其适用于电池供电的可穿戴电子设备。模组支持的数据传输速率高达 150 Mbps,天线输出功率达到 20 dBm,可实现最大范围的无线通信。因此,这款模组具有行业领先的技术规格,在高集成度、无线传输距离、功耗以及网络联通等方面性能极佳,模组框图如下。

 

    esp32的设计框图如下,实现一个最小系统。

 

        设计的灯珠数量为4*9矩阵的灯盘,目前使用了4*5实现数字的显示,框图如下图。

 

   电源部分设计如下,使用typec接口的电源,并使用ams1117-3.3芯片,得到3.3伏电压,用来给esp32 供电。

四、作品源码

    嵌入式软件源码:

Porch light code.zip (32.51 KB, 下载次数: 0)

    上位机软件源码:

控制中心code.zip (20.78 KB, 下载次数: 0)

门廊灯硬件原理图

WS2812B-硬件原理图.zip (6.69 MB, 下载次数: 0)
创建tcp服务器

int createTcpSvr()
{
    logINO("ql_socket_service_create--");
    int ql_socket_id = 0;
    char ret = 0;
    int sk_port = 1111;

    /**************creat socket handle**********/
    if((ql_socket_id = socket(AF_INET,SOCK_STREAM,0)) < 0){
        perror("socket");
        return -1;
    }
    /**********************set socket addr reuse**********************/    
    int reuseaddr = 1;
    if(setsockopt(ql_socket_id, SOL_SOCKET, SO_REUSEADDR,(const void *)&reuseaddr,(socklen_t)sizeof(int)) == -1){
         perror("setsockopt\n");
         logRED("setsockopt----errno[%d]",errno);
         return -1;
    }else{
        printf("setsockopt\n");
    }

    /********************set socket property*************************/
    struct sockaddr_in service_addr;
    bzero(&service_addr,sizeof(service_addr));
    service_addr.sin_family=AF_INET;
    service_addr.sin_port=htons(sk_port);
    service_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    /**********************bind socket addr and port**********************/
    if (bind(ql_socket_id,(struct sockaddr *)&service_addr,sizeof(struct sockaddr)) == -1){
        perror("bind");
        return -1;
    }else{
        logGRE("bind success--sk_port[%d]",sk_port);
    }
    if(listen(ql_socket_id, PENDING_QUEUE) == -1){
        perror("listen");
        return -1;
    }else{
        logGRE("listen success");
    }    
    return ql_socket_id;
}
实现控制指令的下发

void ParsrPorchLightMode(char* inputStr)
{
	logWHI("ParsrPorchLightMode [%s]",inputStr);
	if(netInfo[1][1]){
		send(netInfo[1][0],inputStr,1,0);
	}
}
实现循环检测客户端的断连	

while(1){
        tempo_tv = dl_tv;
        FdsTempR = client_rset;    
        FdsTempW = client_wset;

        fdsFlag = select(maxFd+1,&FdsTempR,&FdsTempW,NULL,&tempo_tv);
        memset(data_buffer,0,DATA_BUF);
        switch(fdsFlag)
        {
        case -1:
            logPURP("error data len[%d]",fdsFlag);
            return -1;
        case 0:
            logPURP("time out ");
            break;
        default:
            if(FD_ISSET(netInfo[0][0],&FdsTempR)){
				logPURP(" there one client connected");
				new_sk = accept(netInfo[0][0] ,(struct sockaddr*)&CliInfo,&CLiLen);
				inet_ntop(AF_INET,&CliInfo.sin_addr,(char*)MyIP,IP_LEN);
				MyPort = ntohs(CliInfo.sin_port);
				logPURP(" there is a new client,fd[%d][%s][%d]",new_sk,MyIP,MyPort);
				for(int i = 0;i < FD_CNT;i++){
					if(netInfo[i][1] == 0){
						netInfo[i][0] = new_sk;
						netInfo[i][1] = 1;
						maxFd = new_sk > maxFd?new_sk:maxFd;
					    FD_SET(new_sk, &client_rset);
					    FD_SET(new_sk, &client_wset);

						break;
					}
				}
			}else{
				for(int i = 1;i < FD_CNT && netInfo[i][1];i++){
					if(FD_ISSET(netInfo[i][0],&FdsTempR)){
		                rec_len = recv(netInfo[i][0],data_buffer,DATA_BUF,0);
		                switch (rec_len)
		                {
		                case -1:
		                     logPURP(" error[%s]errno[%d]",strerror(errno),errno);                    
		                     return -1;
		                 case 0:
						 	netInfo[i][1] = 0;
							FD_CLR(netInfo[i][0], &FdsTempR);    
							FD_CLR(netInfo[i][0], &FdsTempW);    
		                    logPURP("client socket diconnect!!!sk[%d]",netInfo[i][0]);
		                    break;
		                default:
		                    logPURP("rec_len [%d]data_buffer[%s]",rec_len,data_buffer);
		                    break;
		                }
					}
		        }
			}
		}
	}
获取键盘输入,并发送数据到第一个客户端

void server_operate_cmd(void* buff)
{
	logWHI("server_operate_cmd");
	char inputStr[64] = {0};
	while(1){
		scanf("%s", inputStr);
		logWHI("inputStr [%s]",inputStr);
		ParsrPorchLightMode(data_buffer);
	}
}

五、作品功能演示视频

d6b54212ebf06320e9320708e3214892

六、项目总结

    本次 活动很棒,不过对于我来说确实时间有点太着急了,刚好时间卡在一次出差中间,耽误很多时间,出差回来,着急忙慌得开始写代码,实现硬件焊接和代码调试,以及控制中心的实现。尤其是esp32的烧录,消耗了好几天时间,最终发现是我的串口版故障,真是个很简单又弱智的故障。有一说一,esp32的无线模块实现的真好,可以很简单的快速实现网络。

    本项目结构比较简单,实现的门廊灯的代码,控制中心就相对容易很多了,只需要把控制指令发送出去。对于控制协议,没有设计,直接明文发送。

    后续稍加修改,可以实现手机控制门廊灯。回家之前一键开启门廊灯,方便快捷。

    报告的最后非常感谢DigiKey和EEWORLD,组织了这场活动,为众多电子爱好者和专业人士提供平台,帮助广大电子er实现自己的idea。

智慧门廊灯的实现.doc

637.5 KB, 下载次数: 3

点赞 关注
 
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表