3. LED的控制
3.1 LED驱动程序
     实质就是一个linux字符设备驱动
     
     $:' cd project
     $:' mkdir drivers
     $:' cd drivers
     $:' mkdir leds
     $:' cd leds
        // ---> madir drivers/leds -p
     $:' vi led_drv.c
     $:' vi Makefile
     $:' make
     $:' mkdir ../../rootfs/home/drivers
     $:' cp leds_drv.ko  ../../rootfs/home/drivers/
     $:' vi test.c
        // 验证程序。使用arm-...-gcc编译。
     
     编译test.c,测试驱动程序是否好用
     
3.2 编写LED的控制应用程序
      有两种方式
      3.2.1 简单的方式 - 槽函数方式1
           当点击亮灯按钮时,完成该信号的槽函数
           在槽函数中
           fd = open("/dev/leds", ...)
           ioctl(fd, CMD_LED_ON, &i); // i 是第几盏灯
           close (fd);
           修改图片
           
           再次点击时灭灯
           fd = open("/dev/leds", ...)
           ioctl(fd, CMD_LED_OFF, &i);
           close (fd);
           修改图片 
           GUI界面程序一定部署到开发板才能有效果
           
      3.2.2 复杂方式 - 槽函数方式2
           希望GUI界面程序不管是运行在PC
           或者运行在开发板,都能控制开发板的LED状态
           
           'Client (GUI 开发板/PC)'       'Server (UDP 运行在开发板)'
            点击按钮发送命令LED_ON         接收命令,根据命令open设备 ioctl亮灯
            sendto (sd, cmd);

公共头文件:project/include/ehome.h
        
         1)界面客户端程序 client
           $:' mkdir gui_client
           $:' cd gui_client
           $:' qtcreator
              建立工程 完成界面编程
              先将mainwindow窗口的大小调整为 1024*600
              添加按钮 - 转到槽
                  槽函数中给UDP服务器发送命令
              ---> 3.2.1
        2)服务器程序  server
           $:' cd project
           $:' mkdir server
           $:' cd server
           $:' vi server.c
              // udp 创建socket,接收客户端发送的命令,解析命令调用不同的硬件操作
              recvfrom(cmd) 
              if(cmd == LED_ON)
                 open("/dev/leds",...)
                 ioctl(fd, LED_ON, 0)  
          $:' vi leds.c
            // 进一步解析命令:操作哪盏灯,如何操作,调用对应灯的对应操作函数
          $:' vi leds_hw.c
            // hw 代表硬件 hardware,操作硬件
                      open
                      ioctl
                      close
          $:' arm-cor.....gcc server.c -o server
          $:' cp server rootfs/home/bin/
    #:' insmod /home/drivers/leds_drv.ko
    #:' source /home/etc/profile
    #:' /home/bin/server &
    #:' /home/bin/client

启动server
              启动client
              点击按钮实验是否亮灯
    
   注意编程过程中的调试技巧
#define DEBUG
#ifdef DEBUG
    /*##表示如果可变参数被忽略或为空,将使预处理器( preprocessor )去除掉它前面的那个逗号。*/
    #define pr_debug(fmt, ...) printf(fmt, ##__VA_ARGS__)
#else
    #define pr_debug(fmt, ...) 
#endif

BUG的调试,顺着数据流分析该调用的函数是否调用到。

/* leds_drv.c 驱动源代码 */#include <linux/init.h>
#include <linux/module.h>
#include <linux/miscdevice.h>#include <linux/gpio.h>
#include <linux/fs.h>
#include <mach/platform.h>
#include <linux/uaccess.h>MODULE_LICENSE("GPL");#define LED_ON  0x100001
#define LED_OFF 0x100002struct led_desc
{char *name;int gpio;
};struct led_desc leds[]=
{{"led_bedroom", PAD_GPIO_C+12},{"led_saloon", PAD_GPIO_C+7},{"led_kitchen", PAD_GPIO_C+11},{"led_restroom", PAD_GPIO_B+26},
};long leds_ioctl(struct file *file,unsigned int cmd,unsigned long arg)
{//1.定义内核缓冲区int kindex = 0;int ret = 0;int status = 0;//2.拷贝用户缓冲区到内核ret = copy_from_user(&kindex, (int *)arg, 4);//3.解析命令,操作硬件switch(cmd) {case LED_ON:status = 0;break;case LED_OFF:status = 1;break;default:return -EINVAL;}if(kindex>= 0 && kindex <4){gpio_direction_output(leds[kindex].gpio, status);}return 0;
}struct file_operations leds_fops =
{.owner = THIS_MODULE,.unlocked_ioctl = leds_ioctl,
};struct miscdevice leds_misc =
{.minor = MISC_DYNAMIC_MINOR,//自动分配次设备号.name  = "leds", //设备文件名称.fops = &leds_fops,
};
int __init leds_drv_init(void)
{int i = 0;for(; i<ARRAY_SIZE(leds); i++){gpio_request(leds[i].gpio, leds[i].name);}misc_register(&leds_misc);return 0;
}
void __exit leds_drv_exit(void)
{int i = 0;misc_deregister(&leds_misc);for(; i<ARRAY_SIZE(leds); i++){gpio_free(leds[i].gpio);}
}
module_init(leds_drv_init);
module_exit(leds_drv_exit);

