学习笔记|arduino uno r3| RGB 灯珠|Atmega328P|PWM|analogWrite|analogRead函数: RGB灯珠呼吸灯

目录

  • RGB 灯珠呼吸灯实验
    • RGB 灯珠实验概述
    • 工作原理
    • 组件清单
    • 接线
      • 程序代码
      • 编译和执行
    • Tips: Arduino常用的函数解释
      • analogWrite(pin, value)函数
      • analogRead(pin)函数
  • 总结

RGB 灯珠呼吸灯实验

RGB 灯珠实验概述

1-三色LED黑板模块的PCB颜色为黑色,使用5MM全彩超高亮LED、带限流电阻防止烧坏LED。可接各种单片机,高电平点亮LED,方便易用。
在本课程中,您将使用PWM来控制RGBLED灯并使其显示不同的颜色。通过三种基色 LED分别点亮两个 LED时,它可以发出黄、紫、青色(如红、蓝两LED点亮时发出紫色光);若红、绿、蓝三种LED 同时点亮时,它会产生白光。如果有电路能使红、绿、蓝光LED分别两两点亮、单独点亮及三基色LED同时点亮,则他就能发出七种不同颜色的光来,于是就出现了七彩LED 灯的这种现象。
变色灯是由红®、绿(G)、蓝(B)三基色LED组成的。双色LED是我们一分熟悉的。一般由红光LED及绿光LED组成。它可以单独发出红光或绿光。若红光及绿光同时亮点时,红绿两光混合成黄色。RGB分为共阴和共阳两种,长引脚是公共端。
RGB 灯珠的原理图如下:
在这里插入图片描述

工作原理

RGB是从颜色发光的原理来设计定的,通俗点说它的颜色混合方式就好像有红绿、蓝三盏灯,当它们的光相互叠合的时候,色彩相混,而亮度却等于两者亮度之总和,越混合亮度越高,即加法混合
红、绿、蓝三盏灯的叠加情况,中心三色最亮的叠加区为白色,加法混合的特点:越叠加越明亮。
在这个实验中,我们也将使用PWM,如果你已经学过目前的课程,你肯定已经有了基本的了解。在这里,我们在RGBLED的三个引脚之间输入0到255之间的值,使其显示不同的颜色。

组件清单

Arduino UN0 R3 主板
USB 数据线
面包板
共阳RGB LED
220Ω电阻*3
若干跳线
本次采用RGB LED全彩模块,集成了限流电阻,直接接入开发板相应端口即可。

接线

(RGB的2号脚需要确认是共正(阳)共负(阴),本次实验用的是共正的),接线示意如图:
在这里插入图片描述

如采用RGB LED全彩模块,直接插入端口即可,如下:
在这里插入图片描述

程序代码

1.先实现当个颜色闪烁:

int redled =11; //定义数字11 接口为R
int greenled =10; //定义数字10 接口为G
int bullled =9; //定义数字9 接口为B
int currentled;
void setup()
{
pinMode(redled, OUTPUT);//定义红色小灯接口为输出接口
pinMode(bullled, OUTPUT); //定义黄色小灯接口为输出接口
pinMode(greenled, OUTPUT); //定义绿色小灯接口为输出接口
}

void loop() {
  currentled = bullled; //当前点亮蓝灯bull
  digitalWrite(currentled,1);//点亮LED
  delay(1000);
  digitalWrite(currentled,0);//关闭LED
  delay(1000);
}

2.三个颜色轮流闪烁:
定义部分不用修改,调整loop中点亮代码:

void loop() {
  digitalWrite(redled, HIGH);//点亮红色小灯
  delay(1000);//延时1 秒
  digitalWrite(redled, LOW); //熄灭红色小灯
  digitalWrite(bullled, HIGH);//点亮黄色小灯
  delay(200);//延时0.2 秒
  digitalWrite(bullled, LOW);//熄灭黄色小灯
  digitalWrite(greenled, HIGH);//点亮绿色小灯
  delay(1000);//延时1 秒
  digitalWrite(greenled, LOW);//熄灭绿色小灯
}

3.三个颜色由暗变亮,轮流闪烁:
采用analogWrite函数:

 *         Arduino PIN 11   ===================  RGB pin1 red
 *         Arduino PIN 10  ===================   RGB pin3 green
 *         Arduino PIN 9  ===================    RGB pin4 blue
 *         Arduino GND     ===================   RGB pin2  GND
 *
 */
