查看: 2779|回复: 1

【体验】+采用SOC方案实现RGB全彩灯光控制

[复制链接]
  • TA的每日心情
    开心
    2018-3-16 10:27
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 2018-3-15 13:50:30 | 显示全部楼层 |阅读模式
    分享到:
    准备好一块机智云8266的宠物屋顶板,没有的可以直接用8266小系统板和一个P9813的RGB模块(马叔叔家有自己找)
    按键接在GPIO14
    RGB模块的SDA接在GPIO4,SCL接在GPIO15
    创建一个变长的的云端产品,定义以下数据点
    • 设定LED红色值
      标识名:LED_R
      读写类型:可写
      数据类型:数值

      数据范围:0 - 254
      分辨率:1
      增量:0

      备注: 无






    • 显示名称:设定LED绿色值
      标识名:LED_G
      读写类型:可写
      数据类型:数值

      数据范围:0 - 254
      分辨率:1
      增量:0

      备注: 无






    • 显示名称:设定LED蓝色值
      标识名:LED_B
      读写类型:可写
      数据类型:数值

      数据范围:0 - 254
      分辨率:1
      增量:0

      备注: 无





    创建数据点完毕之后生成SOC代码,论坛冯叔的帖子有基本的生成教程,此处我就不再废话。【体验】+0基础实现GPRS远程插座下载生成的代码之后移植以下代码(hal_rgb_led.c和hal_rgb_led.h)
    hal_rgb_led.c
    #include "driver/hal_rgb_led.h"
    #include "osapi.h"
    static void ICACHE_FLASH_ATTR rgbDelay(unsigned int us)
    {
        /* Define your delay function */
        volatile unsigned int i=0;
           
        for(i=0; i<us; i++);
    }
    /************ generation clock *********************/
    static void ICACHE_FLASH_ATTR clkProduce(void)
    {
        SCL_LOW;    // SCL=0
        rgbDelay(40);
        SCL_HIGH;     // SCL=1
        rgbDelay(40);
    }
    /**********  send 32 zero ********************/
    static void ICACHE_FLASH_ATTR send_32zero(void)
    {
        uint8_t i;
           
        SDA_LOW;   // SDA=0
        for (i=0; i<32; i++)
            {
                    clkProduce();
            }       
    }
    /********* invert the grey value of the first two bits ***************/
    static uint8_t ICACHE_FLASH_ATTR takeAntiCode(uint8_t dat)
    {
        uint8_t tmp = 0;
        tmp=((~dat) & 0xC0)>>6;
        return tmp;
    }
    /****** send gray data *********/
    static void ICACHE_FLASH_ATTR dataSend(uint32 dx)
    {
        uint8_t i;
        for (i=0; i<32; i++)
        {
            if ((dx & 0x80000000) != 0)
            {


                SDA_HIGH;     //  SDA=1;
            }
            else
            {
                SDA_LOW;    //  SDA=0;
            }


            dx <<= 1;
            clkProduce();
        }
    }
    hal_rgb_led.h
    #ifndef _HAL_RGB_LED_H
    #define _HAL_RGB_LED_H
    #include <stdio.h>
    #include <c_types.h>
    #include <gpio.h>
    #include <eagle_soc.h>
    /* Define your drive pin */
    #define GPIO_RGB_SCL            15
    #define GPIO_RGB_SDA            4
    //#define GPIO_RGB_POW            15
    /* Set GPIO Direction */
    #define SCL_LOW                 GPIO_OUTPUT_SET(GPIO_ID_PIN(GPIO_RGB_SCL), 0)
    #define SCL_HIGH                GPIO_OUTPUT_SET(GPIO_ID_PIN(GPIO_RGB_SCL), 1)
    #define SDA_LOW                 GPIO_OUTPUT_SET(GPIO_ID_PIN(GPIO_RGB_SDA), 0)
    #define SDA_HIGH                GPIO_OUTPUT_SET(GPIO_ID_PIN(GPIO_RGB_SDA), 1)
    //#define POW_HIGH              GPIO_OUTPUT_SET(GPIO_ID_PIN(GPIO_RGB_POW), 1)
    #define R_MAX                   255
    #define G_MAX                   255
    #define B_MAX                   255
    /* Function declaration */
    void rgbControl(uint8_t R, uint8_t B, uint8_t G);
    void rgbLedInit(void);
    void rgbGpioInit(void);
    void rgbSensorTest(uint8_t rgbcou);
    #endif /*_HAL_RGB_LED_H*/
    移植以上2个程序到项目内
    按键初始化函数里面加入RGB端口初始化
    rgbGpioInit和rgbLedInit

    在云端数据处理的地方可以通过void rgbControl(uint8_t R, uint8_t B, uint8_t G); 函数进行RGB的控制
    rgbControl(currentDataPoint.valueLED_R, currentDataPoint.valueLED_B, currentDataPoint.valueLED_G);
    编译下载到板子就能运行,并外也可以用WS2812,制作过程一样


    回复

    使用道具 举报

    该用户从未签到

    发表于 2018-4-18 16:53:33 | 显示全部楼层
    有效果图吗?
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-4-26 16:42 , Processed in 0.112554 second(s), 16 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.