Arduino LED流水灯·基础实验
Arduino初学IO控制,流水灯实验是很好的学习对象。分两个进程学习。
一、假流水灯,即基础效果实现
二、真流水灯,即采用PWM模拟真实流水渐变效果
我们设立5盏灯,正极分别连接数字口(Digital Pin)3 5 9 10 11口 ,负极共地(GND)
假流水灯
int LED1 = 3;
int LED2 = 5;
int LED3 = 9;
int LED4 = 10;
int LED5 = 11;
void setup() {
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
pinMode(LED4, OUTPUT);
pinMode(LED5, OUTPUT);
}
void loop() {
//状态1
digitalWrite(LED1, 1); //1 代表 HIGH 0 代表 LOW
digitalWrite(LED2, 0);
digitalWrite(LED3, 0);
digitalWrite(LED4, 0);
digitalWrite(LED5, 0);
delay(1000);
//状态2
digitalWrite(LED1, 0);
digitalWrite(LED2, 1);
digitalWrite(LED3, 0);
digitalWrite(LED4, 0);
digitalWrite(LED5, 0);
delay(1000);
//状态3
digitalWrite(LED1, 0);
digitalWrite(LED2, 0);
digitalWrite(LED3, 1);
digitalWrite(LED4, 0);
digitalWrite(LED5, 0);
delay(1000);
//状态4
digitalWrite(LED1, 0);
digitalWrite(LED2, 0);
digitalWrite(LED3, 0);
digitalWrite(LED4, 1);
digitalWrite(LED5, 0);
delay(1000);
//状态5
digitalWrite(LED1, 0);
digitalWrite(LED2, 0);
digitalWrite(LED3, 0);
digitalWrite(LED4, 0);
digitalWrite(LED5, 1);
delay(1000);
}
使用状态控制法去实现,方便理解和修改,每个状态持续一段时间,即使用delay()。【Arduino程序的运行机制和Processing不太一样,P5是等待一次draw函数执行完才刷新画布,得到结果,而Arduino是即时,也就是执行一条语句后立马能反馈到结果!!】
当然有人用循环语句来搭建,可以,但是对初学者真是不友好。首先循环语句本来就不熟悉,而且还有delay延迟函数参与,不好理解其运行逻辑的,所以不推荐。
真流水灯
因为要模拟过渡效果,因此简单的数字式读写没法满足要求,使用PWM调节机制能模拟出来。
int LED1 = 3;
int LED2 = 5;
int LED3 = 9;
int LED4 = 10;
int LED5 = 11;
int fadeValue1 = 0; //定义亮度
int fadeValue2 = 60;
int fadeValue3 = 120;
int fadeValue4 = 180;
int fadeValue5 = 240;
int state1 = 0;
int state2 = 0;
int state3 = 0;
int state4 = 0;
int state5 = 0;
void setup() {
}
void loop() {
//更新
//1
if (state1 == 0)
{
fadeValue1 += 1;
}
else if(state1 == 1)
{
fadeValue1 -= 1;
}
if (fadeValue1 > 254)
{
state1 = 1;
}
else if (fadeValue1 < 1)
{
state1 = 0;
}
////////////////2/////////////////////////
if (state2 == 0)
{
fadeValue2 += 1;
}
else if(state2 == 1)
{
fadeValue2 -= 1;
}
if (fadeValue2 > 254)
{
state2 = 1;
}
else if (fadeValue2 < 1)
{
state2 = 0;
}
////////////////3/////////////////////////
if (state3 == 0)
{
fadeValue3 += 1;
}
else if(state3 == 1)
{
fadeValue3 -= 1;
}
if (fadeValue3 > 254)
{
state3 = 1;
}
else if (fadeValue3 < 1)
{
state3 = 0;
}
////////////////4/////////////////////////
if (state4 == 0)
{
fadeValue4 += 1;
}
else if(state4 == 1)
{
fadeValue4 -= 1;
}
if (fadeValue4 > 254)
{
state4 = 1;
}
else if (fadeValue4 < 1)
{
state4 = 0;
}
////////////////5/////////////////////////
if (state5 == 0)
{
fadeValue5 += 1;
}
else if(state5 == 1)
{
fadeValue5 -= 1;
}
if (fadeValue5 > 254)
{
state5 = 1;
}
else if (fadeValue5 < 1)
{
state5 = 0;
}
//执行 相当于 P5绘画
analogWrite(LED1, fadeValue1);
analogWrite(LED2, fadeValue2);
analogWrite(LED3, fadeValue3);
analogWrite(LED4, fadeValue4);
analogWrite(LED5, fadeValue5);
delay(4);
}
沿用P5的更新-绘画原理,慢慢地刷新亮度值,最后统一执行analogWrite()。
不过还能简化一些操作,使用sin函数来更新数值,如:
int LED1 = 3;
int LED2 = 5;
int LED3 = 9;
int LED4 = 10;
int LED5 = 11;
int fadeValue1 = 0;
int fadeValue2 = 60;
int fadeValue3 = 120;
int fadeValue4 = 180;
int fadeValue5 = 240;
//为了方便 偏移 sin函数的相位,设置一个不同的初相
int state1 = 0;
int state2 = 10;
int state3 = 20;
int state4 = 30;
int state5 = 40;
void setup() {
// put your setup code here, to run once:
// analogWrite 函数不用pinMode定义
}
void loop() {
fadeValue1 = abs(cos(millis()/200.0 + state1)) * 250 + 1;
fadeValue2 = abs(cos(millis()/200.0 + state2)) * 250 + 1;
fadeValue3 = abs(cos(millis()/200.0 + state3)) * 250 + 1;
fadeValue4 = abs(cos(millis()/200.0 + state4)) * 250 + 1;
fadeValue5 = abs(cos(millis()/200.0 + state5)) * 250 + 1;
// analogWrite(LED1, fadeValue1);
// analogWrite(LED2, fadeValue2);
// analogWrite(LED3, fadeValue3);
// analogWrite(LED4, fadeValue4);
// analogWrite(LED5, fadeValue5);
analogWrite(LED1, 255-fadeValue1);
analogWrite(LED2, 255-fadeValue2);
analogWrite(LED3, 255-fadeValue3);
analogWrite(LED4, 255-fadeValue4);
analogWrite(LED5, 255-fadeValue5);
delay(4);
}
因为sin函数的数值变化本就带缓动,因此效果很理想。
上述代码只是模型参考,任意数值都能自行修改。其实这里应该贴上实验结果来完善这篇博文,但是么。。。为了保有读者的好奇心,鼓励读者自行实操看效果,这也是学习硬件,学习Arduino另外的乐趣和意义,祝好运 ! @~
Arduino LED流水灯·基础实验的更多相关文章
- 第一个FPGA工程—LED流水灯
这一章我们来实现第一个FPGA工程-LED流水灯.我们将通过流水灯例程向大家介绍一次完整的FPGA开发流程,从新建工程,代码设计,综合实现,管脚约束,下载FPGA程序.掌握本章内容,大家就算正式的开始 ...
- S3C6410裸奔之旅——RVDS2.2编译、仿真、调试过程 LED流水灯---转的
S3C6410裸奔之旅——RVDS2.2编译.仿真.调试过程 LED流水灯 (2012-10-13 23:56:30) 转载▼ 标签: s3c6410裸奔 ok6410 rvds2.2 rvds2.2 ...
- 使用CCS10新建TMS320F28335工程并闪烁LED(流水灯)程序
学习TMS320F28335使用Code Composer Studio 10.4.0下载和安装本文不再叙述. 1. 新建工程 1.1选择目录新建工作区 1.2打开软件界面如下图所示: 1.3选择新建 ...
- 学习笔记——单片机简介 & 点亮LED & 流水灯 & 电路基础【更新Ing】
视频地址:https://www.bilibili.com/video/av10765766 超详细!!!!!! 单片机内部三大资源 [资源:单片机可提供使用的东西] FLASH 可以重复擦写 断电后 ...
- LED流水灯(二)
记住看汇编的时候是红在上面 黑色在下面 startup.s 程序 ; MDK跑马灯实验; PRESERVE8 // 字节对齐关键词 ,汇编有8位对齐的要求,要添加 AREA ...
- 关于LED 流水灯的软件调试方法(非开发板调试)
因为: 硬件 norflash 有寿命,所以尽量少用,而且自己也不会把 程序在 KEIL中从SDRAM 中调试,不会设置.所以采取软件虚拟的方法调试. 主要修改一下几部分: 1. ledcircle ...
- TQ210裸机编程(2)——LED流水灯
两个文件start.S和led.c start.S .global _start @声明一个全局的标号 _start: bl main ...
- [DM8168]Linux下控制GPIO实现LED流水灯
首先加载驱动模块,应用程序通过调用API实现GPIO控制功能. 驱动程序: /* * fileName: led_gpio.c * just for LED GPIO test * GP1_14 -& ...
- 利用简单的有限状态机(FSM)来实现一个简单的LED流水灯
有限状态机,(英语:Finite-state machine, FSM),又称有限状态自动机,简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型. 有限状态机是指输出取决于过去 ...
- 第三章 VIVADO 自定义IP 流水灯实验
第二章里面已经说过了,MIZ701 PL部分没有输入时钟,因此驱动PL资源必须是通过PS来提供时钟,所以这个流水灯实验也得建立一个最小系统了,然后再添加一个流水灯的自定义IP. 3.0本章难度系数★★ ...
随机推荐
- RHEL8安装docker
1,安装yum-utils和dnf-utils yum install -y yum-utils dnf-utils 2,添加源 docker官方源 yum-config-manager --add- ...
- 腾讯云对象存储联合DataBend云数仓打通数据湖和数据仓库
随着数字化进程不断深入,数据呈大规模.多样性的爆发式增长.为满足更多样.更复杂的业务数据处理分析的诉求,湖仓一体应运而生.在Gartner发布的<Hype Cycle for Data Mana ...
- 对象存储 AVIF 图片压缩,邀您参与免费内测!
对象存储 AVIF 图片压缩免费内测正式开放!AVIF 作为压缩图片中的新主力军,都有哪些特点呢?通过对象存储又要如何使用 AVIF 压缩呢?这篇文章将深入浅出的为您介绍~ 具体介绍 现在硬件设备越 ...
- Qt音视频开发32-qmedia内核回调拿图片数据
一.前言 使用qmediaplayer来打开视频并播放,默认首选会采用QVideoWidget控件来展示,优点是不用自己来绘制,一切交给了QVideoWidget控件,这样可以做到极低的CPU占用,缺 ...
- Qt编写的项目作品16-Onvif搜索和云台控制工具
一.功能特点 广播搜索设备,支持IPC和NVR,依次返回. 可选择不同的网卡IP进行对应网段设备的搜索. 依次获取Onvif地址.Media地址.Profile文件.Rtsp地址. 可对指定的Prof ...
- 即时通讯技术文集(第18期):IM架构设计基础知识合集 [共16篇]
为了更好地分类阅读 52im.net 总计1000多篇精编文章,我将在每周三推送新的一期技术文集,本次是第18 期. [- 1 -] IM系统的MQ消息中间件选型:Kafka还是RabbitMQ? [ ...
- Docker容器的原理、特征、基本架构、与应用场景
什么是容器? 一句话概括容器:容器就是将软件打包成标准化单元,以用于开发.交付和部署. 容器镜像是轻量的.可执行的独立软件包 ,包含软件运行所需的所有内容:代码.运行时环境.系统工具.系统库和设置. ...
- 详解 IntelliJ IDEA 配置和启动maven项目步骤
一 .从svn中检出web项目: 1.如果是maven项目:首先配置仓库 2.从svn中检出maven项目: 3.检查项目是否是maven项目,如果不是转化成maven,然后点击,更新jar 二.配置 ...
- Superset 用户集成完整方案(iframe方式)
本次集成方案经过个人测试,根据前面2个集成方案的资料,撰写,相关说明由于个人知识水平有限不一定理解准确,有错误的地方环境评论区评论: 1.用户集成方式: A系统用户,通过A的某个界面,iframe嵌入 ...
- 【Java 温故而知新系列】基础知识-05 面向对象
1.面向对象概述 面向对象(Object-Oriented,简称OO)是一种编程思想,核心思想是将现实世界中的事物抽象为程序中的"对象",通过对象之间的交互来解决问题. 对象 对象 ...