#define RGB_RED    11
#define RGB_GREEN  10
#define RGB_BLUE   9

void setup()
{
    pinMode(RGB_RED,OUTPUT);
    pinMode(RGB_GREEN,OUTPUT);
    pinMode(RGB_BLUE,OUTPUT);
}

void setColor(int red,int green,int blue)
{
    analogWrite(RGB_RED,red);
    // We need to make sure the PWM output is enabled for those pins
    // that support it, as we turn it off when digitally reading or
    // writing with them.  Also, make sure the pin is in output mode
    // for consistenty with Wiring, which doesn't require a pinMode
	// call for the analog output pins.
    analogWrite(RGB_GREEN,green);
    analogWrite(RGB_BLUE,blue);
}

void loop()
{
    int i;
    for(i=0;i<256;i++)
    {
        setColor(i,0,0);
        delay(10);
    }
    delay(500);           //turn the RGB LED red smoth

    for(i=0;i<256;i++)
    {
        setColor(0,i,0);
        delay(10);
    }
    delay(500);           //turn the RGB LED green smoth

    for(i=0;i<256;i++)
    {
        setColor(0,0,i);
        delay(10);
    }
    delay(500);           //turn the RGB LED blue smoth
}

编译和执行

以第3步三个颜色由暗变亮,轮流闪烁为例,
点击屏幕左上角的对号,开始预编译,完成会显示内存占用等相关信息,如:
Global variables use 9 bytes (0%) of dynamic memory, leaving 2039 bytes for local variables. Maximum is 2048 bytes.
没有错误提示,点击右箭头,开始编译烧写:

avrdude: Version 6.3-20190619
         Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
         Copyright (c) 2007-2014 Joerg Wunsch

         System wide configuration file is "C:\Users\86131\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0-arduino17/etc/avrdude.conf"

         Using Port                    : COM26
         Using Programmer              : arduino
         Overriding Baud Rate          : 115200
         AVR Part                      : ATmega328P
         Chip Erase delay              : 9000 us
         PAGEL                         : PD7
         BS2                           : PC2
         RESET disposition             : dedicated
         RETRY pulse                   : SCK
         serial program mode           : yes
         parallel program mode         : yes
         Timeout                       : 200
         StabDelay                     : 100
         CmdexeDelay                   : 25
         SyncLoops                     : 32
         ByteDelay                     : 0
         PollIndex                     : 3
         PollValue                     : 0x53
         Memory Detail                 :

                                  Block Poll               Page                       Polled
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
           eeprom        65    20     4    0 no       1024    4      0  3600  3600 0xff 0xff
           flash         65     6   128    0 yes     32768  128    256  4500  4500 0xff 0xff
           lfuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           hfuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           efuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           lock           0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           calibration    0     0     0    0 no          1    0      0     0     0 0x00 0x00
           signature      0     0     0    0 no          3    0      0     0     0 0x00 0x00

         Programmer Type : Arduino
         Description     : Arduino
         Hardware Version: 3
         Firmware Version: 4.4
         Vtarget         : 0.3 V
         Varef           : 0.3 V
         Oscillator      : 28.800 kHz
         SCK period      : 3.3 us

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.00s

avrdude: Device signature = 0x1e950f (probably m328p)
avrdude: reading input file "C:\Users\86131\AppData\Local\arduino\sketches\12856D90A4E6203ADAFB53870945B3E6/RGB_Breathing_Light.ino.hex"
avrdude: writing flash (1318 bytes):

Writing | ################################################## | 100% 0.21s

avrdude: 1318 bytes of flash written

avrdude done.  Thank you.

正常烧写无错误提示,在这里你应该看到 RGB LED 呈圆形闪烁,然后是红色,绿色,然后是蓝色,重复循环显示。
在这里插入图片描述

Tips: Arduino常用的函数解释

引自Arduino常用的函数解释

analogWrite(pin, value)函数

analogWrite()函数的作用,是输出脉宽调制信号(PWM)到指定的PWM引脚。PWM信号可以用来控制LED的亮度或者直流马达的转速,如果你使用analogWrite()函数输出PWM信号时,已自动设置引脚为输出模式,不需要再使用pinMode()函数去设置引脚模式。

为什么会这样?这是因为Arduino的analogWrite()函数被设计为专门用于PWM支持的数字引脚。当你调用analogWrite(pin, value)时,它会检查这个引脚是不是PWM引脚,如果pin是有效的PWM引脚,该函数会首先确保该引脚被配置为输出模式(如果它还不是的话),然后生成具有指定占空比的PWM信号。