Ehome:智能家居之led控制系统相关推荐

  1. 基于STM32单片机的智能家居窗户窗帘控制系统红外遥控proteus仿真原理图PCB

    功能: 0.本系统采用STM32F103RCT6作为单片机 1.LCD1602液晶实时显示当前时间/窗帘状态/光照强度 2.支持手动按键/定时/光强检测三种模式控制窗帘 3.'设置'键进入设置界面 4 ...

  2. 智能家居照明控制系统解决方案

    智能家居概念的提出已经有一段时间了,但对其的认识与了解仍然停留在表面,并没有切实将该系统进行实际应用. 智能家居照明控制系统方案,作为建设智能家居的应用控制系统之一,是对灯光效果进行智能控制与管理的系 ...

  3. c语言智能家居安防系统,智能家居之安防智能控制系统

    家是我们的避风港湾,家里藏着的都是我们生命里所有最宝贵的东西.所以家应该是温馨的,温暖的更应该是安全的.最近新出了一部电影<找到你>讲述的是姚晨主演的主角孩子在家里失踪的故事.孩子在家里失 ...

  4. 远程智能家居ZigBee控制系统

    0 引言 智能家居系统(SmartHome)最早源于欧美发达国家,是指以住宅为平台,利用现代计算机网络通讯.自动化控制技术.传感器技术.无线通讯技术.音视频技术,通过社区综合布线.社区局域网.Inte ...

  5. 基于ZigBee和STM32的智能家居控制系统的设计与实现(五)--终结篇

    基于ZigBee和STM32的智能家居控制系统的设计与实现(五)–终结篇 说明 首先祝贺自己顺利的完成了毕业答辩工作,想起整个过程还是挺让自己感动的.最后还被评为优秀毕业设计,虽然并没有什么luan用 ...

  6. 基于ZigBee和STM32的智能家居控制系统的设计与实现

    基于ZigBee和STM32的智能家居控制系统的设计与实现(一) 时间过的好快,已经到了做毕业设计的时候了,本次毕业设计题目是自己选的,为什么做这个?原因很简单,想把自己所学的大部分知识都应用上,虽然 ...

  7. STM32嵌入式实现智能家居控制系统

    本文将讲述如何用STM32嵌入式实现智能家居控制系统,所谓智能就是实时监测自主控制一些因素,如,温度.湿度.光照强度等,当室内光线较暗时自动打开灯,根据光线亮度的不同开灯数量也不同,当室内温度过高时红 ...

  8. 基于ESP32的智能家居控制系统-微信小程序

    一. 课题研究意义.现状及应用分析 1.1课题研究意义及现状 目前,科学技术发展十分迅速,其渗透到各行各业以及生活的方方面面,室内设计和高科技结合便出现了"智能家居".所谓智能家居 ...

  9. 实现智能家居控制系统

    本文将讲述如何用STM32嵌入式实现智能家居控制系统,所谓智能就是实时监测自主控制一些因素,如,温度.湿度.光照强度等,当室内光线较暗时自动打开灯,根据光线亮度的不同开灯数量也不同,当室内温度过高时红 ...

最新文章

  1. 数据挖掘原理与算法:对森林火灾影响因素的分析
  2. 基于阿里云 DNS API 实现的 DDNS 工具
  3. java嵌套类与内部类
  4. 阿米洛键盘取消win_阿米洛花旦娘静电容V2键盘测评:不止是一把好看的键盘
  5. 用python画大雄_python制作斗图生成器
  6. C#坏习惯:通过不好的例子学习如何制作好的代码——第2部分
  7. js 中的 __proto__
  8. 航迹推演(Odometry)_由左右轮速度v_l,v_r推导车辆的线速度v,角速度w,运动半径r
  9. 移动端问题列表及解决方案
  10. USB学习笔记--USB枚举过程
  11. 成都拓嘉启远:拼多多如何查看同行转化数据
  12. 私有化(xx,_x,__xx,__xx__,xx_)
  13. JAVA经典兔子问题
  14. QDialog无边框
  15. 硬件设计22之高速电路设计保险丝的选型
  16. 虚拟盘可以挂载多个服务器吗,两台云服务器挂载一个云硬盘吗
  17. 收藏!转型AI工程师必读
  18. OpenCV - 汽车识别
  19. 2017年Q1中国服务器市场研究报告
  20. 结构型模式--Proxy代理模式

热门文章

  1. Windows下VMware Workstations Pro15.5.0安装dmg镜像(macOS Catalina 10.15虚拟机)
  2. 史上最全IP正则表达式
  3. html文字底纹阴影,CSS3 彩虹背景、文字和阴影
  4. 一个案例弄懂ElasticSearch分词匹配原理和同义词
  5. 鸿蒙系统车联网,任正非表示鸿蒙系统将首先用于手表、智能8K大屏及车联网
  6. VS 后期生成事件语法格式
  7. 【Python】自动化办公-outlook邮箱处理(获取邮箱附件)/通过下载链接自动下载
  8. ETCD 源码学习--lease(一)
  9. 全国装配式工程师考试形式及报考条件介绍
  10. Deepchem构建基于分子指纹的神经网络模型