精华内容
下载资源
问答
  • 采用RGB 多彩灯,春天场景按下矩阵键盘按键 亮绿灯,夏天按下按键亮红灯,秋天按键亮黄灯(RGB合成),冬天亮白灯(RGB全亮合成白灯)。配上背景音乐。
  • 多彩灯泡之四部分.pptx,5f595b63210a822.pptx
  • 四部分介绍多彩灯泡图示2.pptx,21346a4b8370a6f.pptx
  • 数电多彩灯控制

    2013-07-03 22:47:51
    multisim做的仿真,可同时驱动24路灯,并同时计数。
  • 超级声光多彩灯(纯属娱乐性学习)51单片机程序
  • 主要为大家详细介绍了Android手机显示多彩霓虹效果的小实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • Arduino控制多彩LED灯带

    2018-11-05 15:06:50
    使用Arduino控制灯带颜色及渐变状态 ...把文件下载后,解压文件然后去掉文件后面的小尾巴“-master”把文件放在软件安装路径下的libraries 文件夹中。 该文件是一个封装好了的函数库,主要用到的模块有以下几个函数。...
  • 流水可以让你更加绚丽,你可以更加的了解流水的问题
  • 多彩的霓虹

    2015-06-18 08:27:36
    这是用到线程和消息处理器Handle做的一个小小的应用.
  • 简易多彩广告设计

    2018-07-04 13:13:55
    设计方案设计一个以51单片机为核心的简易多彩广告闪烁控制系统。2位数码管显示闪烁控制方案,分别显示01、02、03、和10号方案,初始化为00,彩灯灭;2个控制按键,一个加一数字键,一个确定键,循环十个花型方案。...

    设计方案

    设计一个以51单片机为核心的简易多彩广告灯闪烁控制系统。2位数码管显示闪烁控制方案,分别显示01、02、03、和10号方案,初始化为00,彩灯灭;2个控制按键,一个加一数字键,一个确定键,循环十个花型方案。方案01为左循环一秒闪烁;方案02为右循环一秒闪烁;方案03为 10000000 11000000 ... 11111111 递增间隔一秒闪烁;方案10为 01010101 、10101010间隔一秒闪烁;其余方案灯灭。

    设计原理图


    #include<reg52.h>
    
    void left_loop();                        //声明左移函数
    void right_loop();                       //声明右移函数
    void ji_ou();                            //声明奇偶函数
    void delayms(unsigned int xms) ;         //延时函数声明
    void increase();                         //递增亮灯函数声明
    void other_programme();                  //其他方案函数声明
    void key_detect(void);                   //按键检测声明
    void display(void);                      //数码管显示函数声明
    
    
    
    sbit key1 = P0^0;                        //加一键
    sbit key2 = P0^1;                        //确认键
    
    unsigned int flag = 0;                  //方案计数变量
    
    
    
    //数码管显示字符转换表
    unsigned char code table[] = {
        0xC0,0xF9,0xA4,0xB0,0x99,
        0x92,0x82,0xF8,0x80,0x90
    };
    
    
    void main()
    {
       while(1)
       {
           
           key_detect();                //按键检测
           
           if(flag==11)
           {
               flag = 0;
           }
           
           
           display();
           
           
       }
          
    }
    
    
    
    
    //方案01,流水灯左移1s
    
    void left_loop()
    {
        unsigned char cnt = 0;               //定义计数变量cnt,用于移位控制
    
        while(1)
            {
                P1 = ~(0x01 << cnt);            //P0等于1左移cnt位,控制8个LED
                delayms(1000);                 //软件延时
                cnt++;                         //移位计数变量自加1
                if (cnt >= 8)                 //移位计数超过7后,再重新从0开始
                {
                    cnt = 0;
                }
             
                   
             delayms(100);
             P1 = 0xff;
            
           
            if(key1==0)
            {
                P1 = 0xff;                    //加一计数键按下,所有灯灭
                delayms(20);
                if(key1==0)
                {
                    P1 = 0xff;
                    flag++;
                    delayms(10);
                }
                while(!key1);                   //检测按键是否松开
                delayms(20);
                while(!key1);
                break;
                
            }
               
        }        
    }
    
    
    
    //方案02,流水灯右移1s
    void right_loop()
    {
         unsigned char cnt = 0;  //定义计数变量cnt,用于移位控制
    
       
        while (1)  //主循环,程序无限循环执行该循环体语句
        {
            P1 = ~(0x80 >> cnt);      //P0等于0x80右移cnt位,控制8个LED
            delayms(1000);
            cnt++;                    //移位计数变量自加1
            if (cnt >= 8)             //移位计数超过7后,再重新从0开始
            {
                cnt = 0;
            }
            
            delayms(100);
            P1 = 0xff;
            
            
            if(key1==0)
            {
                P1 = 0xff;
                delayms(20);
                if(key1==0)
                {
                    P1 = 0xff;
                    flag++;
                    delayms(10);
                }
                while(!key1);               //检测按键是否松开
                delayms(20);
                while(!key1);
                break;
            }
            
            
        }
    }
    
    
    
    
    //方案03,递增间隔一秒闪烁
    
    void increase()
    {
        unsigned int i = 0;
        unsigned char a[] = {0xff,0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00};
        while(1)
        {
            if(i>8)
            {
                i = 0;
            }
            P1 = a[i];
            
            delayms(1000);
            
            P1 = 0xff;
            delayms(1000);
            i++;
            
            
           if(key1==0)
           {
               delayms(10);
                if(key1==0)
            {
                P1 = 0xff;
                flag++;
                delayms(10);
            }
            
            
            while(!key1);               //检测按键是否松开
            delayms(10);
            while(!key1);
            
            
           }
        }
    }
    
    
    
    
    //方案10,奇偶间隔闪烁
    void ji_ou()
    {
        while(1)
        {
            
            P1 = 0xaa;
            delayms(1000);
            P1 = ~0xaa;
            delayms(1000);
            
            
            if(key1==0)
            {
                delayms(10);
                if(key1==0)
                {
                    P1 = 0xff;
                    flag++;
                    delayms(10);
                }
                while(!key1);           //检测按键是否松开
                delayms(20);
                while(!key1);
                break;
                            
            }
                        
        }
            
    }
    
    
    
     //其他方案,广告灯全灭
    void other_programme()
    {
        
        P1 = 0xff;
        delayms(10);
        if(key1==0)
        {
            delayms(10);
            if(key1==10)
            {
                P1 = 0xff;
                flag++;
                delayms(10);
            }
            while(!key1)
            delayms(20);
            while(!key1);
            
        }
        
    }
    
    
    
    
    //数码管显示函数
    void display(void)
    {
        unsigned int shi,ge;
        shi = flag/10;          //取十位
        ge  = flag%10;          //取个位
        
        P2 = table[shi];        //送十位进数码管
        
        delayms(1);
        
        P3 = table[ge];         //送个位进数码管
        
        delayms(1);
    }
    
    
    
    
     //按键检测函数
    void key_detect()
    {
        if(key1==0)
        {
            delayms(10);                    //按键消抖
            if(key1==0)
            {
                flag++;
            }
            while(!key1);                   //检测是否松开key1加一计数键
        }
        else if(key2==0)
        {
            delayms(10);                    //按键消抖
            if(key2==0)
            {
                switch(flag)
                {
                    case 1:left_loop();  break;
                    case 2:right_loop(); break;
                    case 3:increase();   break;
                    case 10:ji_ou();     break;
                    default:other_programme();          //其他方案全灭
                }
            }
            while(!key2);               //检测key2键盘是否松开
        }
    }
    
    
    
    
    
    //延时x毫秒
    void delayms(unsigned int xms)          //延时xms
    {
        unsigned int i,j;                                                       
        
        for(i=xms;i>0;i--)
        {
            for(j=110;j>0;j--);
        }
    
    
    }
    

    展开全文
  • 简约创意多彩小灯泡PPT模板。一套创意简约幻灯片模板,清新彩色配色,小灯泡装饰,图形图表页面丰富。
  • 拼图、折纸、线描、色带、小树苗、铅笔、小火箭创意灯泡信息图表,大脑创意信息图表,多彩欧美风灯泡大脑创意ppt信息图表打包免费下载。
  • 环形灯光多彩文字.zip

    2020-05-08 14:25:00
    环形灯光多彩文字项目演示文件(.max),光速入门3DsMax动画设计,从小处着眼,夯实动画基础。压缩包中附带渲染视频,更清楚地了解动画精髓。
  • 智能多彩蜂窝
  • 简约创意多彩小灯泡PPT模板2_精美模板ppt
  • stm32f429IGbt_GPIO输出多彩流水,通过GPIO端口在输出控制流水
  • 多彩霓虹赛博朋克风格照片处理效果ps动作素材下载 PS动作下载、赛博朋克风格照片处理、霓虹效果
  • 【Android开发】线程实例-多彩霓虹

    千次阅读 2015-06-07 11:06:03
    利用之前学过的多线程处理技术,我们做一个利用Android手机显示一个多彩霓虹效果的小实例。 布局文件,这里只留有加了id的线性布局文件 res/layout/mian.xml: xmlns:tools="http://schema
    利用之前学过的多线程处理技术,我们做一个利用Android手机显示一个多彩霓虹灯效果的小实例。

    布局文件,这里只留有加了id的线性布局文件
    res/layout/mian.xml:
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/linearLayout1"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical" >
    	
    </LinearLayout>

    在res/values目录下,我们创建一个保存颜色资源的colors.xml文件,定义七个颜色资源(赤橙黄绿青蓝紫):
    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <color name="color1">#ffff0000</color>
        <color name="color2">#ffff6600</color>
        <color name="color3">#ffffff00</color>
        <color name="color4">#ff00ff00</color>
        <color name="color5">#ff00ffff</color>
        <color name="color6">#ff0000ff</color>
        <color name="color7">#ff6600ff</color>
    </resources>

    首先获取线性布局管理器,然后获取屏幕的高度,再通过for循环创建14个文本框组件,并添加到线形布局管理器中。之后创建并开启一个新线程,在重写的run()方法中实现一个循环,在该循环中,首先获取一个Message对象,并为其设置一个消息标示,然后发送消息,最后让线程休息1秒钟。
    在onCreat()方法中,创建一个Handler对象,在重写的HanlderMessage方法中,为每一个文本框设置颜色,该背景颜色从颜色数组中随机获取。这样就实现了多彩霓虹灯效果的小实例,具体代码如下:
    MainActivity:
    package com.example.test;  
      
    import java.util.Random;
    
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.view.Window;
    import android.widget.LinearLayout;
    import android.widget.TextView;
      
    public class MainActivity extends Activity{  
    	 private Handler handler;//Handler对象
    	 private static LinearLayout linearLayout;//整体布局
    	 public static TextView[] tv=new TextView[14];//TextView数组
    	 int [] bgColor=new int[]{R.color.color1,R.color.color2,R.color.color3,
    			 R.color.color4,R.color.color5,R.color.color6,R.color.color7};//使用颜色资源
    	 private int index=0;//当前颜色值
        @Override  
        public void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);  
            requestWindowFeature(Window.FEATURE_NO_TITLE);//设置全屏显示
            setContentView(R.layout.main);
          
            //获取线性布局管理器
            linearLayout=(LinearLayout)findViewById(R.id.linearLayout1);
            //获取屏幕的高度
            int height=this.getResources().getDisplayMetrics().heightPixels;
            for (int i = 0; i < tv.length; i++) {
    			tv[i]=new TextView(this);//创建一个文本框对象
    			//设置文本框的宽度
    			tv[i].setWidth(this.getResources().getDisplayMetrics().widthPixels);
    			//设置文本框的高度
    			tv[i].setHeight(height/tv.length);
    			//将TextView组件添加到线性布局管理器中
    			linearLayout.addView(tv[i]);
    		}
            
            Thread t=new Thread(new Runnable(){
    			@Override
    			public void run() {
    				 while(!Thread.currentThread().isInterrupted()){
    					 Message m=handler.obtainMessage();//获取一个Message
    					 m.what=0x101;//设置消息标识
    					 handler.sendMessage(m);//发送消息
    					 try {
    						Thread.sleep(new Random().nextInt(1000));//休眠1秒钟
    					} catch (InterruptedException e) {
    						// TODO Auto-generated catch block
    						e.printStackTrace();//输出异常信息
    					}
    				 }
    			}
            });
            t.start();//开启线程
            
            handler=new Handler(){
    
    
    			@Override
    			public void handleMessage(Message msg) {
    				int temp=0;
    				if(msg.what==0x101){
    					for (int i = 0; i < tv.length; i++) {
    						temp=new Random().nextInt(bgColor.length);//产生一个随机数
    						//去掉重复的并相邻的颜色
    						if(index==temp){
    							temp++;
    							if(temp==bgColor.length){
    								temp=0;
    							}
    						}
    						index=temp;
    						//为文本框设置背景
    						tv[i].setBackgroundColor(getResources().getColor(bgColor[index]));
    					}
    				}
    				super.handleMessage(msg);
    			}
            	
            };
        }
    
    
    }  

    运行效果如图


    是不是很炫酷!

    转载请注明出处:http://blog.csdn.net/acmman/article/details/46399013

    展开全文
  • 基于stm32f429芯片,在野火开发板上实现红禄蓝3色LED的流水延时闪烁效果,已附上完整文件,可直接在KEIL上编译下载,代码逻辑清晰,易于后续开发
  • 前者可以间接做出呼吸效果(不过后面我将其数值最大设置成了100,要是哪个呼吸像这样那就算是喘气了),后者可以更换“呼吸”的色彩。 < Style.Triggers > < EventTrigger RoutedEvent = "GotFocus" >...

    这里写图片描述

    这里写图片描述

    我们先来看看Quartz MS字体动态显示系统时间的效果,难度相较于上一篇也要简单许多。

    首先是定义一个TextBlock如下。

    <Grid>
         <TextBlock Name="tBlockTime" HorizontalAlignment="Center" 
             VerticalAlignment="Center" FontSize="68" Foreground="Green"/>
    </Grid>

    后台代码如下:

    private DispatcherTimer dispatcherTimer;
    
    public MainWindow()
    {
         InitializeComponent();
    
         dispatcherTimer = new System.Windows.Threading.DispatcherTimer();
         // 当间隔时间过去时发生的事件
         dispatcherTimer.Tick += new EventHandler(ShowCurrentTime);
         dispatcherTimer.Interval = new TimeSpan(0, 0, 0, 1);
         dispatcherTimer.Start();
    }
    
    
    public void ShowCurrentTime(object sender, EventArgs e)
    {
          //获得星期
          //this.tBlockTime.Text = DateTime.Now.ToString("dddd", new System.Globalization.CultureInfo("zh-cn"));
          //this.tBlockTime.Text += "\n";
    
          //获得年月日
          //this.tBlockTime.Text = DateTime.Now.ToString("yyyy:MM:dd");   //yyyy年MM月dd日
          //this.tBlockTime.Text += "\n";
    
          //获得时分秒
          this.tBlockTime.Text = DateTime.Now.ToString("HH:mm:ss");
    }

    注意在这个时间的设置时,第一步显示的时间是”=”,随后都是”+=”。比如说要先显示星期,再显示时分秒,就是这样的:

    //获得星期
    this.tBlockTime.Text = DateTime.Now.ToString("dddd", new System.Globalization.CultureInfo("zh-cn"));
    this.tBlockTime.Text += "\n";
    
    //获得时分秒
    this.tBlockTime.Text += DateTime.Now.ToString("HH:mm:ss");

    然后还需要字体,然而字体并不可能是写出来的……我们都需要需要引用资源。

    <Window x:Class="WpfApplication2.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow"
            Width="500" Height="200"
            WindowStyle="None"
            AllowsTransparency="True"
            Background="Black">
    
        <Window.Resources>
            <Style x:Key="QuartzMSFont">
                <Setter Property="TextElement.FontFamily" Value="Resources/#Quartz MS"/>
            </Style>
        </Window.Resources>
    
        <Grid>
            <TextBlock Name="tBlockTime" Style="{DynamicResource QuartzMSFont}"  
                       HorizontalAlignment="Center" 
                       VerticalAlignment="Center" FontSize="68" Foreground="Green"/>
        </Grid>
    
    </Window>

    这里我只是给大家一个启发,如果系统自带的字体已经不能满足你的艺术感,你完全可以另外找字体。甚至也可以创造字体,近来谷歌苹果都在做这个。

    这里写图片描述

    我已经把字体放到项目中了,需要源码/字体的童鞋直接留邮箱……

    这里写图片描述

    这一篇内容不多,也算不上精彩,但童鞋们可以看看上一篇:好玩的WPF第一弹:窗口抖动+边框阴影效果+倒计时显示文字 ,也可以今明天再来看看第三篇~


    没想到这篇博客被推荐了啦,内容这么少……绝不能让如此不堪的文章放在首页啦,所以就来添加一点东西咯——也就是前文中的第二个GIF(个人感觉还是蛮炫酷的)。

    首先给窗体设置一下吧:

    <Window x:Class="WPFButton.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         Title="MainWindow"
            Width="600" Height="400"
            WindowStyle="None"
            AllowsTransparency="True"
            Background="Wheat">

    这段代码中的属性在前一篇中都有介绍,大家可以看看。

    我定义了这么多的Button,是为了后面的演示效果而已,实际中可能用不到这么多按钮吧,哈哈。

         <Grid>
            <Button Content="Yellow"   
                    Style="{StaticResource ResourcesButtonStyle}" 
                    Background="Yellow" Margin="90,37,450,323"/>
    
            <Button Content="Purple" 
                    Style="{StaticResource ResourcesButtonStyle}" 
                    Background="Purple" Margin="450,230,90,130" />
    
            <Button Content="Green" 
                    Style="{StaticResource ResourcesButtonStyle}" 
                    Background="Green" Margin="90,130,450,230" />
    
            <Button Content="DarkCyan" 
                    Style="{StaticResource ResourcesButtonStyle}" 
                    Background="DarkCyan" Margin="450,37,90,323" />
    
            <Button Content="Black" 
                    Style="{StaticResource ResourcesButtonStyle}" 
                    Background="Black" Margin="90,230,450,130"  />
    
            <Button Content="OrangeRed" 
                    Style="{StaticResource ResourcesButtonStyle}" 
                    Background="OrangeRed" Margin="450,136,90,224"/>
    
            <Button Content="Violet" 
                    Style="{StaticResource ResourcesButtonStyle}" 
                    Background="Violet" Margin="270,37,270,323" />
    
            <Button Content="CornflowerBlue" 
                    Style="{StaticResource ResourcesButtonStyle}" 
                    Background="CornflowerBlue" Margin="270,230,270,130"  />
    
            <Button Content="Lime" 
                    Style="{StaticResource ResourcesButtonStyle}" 
                    Background="Lime" Margin="270,136,270,224"/>
    
            <Button Content="Azure" 
                Style="{StaticResource ResourcesButtonStyle}" 
                Background="Azure" Margin="90,323,450,37"  />
    
            <Button Content="Turquoise" 
                Style="{StaticResource ResourcesButtonStyle}" 
                Background="Turquoise" Margin="270,323,270,37"  />
    
            <Button Content="Tomato" 
                Style="{StaticResource ResourcesButtonStyle}" 
                Background="Tomato" Margin="450,323,90,37" />   
        </Grid>

    这里面用了资源,不要着急,后面会慢慢道来~

    如果不用资源它是长这样的:

    这里写图片描述

    好吧,废话不多说,上资源。

     <Window.Resources>      
            <Style x:Key="ResourcesButtonStyle" TargetType="{x:Type FrameworkElement}" >
                <Setter Property="Width" Value="60"/>
                <Setter Property="Height" Value="40"/>                     
                <Setter Property="Effect">                            
                    <Setter.Value>
                        <DropShadowEffect x:Name="OSE" BlurRadius="10" 
                                          Color="Lime" Direction="0"   
                                          Opacity="1" 
                                          RenderingBias="Performance" 
                                          ShadowDepth="0" >
                            <Storyboard.TargetProperty>
                                BlurRadius
                            </Storyboard.TargetProperty>
                        </DropShadowEffect>
                    </Setter.Value>
                </Setter>   
          </Style>
    </Window.Resources>    

    C#比较好学的一点就是这些属性呀什么的都可以通过名字来猜出来意思,即便猜不出来也可以通过不断的尝试来发现这些属性是做什么的。

    属性RenderingBias可以设置侧重于性能还是质量,就像电脑上的显卡设置里那样。

    其他那些属性强烈推荐大家不断的修改数值观察最终调试出来程序的反应,这也算是小小的实验了。

    上面的资源是静态,还需要加上Storyboard动画,动画嘛,可以以各种属性为参照,这里我以BlurRadius和Color。前者可以间接做出呼吸灯效果(不过后面我将其数值最大设置成了100,要是哪个呼吸灯像这样那就算是喘气了),后者可以更换“呼吸”的色彩。

    <Style.Triggers>
       <EventTrigger RoutedEvent="GotFocus">
           <BeginStoryboard>
               <Storyboard>
                   <DoubleAnimation 
                      Storyboard.TargetProperty="(FrameworkElement.Effect).(DropShadowEffect.BlurRadius)" 
                      From="0" To="100" 
                      BeginTime="00:00:00" Duration="00:00:01" 
                      AutoReverse="True"  RepeatBehavior="Forever"/>
    
                  <ColorAnimationUsingKeyFrames 
                      Storyboard.TargetProperty="(FrameworkElement.Effect).(DropShadowEffect.Color)"
                      RepeatBehavior="Forever" AutoReverse="True">
                      <EasingColorKeyFrame KeyTime="0" Value="Yellow"/>
                      <EasingColorKeyFrame KeyTime="0:0:0.4" Value="Purple"/>
                      <EasingColorKeyFrame KeyTime="0:0:0.8" Value="Green"/>
                      <EasingColorKeyFrame KeyTime="0:0:1.2" Value="DarkCyan"/>
                      <EasingColorKeyFrame KeyTime="0:0:1.6" Value="Black"/>
                      <EasingColorKeyFrame KeyTime="0:0:2.0" Value="OrangeRed"/>
                      <EasingColorKeyFrame KeyTime="0:0:2.4" Value="Violet"/>
                      <EasingColorKeyFrame KeyTime="0:0:2.8" Value="CornflowerBlue"/>
                      <EasingColorKeyFrame KeyTime="0:0:3.2" Value="Lime"/>
                      <EasingColorKeyFrame KeyTime="0:0:3.6" Value="Azure"/>
                      <EasingColorKeyFrame KeyTime="0:0:4.0" Value="Turquoise"/>
                      <EasingColorKeyFrame KeyTime="0:0:4.4" Value="Tomato"/>
                  </ColorAnimationUsingKeyFrames>
              </Storyboard>
          </BeginStoryboard>
      </EventTrigger>
    </Style.Triggers>

    BeginTime是起始时间,KeyTime类似于Flash里的关键帧的时间。

    前面是BlurRadius的变化,可以用From=”0” To=”100” ;而后面是Color,则需要用Value。

    由于CSDN博客上最多只能上传2M的图片,所以这些GIF都很短啦。大家应该多动手尝试呢。我再来贴两张GIF吧~

    真实的程序中可不是这样的哦!因为录制GIF的时候为了考虑2M的限制而不得不将录制的帧数调低,所以就“卡顿”成了这样,有明显的“波涛”效果。大家可以用源码调试看看。

    这里写图片描述

    这里写图片描述



    感谢您的访问,希望对您有所帮助。 欢迎大家关注、收藏以及评论。


    为使本文得到斧正和提问,转载请注明出处:
    http://blog.csdn.net/nomasp


    展开全文
  • 优化事项1:多彩灯颜色切换不够平滑,会闪烁。同时修改了arduino代码以及app代码(需要最新版app 麻烦在帖子下面留言) 优化事项2:arduino 代码没有考虑共阴还是共阳(最新版代码加入这个考虑事...

    1.前言

    很久以前在其他平台发布了一些帖子,趁着有时间就同步到一起。这里主要是做一个蓝牙版本的RGB灯。
    欢迎点赞关注博主。

    2.优化事项

    • 优化事项1:多彩灯颜色切换不够平滑,会闪烁。同时修改了arduino代码以及app代码(需要最新版app 麻烦在帖子下面留言)
    • 优化事项2:arduino 代码没有考虑共阴还是共阳(最新版代码加入这个考虑事项)
    • 未优化事项:可以考虑后期加入记录上一次灯颜色状态,下一次开灯就默认是该颜色
    • 未优化事项:是否可以在板子上加入一个按钮,可以切换常用颜色,不一定每次都用app

    3.优化版代码

    具体优化的地方可以对比两份代码

    • 旧代码
    /**
    * 日期:2016/11/24
    * 功能:蓝牙台灯
    * 作者:单片机菜鸟
    **/
    
    #define BTSerial Serial1
    #define MyDebugSerial Serial
    
    //该条语句用于使能DEBUG输出信息,屏蔽掉就不会输出debug调试信息
    #define DEBUG
    
    #ifdef DEBUG
    #define DBGLN(message)    MyDebugSerial.println(message)
    #else
    #define DBGLN(message)
    #endif
    
    #define PIN_RED 9
    #define PIN_GREEN 10
    #define PIN_BLUE 11
    
    int red = 0;//红色
    int green = 0;//绿色
    int blue = 0;//蓝色
    
    void setup() {
      pinMode(PIN_RED, OUTPUT);
      pinMode(PIN_GREEN, OUTPUT);
      pinMode(PIN_BLUE, OUTPUT);
      BTSerial.begin(9600);
      MyDebugSerial.begin(9600);
    }
    
    void loop() {
      int leng = ReceiveBTMessage();
      if(leng>0){
        //收到了新RGB数值
        colorRGB(red,green,blue);
      }
    }
    
    /**
    * 读取串口缓冲区里面的数据
    * 
    */
    int ReceiveBTMessage(){
      /**
         * @Desc 把RGB组合成协议内的数据格式
         *  开始符+长度+rgb+结束符
         * "+C,n:rgbString;"
         * 例子:"+C,10:100,255,60;"
         **/
      String data = "";
      if (BTSerial.available()>0){
        unsigned long start;
        start = millis();
        char c0 = BTSerial.read();
        if (c0 == '+')
        {
          char c;
          while (millis()-start<200) 
          {
            if (BTSerial.available()>0)
            {
              c = BTSerial.read();
              data += c;
            }
            if (c==';')
              break;
          }
    
          int sLen = strlen(data.c_str());
          int i,r,g,b;
          for (i = 0; i <= sLen; i++){
            if (data[i] == ':'){
              break;
            }
          }
          DBGLN(data);
          int iSize;
          //"+C,10:100,255,60;"    
          String _size = data.substring(2, i);
          iSize = _size.toInt();
    
          for(r=i+1;r<=sLen;r++){
             if(data[r]==','){
               break;
              }  
          }
    
          for(g=r+1;g<=sLen;g++){
             if(data[g]==','){
               break;
              }  
          }
    
          for(b=g+1;b<=sLen;b++){
             if(data[b]==';'){
               break;
              }  
          }
    
          String sred = data.substring(i+1,r);
          String sgreen = data.substring(r+1,g);
          String sblue = data.substring(g+1,b);
    
          red = sred.toInt();
          green = sgreen.toInt();
          blue = sblue.toInt();
    
          DBGLN("red:"+sred);
          DBGLN("green:"+sgreen);
          DBGLN("blue:"+sblue);
          return iSize;
        }else{
          while(BTSerial.read() >= 0){}  
        }
      }
      return 0;
    }
    
    void colorRGB(int red, int green, int blue){
      analogWrite(PIN_RED,constrain(red,0,255));
      analogWrite(PIN_GREEN,constrain(green,0,255));
      analogWrite(PIN_BLUE,constrain(blue,0,255));
    }
    
    
    • 优化版代码
    /**
    * 日期:2016/11/24
    * 功能:蓝牙台灯
    * 作者:单片机菜鸟
    **/
    
    #define BTSerial Serial1
    #define MyDebugSerial Serial
    
    //该条语句用于使能DEBUG输出信息,屏蔽掉就不会输出debug调试信息
    //#define DEBUG
    //该条语句用于使能是共阴RGB  屏蔽掉就是共阳RGB
    //#define COMMON_GND
    
    #ifdef DEBUG
    #define DBGLN(message)    MyDebugSerial.println(message)
    #else
    #define DBGLN(message)
    #endif
    
    #define PIN_RED 9
    #define PIN_GREEN 10
    #define PIN_BLUE 11
    
    int red = 0;//红色
    int green = 0;//绿色
    int blue = 0;//蓝色
    
    void setup() {
      pinMode(PIN_RED, OUTPUT);
      pinMode(PIN_GREEN, OUTPUT);
      pinMode(PIN_BLUE, OUTPUT);
      BTSerial.begin(9600);
      MyDebugSerial.begin(9600);
    }
    
    void loop() {
      int leng = ReceiveBTMessage();
      if(leng>0){
        //收到了新RGB数值
        colorRGB(red,green,blue);
      }
    }
    
    /**
    * 初始化RGB灯(后面可以考虑加入一个记录之前状态的功能,下次打开就取出来显示)
    */
    void init_RGB(){
      #ifdef COMMON_GND
        colorRGB(255,255,255);
      #else
        colorRGB(0,0,0);
      #endif
    }
    
    /**
    * 读取串口缓冲区里面的数据
    * 
    */
    int ReceiveBTMessage(){
      /**
         * @Desc 把RGB组合成协议内的数据格式
         *  开始符+长度+rgb+结束符
         * "+C,n:rgbString;"
         * 例子:"+C,10:100,255,60;"
         **/
      String data = "";
      if (BTSerial.available()>0){
        unsigned long start;
        start = millis();
        char c0 = BTSerial.read();
        if (c0 == '+')
        {
          char c;
          while (millis()-start<100) 
          {
            if (BTSerial.available()>0)
            {
              c = BTSerial.read();
              data += c;
            }
            if (c==';')
              break;
          }
    
          int sLen = strlen(data.c_str());
          int i,r,g,b;
          for (i = 0; i <= sLen; i++){
            if (data[i] == ':'){
              break;
            }
          }
          DBGLN(data);
          int iSize;
          //"+C,10:100,255,60;"    
          String _size = data.substring(2, i);
          iSize = _size.toInt();
    
          for(r=i+1;r<=sLen;r++){
             if(data[r]==','){
               break;
              }  
          }
    
          for(g=r+1;g<=sLen;g++){
             if(data[g]==','){
               break;
              }  
          }
    
          for(b=g+1;b<=sLen;b++){
             if(data[b]==';'){
               break;
              }  
          }
    
          String sred = data.substring(i+1,r);
          String sgreen = data.substring(r+1,g);
          String sblue = data.substring(g+1,b);
    
          red = sred.toInt();
          green = sgreen.toInt();
          blue = sblue.toInt();
    
          DBGLN("red:"+sred);
          DBGLN("green:"+sgreen);
          DBGLN("blue:"+sblue);
          return iSize;
        }else{
          while(BTSerial.read() >= 0){}  
        }
      }
      return 0;
    }
    
    void colorRGB(int red, int green, int blue){
      #ifdef COMMON_GND
         analogWrite(PIN_RED,constrain(red,0,255));
         analogWrite(PIN_GREEN,constrain(green,0,255));
         analogWrite(PIN_BLUE,constrain(blue,0,255));
      #else
         analogWrite(PIN_RED,constrain(255-red,0,255));
         analogWrite(PIN_GREEN,constrain(255-green,0,255));
         analogWrite(PIN_BLUE,constrain(255-blue,0,255));
      #endif
    }
    
    

    3.总结

    其实可以做的东西还是很多,比如我也可以把蓝牙多彩灯改成Wifi多彩灯,通过Wifi形式来控制。各位也可以做成各种好看的灯罩哈哈哈

    展开全文
  • 前者能够间接做出呼吸效果(只是后面我将其数值最大设置成了100,要是哪个呼吸像这样那就算是喘气了),后者能够更换“呼吸”的色彩。 < Style.Triggers > < EventTrigger RoutedEvent = "GotFocus" >...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,090
精华内容 1,236
关键字:

多彩灯