这种设计简化了PWM信号输出的过程,因为用户不需要关心引脚的模式设置。你只需要知道哪些引脚支持PWM,并将它们用于需要PWM信号输出的场景。

然而,值得注意的是,如果你试图在一个不支持PWM的数字引脚上使用analogWrite()函数,Arduino IDE通常会抛出一个错误或警告,告诉你该引脚不支持PWM输出。

此外,虽然analogWrite()自动处理了引脚的模式设置,但在编写Arduino程序时,明确地使用pinMode()来设置引脚模式仍然是一个好习惯。这有助于提高代码的可读性和可维护性,并减少因引脚模式设置不当而导致的潜在问题。

这里需要注意的一点就是:PWM信号它并不是真正的模拟信号,这是一种模拟信号的数字近似,通过快速切换高电平和低电平来实现。所以说,PWM引脚时数字引脚,不是模拟引脚,pin不要选择模拟引脚,也不要选择非PWM引脚,多数Arduino板使用3,5,6,9,10,11共6只引脚输出PWM信号(数字的前面又波浪号)。value值为0-255。

analogRead(pin)函数

analogRead()函数的作用是读取模拟输入引脚电压0-5V,并转换成数字0-1023。pin的值就是模拟引脚的编号A0-A5。因为内部使用了10位的模拟/数字转换器,所以analogRead()函数返回值为整数0-1023。

总结

1.了解RGB 灯珠的显色原理;
2.PWM类analogWrite函数的使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/948299.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

杰发科技——使用ATCLinkTool解除读保护

0. 原因 在jlink供电电压不稳定的情况下&#xff0c;概率性出现读保护问题&#xff0c;量产时候可以通过离线烧录工具避免。代码中开了读保护&#xff0c;但是没有通过can/uart/lin/gpio控制等方式进行关闭&#xff0c;导致无法关闭读保护。杰发所有芯片都可以用本方式解除读保…

ICLR2017 | I-FGSM | 物理世界中的对抗样本

Adversarial Examples in The Physical World 摘要-Abstract引言-Introduction生成对抗图像的方法-Methods of Generating Adversarial Images对抗样本的图片-Photos of Adversarial Examples对抗图像的破坏率-Destruction Rate of Adversarial Images实验设置-Experimental Se…

MySQL(四)MySQL Select语句

1. MySQL Select语句 1.1. 基本查询语句 mysql>select 列名 from 表名;(基本结构查询某一列) mysql>select 列名1,列名2 from 表名;(查询所有列多列) mysql>select * from 表名;(*代表查询所有列) 查询时可以给列设定别名通过as 关键字&#xff0c;别名可以是汉字&a…

高并发写利器-组提交,我的Spring组件实战

高并发写优化理论 对于高并发的读QPS优化手段较多&#xff0c;最经济简单的方式是上缓存。但是对于高并发写TPS该如何提升&#xff1f;业界常用的有分库分表、异步写入等技术手段。但是分库分表对于业务的改造十分巨大&#xff0c;涉及迁移数据的麻烦工作&#xff0c;不会作为…

C++Primer 变量

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…

【模型】Qwen2-VL 服务端UI

1. 前言 最近在测试VLM模型&#xff0c;发现官方的网页demo&#xff0c;代码中视频与图片分辨率可能由于高并发设置的很小&#xff0c;导致达不到预期效果&#xff0c;于是自己研究了一下&#xff0c;搞了一个简单的前端部署&#xff0c;自己在服务器部署了下UI界面&#xff0…

分布式事务介绍 Seata架构与原理+部署TC服务 示例:黑马商城

1. 什么是分布式事务? 在分布式系统中&#xff0c;如果一个业务需要多个服务合作完成&#xff0c;而且每一个服务都有事务&#xff0c;多个事务必须同时成功或失败&#xff0c;这样的事务就是分布式事务。其中的每个服务的事务就是一个分支事务。整个业务称为全局事务。 打个比…

uni-app:实现普通选择器,时间选择器,日期选择器,多列选择器

效果 选择前效果 1、时间选择器 2、日期选择器 3、普通选择器 4、多列选择器 选择后效果 代码 <template><!-- 时间选择器 --><view class"line"><view classitem1><view classleft>时间</view><view class"right&quo…

C++Primer 基本类型

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…

纯前端实现将pdf转为图片(插件pdfjs)

