精华内容
下载资源
问答
  • 】巧借阿里云物联网平台的免费连接,从微信小程序颜色采集控制 esp8266 输出七彩灯效果,中秋节来个直播如何?! 【 微信公众号控制硬件 第10篇 】如何在微信公众号网页实现连接mqtt服务器教程!! 【 微信小...

    微信小程序控制硬件第1篇 】 全网首发,借助 emq 消息服务器带你如何搭建微信小程序的mqtt服务器,轻松控制智能硬件!
    微信小程序控制硬件第2篇 】 开始微信小程序之旅,导入小程序Mqtt客户端源码,实现简单的验证和通讯于服务器!
    微信小程序控制硬件第3篇 】 从软件到硬件搭建一个微信小程序控制esp8266的项目,自定义通讯协议,为面试职位和比赛项目加分!
    微信小程序控制硬件第4篇 】 深度剖析微信公众号配网 Airkiss 原理与过程,esp8266如何自定义回调参数给微信,实现绑定设备第一步!
    微信小程序控制硬件第5篇 】理清接下来必须走的架构思想,学习下 JavaScript 的观察者模式,在微信小程序多页面同时接收到设备推送事件!
    微信小程序控制硬件第6篇 】服务器如何集成七牛云存储SDK,把用户自定义设备图片存储在第三方服务器!
    微信小程序控制硬件第7篇 】动起来做一个微信小程序Mqtt协议控制智能硬件的框架,为自己心里全栈工程师梦想浇水!!
    微信小程序控制硬件第8篇 】微信小程序以 websocket 连接阿里云IOT物联网平台mqtt服务器,封装起来使用就是这么简单!
    微信小程序控制硬件第9篇 】巧借阿里云物联网平台的免费连接,从微信小程序颜色采集控制 esp8266 输出七彩灯效果,中秋节来个直播如何?!
    微信公众号控制硬件 第10篇 】如何在微信公众号网页实现连接mqtt服务器教程!!
    微信小程序控制硬件 第11篇 】全网首发,微信小程序ble蓝牙控制esp32,实现无需网络也可以控制亮度开关。

    一、前言;


             我近乎2个月没更新 8266 工程代码了,确实在做一些与硬件端无关的工作,在做前端开发工程师的工作,在做一个共享类的蓝牙功能的微信小程序。现在做好了,抽出半天时间做一个小项目并分享给大家使用教程;

             微信小程序我敢说是目前很火的,涉及到领域太多了,很多客户都是想做这个,因为大大节省成本和时间;

             最近在看 github 无意中看到了 在微信小程序实现颜色采集器效果,于是乎想通过这种绚丽的效果控制esp8266控制七彩灯,动下手指,一个下午就搞出来了;

             但是,写文档的时间远远大于我开发时间,不得不说,写博客是个 技术活,需要耐心!!!


    二、准备材料;


    1. 服务器端:我不再像我之前那个连接百度云物联网了(之前出过一篇文章),因为有人照我教程写了许多文章出来;我这里采用是 阿里云物联网平台,不用给钱那种哦!
    2. 设备端:乐鑫esp8266模块一个,我建议是开发板一个,以及一个 ws2812 模块;
    3. 微信端:请自行注册微信小程序账户,直接扔进我写好的代码就好了;

    三、实现原理;


             我没有说我是个大神,前几个月有人喷我不要不要的,我个人较为念旧;实现的原理,我会竭尽全力去阐述,因为大家意见都不可能不一样!有错误的,请留言或加群讨论!

             咳咳,下面开始说重点了:

             在微信小程序端实现控制 esp8266 我是从 2018年开始研究了,过程中主要是服务器难搭建,那时候 阿里云物联网或者百度天工,都是不支持 微信小程序 websocket 连接的,所以无法借助成熟的物联网平台开发;

             因此,那时候我写了一篇博客,专门自己搭建 mqtt 服务器 让微信小程序 websocket 连接,主要是代理 443 端口;

    https://blog.csdn.net/xh870189248/article/details/84070944
    

             很幸运,今年的2月份左右,阿里云物联网或者百度天工相继支持了微信小程序 websocket 连接 443 端口 支持 MQTT 协议 ;所以,过程如下图:

    1. 微信小程序前端采集颜色,得到 rgb 三个数值,上报给阿里云服务器;
    2. 阿里云服务器设置 规则引擎,把微信小程序前端采集颜色数据转发到设备端;
    3. 设备端连接阿里云服务器,收到服务器数据并且解析作出对应端动作;

     {
       "cmd":"set",
       "data": [ 249 , 2 , 2 ]
     }
    
    通讯协议 说明
    data[0] 红色数值
    data[1] 绿色数值
    data[2] 蓝色数值

    Banner


    四、服务器操作过程;


    • 先新建产品时候,注意 数据格式一定是自定义/透传,而我自定义2个主题,用来通讯,然后自行创建这个产品的2个设备!!

    在这里插入图片描述

    • 关键一步:设置消息引擎,设置为设备间通讯,先设置要处理的消息来源,下面就是把 deviceName 为 rgb2812 的设备上报的数据为来源;

    在这里插入图片描述

    • 同时别忘了,要设置转发数据的目的地,下面指定是 deviceName 为 rgb_esp8266 的客户端为收到数据 :

    在这里插入图片描述

    • 最后,记得启动 这个规则:

    在这里插入图片描述


    三、微信端操作过程;


    • 微信小程序连接阿里云物联网的示范代码我在今年五月份已经更新上去了,只需要三元组就可以链接啦,随便贴下地址:

       https://github.com/xuhongv/WeChatMiniEsp8266
      
    • 连接之后就是控制的逻辑,主要发布的主题必须是在阿里云物联网上定义好的,否则发布失败或者设备端收不到的尴尬!

    • 选择器触发事件控制:

       //选择改色时触发(在左侧色盘触摸或者切换右侧色相条)
       onChangeColor(e) {
            //返回的信息在e.detail.colorData中
            let getColor = e.detail.colorData.pickerData;
            console.log('红色', (getColor.red))
            console.log('绿色', (getColor.green))
            console.log('蓝色', (getColor.blue))
            that.sendCommond('set', [(getColor.red), (getColor.green), (getColor.blue)]);
        }
    
    • 开灯按钮事件控制:
     onClickOpen() {
          that.sendCommond('set', [0, 255, 0]);
        },
    
    • 关灯按钮事件控制:
     onClickOpen() {
         that.sendCommond('set', [0, 0, 0]);
        },
    

    • 最后一点尤其注意,设置合法域名:不检验就好;如果看不下去,自己去后台添加这个阿里域名;
      在这里插入图片描述

    四、设备端操作过程;


    • 一开始我是驱动 ws2812 的,因为我之前也有文章介绍,都是现成的代码:
    https://blog.csdn.net/xh870189248/article/details/93518975
    
    1. 过程:

      • 初始化外设 ws2812(未连接路由器是红灯,连接成功路由器是绿灯);
      • 连接指定的路由器,成功后,通过给定的三元组组成 mqtt 连接的账号密码,再去连接阿里云物联网服务器;
      • 成功连接阿里云物联网服务器后,订阅指定主题,等待服务器下发数据;

    • 我宏定义下阿里云给的三元组等信息;
    char productKey[] = {"a1o3SXAACTs"};                        //阿里云连接的三元组 ,请自己替代为自己的产品信息!!
    char deviceName[] = {"rgb_esp8266"};                        //阿里云连接的三元组 ,请自己替代为自己的产品信息!!
    char deviceSecret[] = {"0uyLBfxAItzbwOURw2aMXVwasc5FT5Np"}; //阿里云连接的三元组 ,请自己替代为自己的产品信息!!
    char regionId[] = {"cn-shanghai"};                          // 阿里云连接的三元组 ,请自己替代为自己的产品信息 !!
    
    #define MQTT_DATA_PUBLISH "/a1o3SXAACTs/rgb_esp8266/user/pub" //发布的主题
    #define MQTT_DATA_SUBLISH "/a1o3SXAACTs/rgb_esp8266/user/sub" //订阅的主题
    
    • 生成 mqtt 连接的参数以及连接服务器;
    void TaskXMqttRecieve(void *p)
    {
    
        char BorkerHost[50];
        sprintf(BorkerHost, "%s.iot-as-mqtt.%s.aliyuncs.com", productKey, regionId);
        char UserName[50];
        sprintf(UserName, "%s&%s", deviceName, productKey);
        char ClientId[90];
        char messageSerect[200];
        sprintf(messageSerect, "clientId%02x:%02x:%02x:%02x:%02x:%02xdeviceName%sproductKey%stimestamp1995", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5], deviceName, productKey);
        sprintf(ClientId, "%02x:%02x:%02x:%02x:%02x:%02x|securemode=3,signmethod=hmacmd5,timestamp=1995|", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
    
        char PassWord[80];
        HMAC_XH_MD5((uint8_t *)messageSerect, strlen(messageSerect), (uint8_t *)(deviceSecret), PassWord);
    
        ESP_LOGI(TAG, "BorkerHost: %s", BorkerHost);
        ESP_LOGI(TAG, "UserName: %s", UserName);
        ESP_LOGI(TAG, "PassWord: %s", PassWord);
        ESP_LOGI(TAG, "ClientId: %s", ClientId);
    
        //连接的配置参数
        esp_mqtt_client_config_t mqtt_cfg = {
            .host = BorkerHost,
            .username = UserName,
            .password = PassWord,
            .client_id = ClientId,
            .port = 1883,                       //端口
            .event_handle = MqttCloudsCallBack, //设置回调函数
            .keepalive = 200,
            .disable_auto_reconnect = false, //开启自动重连
            .disable_clean_session = false,  //开启 清除会话
        };
    
        ESP_LOGI(TAG, "TaskXMqttRecieve mqtt_cfg.host %s", mqtt_cfg.host);
        ESP_LOGI(TAG, "TaskXMqttRecieve mqtt_cfg.username %s", mqtt_cfg.username);
        ESP_LOGI(TAG, "TaskXMqttRecieve mqtt_cfg.client_id %s", mqtt_cfg.client_id);
        ESP_LOGI(TAG, "TaskXMqttRecieve mqtt_cfg.messageSerect %s", messageSerect);
    
        esp_mqtt_client_handle_t client = esp_mqtt_client_init(&mqtt_cfg);
        esp_err_t error = esp_mqtt_client_start(client);
    
        vTaskDelete(NULL);
    }
    

    • 程序内,不做配网流程,直接写死路由器连接:
    /**
     * @description:   wifi指定的路由器初始化
     * @param {type} 
     * @return: 
     */
    static void initialise_wifi(void)
    {
        tcpip_adapter_init();
    
        ESP_ERROR_CHECK(esp_event_loop_init(event_handler, NULL));
        wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
        ESP_ERROR_CHECK(esp_wifi_init(&cfg));
        ESP_ERROR_CHECK(esp_wifi_set_storage(WIFI_STORAGE_RAM));
        wifi_config_t wifi_config = {
            .sta = {
                .ssid = "MZX5L",          //路由器名字
                .password = "mzx@123456", //路由器密码
            },
        };
        ESP_LOGI(TAG, "Setting WiFi configuration SSID %s...", wifi_config.sta.ssid);
        ESP_LOGI(TAG, "Setting WiFi configuration password %s...", wifi_config.sta.password);
        ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));
        ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config));
        ESP_ERROR_CHECK(esp_wifi_start()); //开始连接
    }
    

    • 根据前面的协议,我们解析这个数据并且驱动 ws2812 ;
            首先整体判断是否为一个json格式的数据
            cJSON *pJsonRoot = cJSON_Parse(event->data);
    
            //如果是否json格式数据
            if (pJsonRoot == NULL)
            {
                break;
            }
            cJSON *pCMD = cJSON_GetObjectItem(pJsonRoot, "cmd");
            cJSON *pValue = cJSON_GetObjectItem(pJsonRoot, "data");
            //判断字段是否pChange格式
            if (pCMD && pValue)
            {
                ESP_LOGI(TAG, "xQueueReceive topic: %s ", event->topic);
                ESP_LOGI(TAG, "xQueueReceive payload: %s", event->data);
                ESP_LOGI(TAG, "esp_get_free_heap_size : %d \n", esp_get_free_heap_size());
    
                //判断字段是否数组类型
                if (cJSON_IsArray(pValue))
                    printf("get pChange:%s \n", pCMD->valuestring);
                else
                    break;
    
                ws2812_setColor(cJSON_GetArrayItem(pValue, 0)->valueint, cJSON_GetArrayItem(pValue, 1)->valueint, cJSON_GetArrayItem(pValue, 2)->valueint);
                //post_data_to_clouds();
            }
            else
                printf("get pCMD failed \n");
            cJSON_Delete(pJsonRoot);
    

    五、好消息;


    • 去年在b站直播的微信小程序控制8266的视频,还是有很多人看,再过几天中秋节了,小徐不回家,呜呜!准备搞个直播微信小程序控制8266,内容就是本篇的博客;

    • 直播时间:2019年9月13号 中秋节当晚 7:30 到 9:30

    • 直播间:钉钉群,下载钉钉app扫描下面进群就可以了;

    • 直播内容:

      • 微信小程序的基本使用,如何使用mqtt协议在微信小程序上;
      • 如何使用阿里云物联网来做mqtt服务器;
      • esp8266如何连接阿里云物联网,如何处理数据并且驱动 ws2812;
      • 过程中,欢迎大家提问!!!
    • 观看直播的小伙伴,赠送本博文里面的源码,包括 微信小程序端和硬件esp8266端源码

    • 助物联网发展,欢迎大家一起加群讨论哦!喷子的请不要加了!!

    • 先开源微信端源码:https://github.com/xuhongv/WCMiniColorSetForEsp8266

    • 硬件端请加群或直播后获取!!

    • 直播回放: https://www.bilibili.com/video/av67657513

    Banner


    另外,不要把我的博客作为学习标准,我的只是笔记,难有疏忽之处,如果有,请指出来,也欢迎留言哈!

    • 玩转esp8266带你飞、加群付费QQ群,不喜的朋友勿喷勿加:434878850
    • esp8266源代码学习汇总(持续更新,欢迎star):https://github.com/xuhongv/StudyInEsp8266
    • esp32源代码学习汇总(持续更新,欢迎star):https://github.com/xuhongv/StudyInEsp32
    • 关注下面微信公众号二维码,干货多多,第一时间推送!
    展开全文
  • 3. 可以通过按钮暂停彩灯效果,使小灯全亮,再次按下相同按钮后继续之前的效果; 4. 增加自动在几种效果间切换的功能,并设置一个按钮可以在自动模式和手动模式间切换; 5. 使用定时中断延时。 程序中实现了十钟灯光...
  • esp32 sdk编程利用rmt驱动ws2812七彩灯,实现彩虹渐变效果。对应的博客 https://blog.csdn.net/xh870189248/article/details/90897877
  • 彩灯广告屏

    2021-04-25 18:51:36
    这些彩灯可以是用霓虹灯管制成各种形状和各种颜色的灯管,也可以是用白炽灯或者日光灯做光源,照亮大幅或巨幅的宣传画彩灯控制可以达到宣染效果,是通过控制全部或者部分彩灯的亮和灭,闪烁的频率,灯的亮度及灯光流...

    1.任务描述

    彩灯在我们日常生活中随处可见的,无论是美化,亮化工程,还是企业的广告宣传,都借助与彩灯的形势,使得各个城市的夜晚光彩夺目,缤彩纷呈。这些彩灯可以是用霓虹灯管制成各种形状和各种颜色的灯管,也可以是用白炽灯或者日光灯做光源,照亮大幅或巨幅的宣传画彩灯控制可以达到宣染效果,是通过控制全部或者部分彩灯的亮和灭,闪烁的频率,灯的亮度及灯光流的方向来实现。在不太复杂的彩灯控制中,一般可以采用单片机或者各种专用的彩灯控制器来实现,本设计是采用信捷PLC来完成课题设计的。

    该广告屏共有8根灯管,24只流水灯,每4只灯为一组,示意图和时序图如下图所示:彩灯广告屏示意图
    在这里插入图片描述

    2.控制方案要求

    ①广告屏中间部分有8根彩灯管,从左到右排列,编号1-8。系统启动以后,灯管点亮的顺序依次为: 1-2-3-4-5-6-7-8号,时间间隔为1秒,8根彩灯管全亮后,持续10秒,然后按8-7-6-5-4-3-2-1号的顺序依次熄灭,时间间隔为1秒。灯管全熄灭后等待2秒,在从8号灯管开始,按照8-7-6-5-4-3-2-1号的顺序依次点亮,时间间隔为1秒,灯管全亮后,持续20秒,再按照1-2-3-4-5-6-7-8号的顺序熄灭,时间间隔仍为1秒,灯管全熄灭后等待2秒,再重新开始上述的过程的循环。

    ②广告屏四周安装有24只流水灯,4只一组,共分成6组即( I-II-III-IV-V-VI)。统启动以后,按照从I -VI顺序,间隔为1秒点亮并循环。18 秒后,按照VI- I的顺序,依次点亮并进行循环。再按照I -VI的顺序循环往复,直到系统停止工作。

    ③系统用启动按钮和停止按钮操作,并有单步/连续控制。

    ④启动时,灯管和流水灯同时启动,关闭时,可同时也可分别关闭。

    3.触摸屏设计要求

    ①显示彩灯广告屏当前所处的工作状态和模式,要做到只看触摸屏也能知道彩灯广告屏的状态。

    ②相关时间必须可以设置,且要掉电保持;显示定时时间或者倒计时,精确到0.1秒;显示大小循环的系数。

    ③模拟动画,要求可以从动画中直观的看出彩灯广告屏当前的工作状态。

    ④停止按下,记忆当前状态,再按启动继续;停止的情况下再按一次停止,复位到初始状态。

    4.流程图

    在这里插入图片描述

    5.软元件分配

    在这里插入图片描述

    6.硬件接线图

    在这里插入图片描述

    7.PLC编程

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    8.HMI绘制

    在这里插入图片描述

    9.总结

    在这里,有两个点需要注意,一个是通过时钟脉冲+计数计数器来完成定时功能,另一个则是通过一次给多个寄存器赋值来实彩灯和流水灯的亮灭。

    由于在做题时,题目要求不允许使用定时器,所以需要PLC自带的时钟脉冲+计数器来完成定时。

    如下图,当按下启动按钮后,电路导通,SM12开始每0.1s发送一个上升沿,计数器D1通过上升沿开始累加。当D1的值大于等于HD1(设定的时间)里的设定值后,M601导通,彩灯①亮。
    在这里插入图片描述

    比如,M601为彩灯①所代表的寄存器,当M601=1时,彩灯①亮,当M601=0时,彩灯①灭,其他彩灯和流水灯亮灭的原理也是如此。用这种方法,需要将彩灯和流水灯的状态用二进制表示出来,当彩灯①亮,其他彩灯灭时,使用指令[MOV K1 DM601]。

    展开全文
  • 节日彩灯控制电路

    2021-02-03 17:14:24
    若用彩灯串组合成相应的庆祝文字或彩色图案,其依次点亮时的效果就如同五颜六色的霓虹灯一般,可为节日增添许多喜庆气氛。现以用其控制由8个彩灯串组合成的“庆祝建国五十周年”的标语彩灯为例将该电路介绍如下,供...
  • 可以通过按钮暂停彩灯效果,使小灯全亮,再次按下相同按钮后继续之前的效果; 增加自动在几种效果间切换的功能,并设置一个按钮可以在自动模式和手动模式间切换; 使用定时中断延时。 运行效果 (为方便演示,速度...

    题目要求

    • 用16盏以上的LED小灯,实现至少4种彩灯灯光效果(不含全部点亮,全部熄灭);
    • 可以用输入按钮在几种灯光效果间切换;
    • 可以通过按钮暂停彩灯效果,使小灯全亮,再次按下相同按钮后继续之前的效果;
    • 增加自动在几种效果间切换的功能,并设置一个按钮可以在自动模式和手动模式间切换;
    • 使用定时中断延时。

    运行效果

    (为方便演示,速度已调快一倍处理)
    最终实现的效果
    一共实现有十钟灯光效果,分别是:

    顺时针流水灯、逆时针流水灯、交替闪烁、顺时针对角灯、逆时针对角灯、顺时针逐个点亮、顺时针逐个熄灭、逆时针逐个点亮、逆时针逐个熄灭、二进制加法。

    完整代码

    #include <reg51.h>
    #define false 0
    #define true 1
    #define uchar unsigned char
    #define uint unsigned int
    sbit pause_key = P3^0;  //暂停按钮
    sbit auto_key = P3^1;   //手动模式的效果切换
    sbit change_key = P3^2; //手动模式效果切换
    sbit pauseLed = P3^6;   //暂停、启动指示灯
    sbit autoLed = P3^7;    //自动、手动模式指示灯
    int ledCode[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //led段码(单个显示)
    int ledCode2[8]={0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00}; //led段码(半显示半灭)
    int disCode[10]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09}; //数码管段码 0~9
    void displayLed(void);  //显示led的主函数
    void keyScan(void); //键盘扫描处理函数
    void Delay10ms(unsigned int n); //延时10ms
    bit isPause = false;    //是否暂停
    bit isAuto = true;  //是否自动运行
    bit isChange = false;   //是否要切换下一个效果
    uchar time;   //计时满0.5s
    uchar types;    //第几种灯光显示方案
    uint counts;    //灯光的第几个
    /******************************************************************************* 
    * 函 数 名          : T0_INT
    * 函数功能         : T0定时器中断函数
    * 输      入         : 无
    * 输      出         : 无 
    *******************************************************************************/
    void T0_INT(void)  interrupt 1
    {
        TL0= (65536-50000)/256;
        TH0= (65536-50000)%256;
        time ++;
        if(time >= 10) //定时时间:0.5s
        {
            time=0;
            if(isChange == true)    //可以变换下一种显示效果了
            {
                counts = 0;
                types++;    //显示下一种效果
                if(types > 9) types = 0;
                P0 = disCode[types];        //更新数码管显示
                isChange = false;
            }
            displayLed();
            counts++;
        }
    }
    /******************************************************************************* 
    * 函 数 名          : main
    * 函数功能         : 主函数
    * 输      入         : 无
    * 输      出         : 无 
    *******************************************************************************/
    void main(void)
    {
        TMOD=0x61; //0110 0001  //方式一
        TL0= (65536-50000)/256;     //50ms
        TH0= (65536-50000)%256;
        TR0=1;      //开启T0
        ET0=1;      //T0中断允许
        EA=1;   //总中断开启
        time = 0;   //定时器时间扩种(0.5s)
        counts = 0; //灯光的第几次    
        types = 0;  //灯光显示模式
        pauseLed = 0; //暂停指示灯灭
        P0 = disCode[types];        //更新数码管显示
        while(1)
        {
            keyScan();  //键盘扫描及处理
        }
    }
    /******************************************************************************* 
    * 函 数 名          : keyScan
    * 函数功能         : 键盘扫描处理
    * 输      入         : 无
    * 输      出         : 无 
    *******************************************************************************/
    void keyScan(void)
    {
        if(pause_key == 0)  //按下了暂停按钮
        {
            Delay10ms(1);
            if(pause_key == 0)
            {
                isPause = ~isPause;
                pauseLed = isPause;
                if(isPause == true)
                {
                    ET0=0;      //关闭T0中断
                    P0 = 0xfd;  //数码管显示 “-”
                    P1 = 0x00;  //所有的灯都亮起来
                    P2 = 0x00;
                }else{
                    ET0=1;      //T0中断允许
                    P0 = disCode[types];        //更新数码管显示
                    displayLed();
                }
                while(pause_key == 0);  //防止按键重复检测
            }
        }
        if(auto_key == 0)   //自动、手动切换按键按下
        {
            Delay10ms(1);
            if(auto_key == 0)
            {
                isAuto = ~isAuto;
                autoLed = isAuto;
            }
            while(auto_key == 0);   //防止按键重复检测
        }
        if(change_key == 0 && isAuto == false)  //手动模式,并且效果切换按下
        {
            Delay10ms(1);
            if(change_key == 0)
            {
                isChange = true;
            }
            while(change_key == 0); //防止按键重复检测
        }
    }
    /******************************************************************************* 
    * 函 数 名          : displayLed
    * 函数功能         : 显示led灯
    * 输      入         : (全局变量 )types:显示效果;counts:当前效果下的第几次
    * 输      出         : 无 
    *******************************************************************************/
    void displayLed(void)
    {
        switch(types)
        {
            case 0: //顺时针旋转led灯
            {
                if(counts >= 16) counts = 0;
                if(counts >=15)
                {
                    if(isAuto == true) isChange = true;
                }
                if(counts <8)
                {
                    P1 = 0xff;
                    P2 = ledCode[7-counts];
                }
                else
                {
                    P1 = ledCode[15-counts];
                    P2 = 0xff;
                }
                break;
            }
            case 1: //逆时针旋转LED灯
            {
                if(counts >= 16) counts = 0;
                if(counts >=15)
                {
                    if(isAuto == true) isChange = true;
                }
                if(counts <8)
                {
                    P1 = ledCode[counts];
                    P2 = 0xff;
                }
                else
                {
                    P1 = 0xff;
                    P2 = ledCode[counts-8];
                }
                break;
            }
            case 2: //交叉替换
            {
                if(counts >= 16) counts = 0;
                if(counts >=15)
                {
                    if(isAuto == true) isChange = true;
                }
                if(counts % 2 == 0) //偶数
                {
                    P1=0xaa;
                    P2=0xaa;
                }
                else
                {
                    P1=0x55;
                    P2=0x55;
                }
                break;
            }
            case 3: //对角顺时针
            {
                if(counts >= 8) counts = 0;
                if(counts >=7)
                {
                    if(isAuto == true) isChange = true;
                }
                P1 = ledCode[7 - counts];
                P2 = ledCode[7 - counts];
                break;
            }
            case 4: //对角逆时针
            {
                if(counts >= 8) counts = 0;
                if(counts >=7)
                {
                    if(isAuto == true) isChange = true;
                }
                P1 = ledCode[counts];
                P2 = ledCode[counts];
                break;
            }
            case 5: //顺时针逐个点亮
            {
                if(counts >= 17) counts = 0;
                if(counts <8)
                {
                    P1 = ~ledCode2[7 - counts];
                    P2 = 0xff;
                }
                else if(counts <16)
                {
                    P1 = 0x00;
                    P2 = ~ledCode2[15 - counts];
                }
                else    //全亮
                {
                    P1 = 0x00;
                    P2 = 0x00;
                    if(isAuto == true) isChange = true;
                }
                break;
            }
            case 6: //顺时针逐个又灭掉
            {
                if(counts >= 17) counts = 0;
                if(counts <8)
                {
                    P1 = ledCode2[7 - counts];
                    P2 = 0x00;
                }
                else if(counts <16)
                {
                    P1 = 0xff;
                    P2 = ledCode2[15 - counts];
                }
                else    //全灭
                {
                    P1 = 0xff;
                    P2 = 0xff;
                    if(isAuto == true) isChange = true;
                }
                break;
            }
            case 7: //逆时针逐个点亮
            {
                if(counts >= 17) counts = 0;
                if(counts <8)
                {
                    P1 = 0xff;
                    P2 = ledCode2[counts];
                }
                else if(counts <16)
                {
                    P1 = ledCode2[counts - 7];
                    P2 = 0x00;
                }
                else    //全亮
                {
                    P1 = 0x00;
                    P2 = 0x00;
                    if(isAuto == true) isChange = true;
                }
                break;
            }
            case 8: //逆时针逐个灭掉
            {
                if(counts >= 17) counts = 0;
                if(counts <8)
                {
                    P1 = 0x00;
                    P2 = ~ledCode2[counts];
                }
                else if(counts <16)
                {
                    P1 = ~ledCode2[counts - 7];
                    P2 = 0xff;
                }
                else    //全亮
                {
                    P1 = 0xff;
                    P2 = 0xff;
                    if(isAuto == true) isChange = true;
                }
                break;
            }
            case 9: //二进制加法
            {
                if(counts >= 255) counts = 0;
                if(counts == 254 && isAuto == true) isChange = true;
                P1 = ~counts;
                P2 = ~counts;
                break;
            }
            default:
                types = 0;
                P0 = disCode[types];        //更新数码管显示
        }
    }
    /******************************************************************************* 
    * 函 数 名          : Delay10ms (多个) 
    * 函数功能         : 延时函数,延时n*10ms 
    * 输      入         : n-延时次数 
    * 输      出         : 无 
    *******************************************************************************/
    void Delay10ms(unsigned int n)
    {
        unsigned char a, b;
        for (; n>0; n--)
        {
            for (b=38; b>0; b--)
            {
                for (a=130; a>0; a--);
            }
        }
    }
    

    完整的 proteus 仿真图布局

    完整的 proteus 仿真图布局

    打包下载

    源代码、编译过的 HEX 文件以及仿真图已打包上传,下载地址:

    https://download.csdn.net/download/oqqmoon1234/9715019

    展开全文
  • 基于VHDL的彩灯控制

    2021-01-19 23:15:53
    用在舞台上增强晚会灯光效果。对动态灯光实时控制的装置很多,如电脑编程4路彩灯控制器、CEC电脑彩灯控制器、EPROM程控编码彩灯控制器和计算机灯光控制系统。这些控制装置均运用计算机技术、电子技术和声光技术,对...
  • 创意LOVE彩灯欣赏

    2009-06-13 22:56:20
    创意LOVE彩灯欣赏 心形彩灯效果很好看,大家有兴趣可以尝试一下哦~~
  • 随着人们对房屋的装饰需要彩灯,在许多城市可以看到彩色霓虹灯。LED彩灯由于其丰富的灯光色彩,便宜的造价以及控制简单等特点而得到了广泛的应用,...此外从功能效果上看,亮灯模式少而且样式单调,缺乏用户可操作性...
  • 第1页共10页1引言随着计算机、微电子、信息技术的快速进步,智能化技术...彩灯又灵活多变的点亮方式,装饰效果非常好,特别时晚上使得高楼大厦更加漂亮。是彩灯的应用才使得城市的夜景非常迷人。它集中地运用了单片...

    1

    10

    1

    引言

    随着计算机、微电子、信息技术的快速进步,智能化技术的开发速度越来越快

    ,

    能度越来越高

    ,

    应用范围也得到了极大的扩展。在海洋开发、宇宙探测、工农业生产、

    军事、社会服务、娱乐等各个领域。在娱乐方面,场地的装饰离不开彩灯。在建筑方面

    也采用彩灯来装饰高楼大厦。彩灯又灵活多变的点亮方式,装饰效果非常好,特别时晚

    上使得高楼大厦更加漂亮。是彩灯的应用才使得城市的夜景非常迷人。它集中地运用了

    单片机、

    LED

    ,自动控制等技术,是典型的基于单片机的电子产品。

    单片微型计算机简称单片机,是典型的嵌入式微控制器(

    Microcontroller

    Unit

    )

    常用英文字母的缩写

    MCU

    表示单片机,单片机又称单片微控制器,它不是完成某一个逻

    辑功能的芯片,而是把一个计算机系统集成到一个芯片上。单片机由运算器,控制器,

    存储器,输入输出设备构成,相当于一个微型的计算机(最小系统)

    ,和计算机相比,

    单片机缺少了外围设备等。概括的讲:一块芯片就成了一台计算机。它的体积小、质量

    轻、价格便宜、为学习、应用和开发提供了便利条件。

    本文以

    AT89C51

    单片机为控制核心,采用模块化的设计方案,运用

    LED

    彩灯、按键

    等组成电路,实现彩灯在开启时满足不一样的闪亮方法。按键可以在彩灯使用的时候选

    择不同的亮法,使彩灯变化多样,键一可以使彩灯依次循环点亮,健二可以使彩灯从左

    到又从右到左循环点亮,三号键使两端灭,中间亮,再对半交替亮,然后再奇偶亮。通

    过按键能方便使用者选择不同样的亮法。

    2.

    设计任务与要求

    2.1

    设计要求

    单片机为核心,设计一个节日彩灯控制器:

    P1.2

    —开始,按此键则灯开始流动(由上而下)

    P1.3

    —停止,按此键则停止流动,所有灯为暗。

    P1.4

    —上,按此键则灯由上向下流动。

    P1.5

    —下,按此键则灯由下向上流动。

    1.2

    设计思路

    由按键控制功能的流水灯,

    LED

    工作的方式通过键盘的扫描实现。其中的

    LED

    采取共

    阳极接法,通过依次向连接

    LED

    的I

    /

    O口送出低电平,可实现题目要求的功能。根据设

    计任务要求介绍的彩灯控制电路的基本组成,可以确定彩灯控制器应由振荡电路、计数

    /

    时序分配电路、移位位寄存器和彩灯显示五部分组成。其框图如图

    1-1

    所示。

    展开全文
  • 随着人们对房屋的装饰需要彩灯,在许多城市可以看到彩色霓虹灯。LED彩灯由于其丰富的灯光色彩,便宜的造价以及控制简单等特点而得到了广泛的应用,...此外从功能效果上看,亮灯模式少而且样式单调,缺乏用户可操作性。
  • 此外从功能效果上看,亮灯模式少而且样式单调,缺乏用户可操作性。  气候暖化危机和能源紧缺在进一步推动LED照明的普及,LED照明具有环保、光效高和寿命长的特点,但在完全取代具有墙上型调光器的白炽灯方面,LED...
  • 本节介绍一个简单易做的追逐式彩灯控制器,只要将三组彩灯串在空间作适当排列,就能形成追逐流水效果
  • 1 引言  随着人们生活环境的不断改善和美化,在许多场合可以看到...此外从功能效果上看,亮灯模式少而且样式单调,缺乏用户可操作性,影响亮灯效果。因此有必要对现有的彩灯控制器进行改进。  本文提出了一种基
  • 5、接触实践esp32的pwm宽度脉冲功能, 实现呼吸效果闪烁一盏LED灯。 6、smartConfig和微信airKiss在esp32的实现,一键配网轻松快捷连接路由器。 7、利用GPIO中断做一个按键的短按和长按的回调事件,再也无须...
  • 这款 LED 矩阵彩灯使用标准的 WS2812b LED 灯,构成一个圆柱形的灯体,最后由木制边框组合而成。效果相当棒!先看下面的视频。材料清单790×384 纸板×若干(这里用的是 1.5mm 椴木板)WS2812b LED×100(30个...
  • 单片机-节日彩灯控制器彩灯及点阵方案设计各功能键设计各模块设计设计环境效果 彩灯及点阵方案设计 每次只亮一个彩灯,从左至右循环移动,点阵显示小狗图案。 从左至右循环移动点亮所有彩灯,点阵显示卡通脸图案。 ...
  • 多路彩灯控制器

    2013-09-13 13:56:31
    4种花型循环变换,有清零开关,并且可以选择快慢两种节拍。 用八选一数字选择器控制彩灯两边...流水效果。 信号经过分频之后经过控制电路来实现花型的变化,编码发生器产生编码后控制灯的亮与灭来实现多路彩灯的花型。
  • 可以根据开关状态实现对彩灯的显示效果的控制:场景开关控制、循环点亮控制及速度变化控制、灯光的色彩连续变化效果控制及灯光的三色联动定时控制等。本系统具有体积小、硬件少、电路结构简单及容易操作等优点。
  • 为解决目前市场上销售的LED彩灯控制器闪烁频率不可调或不容易调的问题,设计出一种基于TTL电路...通过实际组装电路调试,电路顺利实现了10个档位手动控制,通过改变LED彩灯闪烁频率,提高了LED彩灯控制性能和闪烁效果

空空如也

空空如也

1 2 3 4 5 ... 8
收藏数 145
精华内容 58
关键字:

彩灯效果