73|0

103

帖子

5

TA的资源

一粒金砂(中级)

楼主
 

【Follow me第二季第4期】任务一 Blink三色LED / 串口打印 [复制链接]

  本帖最后由 yilonglucky 于 2024-11-27 18:14 编辑

需求分析:

三色LED是连接到NINA芯片上的,Arduino有现成的NINA库可以使用,将LED对应的三个GPIO扩展为了25,26,27,相当于GPIO扩展芯片。

串口打印可以使用默认的通道,即USB CDC,但是在系统启动、初始化期间IDE自带的“串口监视器”是无法使用的,因此计划使用nano的Tx和Rx脚进行硬线连接,但是注意,这组串口实际对应代码中的Serial1。

 

所需物料:

nano主板和另外一块串口小板,三根杜邦线。

 

设计思路:

系统代码运行后打印必要的信息后,开启一个线程自动翻转RP4010直连的BUILDIN LED用来提示nano代码已经开始运行。

另外一个线程监控Seria1发来的数据,并指定对应的亮灯动作。

 

因此将三个亮灯信息编码进一个byte中:

Index R G B
0 0 0 0
1 0 0 1
2 0 1 0
3 0 1 1
4 1 0 0
5 1 0 1
6 1 1 0
7 1 1 1

这样在串口输入0~7即可控制三色灯的所有组合情况。

实际运行效果:

 

源代码:

// Include Scheduler since we want to manage multiple tasks.
#include <Scheduler.h>
#include "WiFiNINA.h"
#define led1 LEDR
#define led2 LEDG
#define led3 LEDB
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  Serial1.begin(9600);

  pinMode(LED_BUILTIN, OUTPUT);
  
  // Setup the 3 pins as OUTPUT
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  digitalWrite(led1, LOW);
  digitalWrite(led2, LOW);
  digitalWrite(led3, LOW);

  Serial1.println("\n~~~~~~~~~~ RGB Blink Demo on Arduino Nano RP2040 ~~~~~~~~~~");
  Serial.println("Hello DigiKey & EEWorld!");
  Serial1.println("Hello DigiKey & EEWorld!");
  Serial1.println("Please input the index number to blink the RGB LED:");
  Serial1.println("Index	R	G	B");
  Serial1.println("0:	0	0	0");
  Serial1.println("1:	0	0	1");
  Serial1.println("2:	0	1	0");
  Serial1.println("3:	0	1	1");
  Serial1.println("4:	1	0	0");
  Serial1.println("5:	1	0	1");
  Serial1.println("6:	1	1	0");
  Serial1.println("7:	1	1	1");
  Scheduler.startLoop(loop1);
  Scheduler.startLoop(loop2);
}
/*
* Name: set_rgb
* Para: rgb index
*       bit2: red led
*       bit1: green led
*       bit0: blue led
*/
void set_rgb(char c) {
  int r, g, b;
  r = (c >> 2) % 2;
  g = (c >> 1) % 2;
  b = (c % 2);
  digitalWrite(led1, (PinStatus)r);
  digitalWrite(led2, (PinStatus)g);
  digitalWrite(led3, (PinStatus)b);
}
void loop() {
  if (Serial1.available()) {
    char c = Serial1.read();
    set_rgb(c);
  }
  // IMPORTANT:
  // We must call 'yield' at a regular basis to pass
  // control to other tasks.
  yield();
}
void loop1() {
  set_rgb(4);
  delay(1000);
  set_rgb(2);
  delay(1000);
  set_rgb(1);
  delay(1000);
}
void loop2() {
  digitalWrite(LED_BUILTIN, HIGH);
  delay(1000);
  digitalWrite(LED_BUILTIN, LOW);
  delay(1000);
}
 
点赞 关注
个人签名尽吾志也而不能至者,可以无悔矣。——王安石
 
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表