需求来源 预览简历功能在移动端&#xff0c;由于用了一层iframe把这个功能嵌套在了app端&#xff0c;再用一个iframe来预览&#xff0c;只有ios能看到&#xff0c;安卓就不支持&#xff0c;查了很多资料和插件&#xff0c;原理基本上都是用iframe实现的。最终转换思路&#xf…

基于FPGA的出租车里程时间计费器

基于FPGA的出租车里程时间计费器 功能描述一、系统框图二、verilog代码里程增加模块时间增加模块计算价格模块上板视频演示 总结 功能描述 &#xff08;1&#xff09;&#xff1b;里程计费功能&#xff1a;3公里以内起步价8元&#xff0c;超过3公里后每公里2元&#xff0c;其中…

Unix 域协议汇总整理

Unix 域协议是一种用于同一台计算机上进程间通信&#xff08;IPC&#xff09;的技术。它提供了一种比基于网络的套接字更高效的方式来在本地进程中交换数据。Unix 域协议使用文件系统作为通信的媒介&#xff0c;并且只限于在同一台计算机上运行的进程之间进行通信。 Unix 域套接…

JVM学习:CMS和G1收集器浅析

总框架 一、Java自动内存管理基础 1、运行时数据区 运行时数据区可分为线程隔离和线程共享两个维度&#xff0c;垃圾回收主要是针对堆内存进行回收 &#xff08;1&#xff09;线程隔离 程序计数器 虚拟机多线程是通过线程轮流切换、分配处理器执行时间来实现的。为了线程切换…

1.C语言教程:历史、特点、版本与入门示例

目录 1.历史2.特点3.版本4.编译5.Hello World 示例 1.历史 本篇原文为&#xff1a;C语言教程&#xff1a;历史、特点、版本与入门示例。 更多C进阶、rust、python、逆向等等教程&#xff0c;可去此站查看&#xff1a;酷程网 C 语言的诞生源于 Unix 系统的开发需求。 1969 年…

lec7-路由与路由器

lec7-路由与路由器 1. 路由器硬件 路由器的硬件部分&#xff1a; 断电失去&#xff1a; RAM断电不失去&#xff1a;NVRAM&#xff0c; Flash&#xff0c; ROMinterface也算是一部分 路由器是特殊组件的计算机 console 口进行具体的调试 辅助口&#xff08;Auxiliary&…

spring防止重复点击,两种注解实现(AOP)

第一种&#xff1a;EasyLock 简介 为了简化可复用注解&#xff0c;自己实现的注解&#xff0c;代码简单随拿随用 使用方式 1.创建一个注解 Target(ElementType.METHOD) Retention(RetentionPolicy.RUNTIME) Documented public interface EasyLock {long waitTime() default …

Linux-Ubuntu之I2C通信

Linux-Ubuntu之I2C通信 一&#xff0c;I2C通信原理1.写时序2.读时序 二&#xff0c;代码实现三&#xff0c;显示 一&#xff0c;I2C通信原理 使用I2C接口驱动AP3216C传感器&#xff0c;该传感器能实现两个效果&#xff0c;一个是感应光强&#xff0c;另一个是探测物体与传感器…

音视频入门基础:MPEG2-PS专题(4)——FFmpeg源码中,判断某文件是否为PS文件的实现

一、引言 通过FFmpeg命令&#xff1a; ./ffmpeg -i XXX.ps 可以判断出某个文件是否为PS文件&#xff1a; 所以FFmpeg是怎样判断出某个文件是否为PS文件呢&#xff1f;它内部其实是通过mpegps_probe函数来判断的。从《FFmpeg源码&#xff1a;av_probe_input_format3函数和AVI…

框架模块说明 #09 日志模块_01

背景 日志模块是系统的重要组成部分&#xff0c;主要负责记录系统运行状态和定位错误问题的功能。通常&#xff0c;日志分为系统日志、操作日志和安全日志三类。虽然分布式数据平台是当前微服务架构中的重要部分&#xff0c;但本文的重点并不在此&#xff0c;而是聚焦于自定义…

【数据仓库】hadoop3.3.6 安装配置

文章目录 概述下载解压安装伪分布式模式配置hdfs配置hadoop-env.shssh免密登录模式设置初始化HDFS启动hdfs配置yarn启动yarn 概述 该文档是基于hadoop3.2.2版本升级到hadoop3.3.6版本&#xff0c;所以有些配置&#xff0c;是可以不用做的&#xff0c;下面仅记录新增操作&#…