1回答

1收藏

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

机智云GoKit 机智云GoKit 3351 人阅读 | 1 人回复 | 2018-03-15

准备好一块机智云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,制作过程一样


分享到:
回复

使用道具 举报

回答|共 1 个

倒序浏览

沙发

机智云

发表于 2018-4-18 16:53:33 | 只看该作者

有效果图吗?
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

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