Arduino版读取程序的规则_第一次实践:写一个基于NodeMCU开发板的流水灯程序

前几天突然想搞一个流水灯,说干就干。 首先介 绍一下今天的主角: NodeMCU NodeMcu使用了ESP8266 (ESP-12E)模组,只不过和ESP8266(ESP-12E)相比,多了一些封装。(自带USB转Serial模块)

ce0f81ae9cd055da2c67b10bf9282732.png

114dfd9fa351c9983d65acf387dc55ee.png

主要参数

f53db14bf504fea229dd1d9645099ab1.png

引脚图

1d9a2c8e1aee99ccacd774e7223f2da8.png

1dfb8d7010c6d8904c3074380d1ba925.png

ESP8266芯片有17个GPIO引脚(GPIO0~GPIO16)。这些引脚中的GPIO6~GPIO 11被用于连接开发板的闪存(Flash Memory)因此建议不要使用GPIO6~GPIO 11。 在这剩下的11个针脚中,又有2个针脚预留给串口RX和TX。 一些GPIO引脚同时兼备了其他功能,如RX,TX, SD2, SD3,这些引脚大多不作为GPIO使用,因为它们可用于其他进程。

因此,最后只剩下9个通用I/O引脚,即D0到D8。

需要注意的是,D0|GPIO16引脚只能作为GPIO读/写使用,不支持任何特殊功能

电压电流限制

NodeMCU开发板引脚的输入输出电压限制是3.3 V。如果向引脚施加3.6V以上的电压就有可能对芯片电路造成损坏。同时请注意,这些引脚的最大输出电流是12mA。

特殊引脚

GPIO2引脚 在NodeMCU开发板启动时是不能连接低电平的。 GPIO15引脚在开发板运行中一直保持低电平状态。 GPIO0引脚在开发板运行中需要一直保持高电平状态。否则ESP8266将进入程序上传工作模式也就无法正常工作了

模拟输入

AD转换 将模拟量转换为数字量 只有一个引脚 A0,nodemcu上可以读取模拟输入0-3.3v的电压

通讯

串行端口(UART)TX(GPIO1)和RX(GPIO3) 以及 TX(GPIO2)和RX(GPIO8)

I2C

 ESP8266只有软件模拟的I²C端口,没有硬件I²C端口。可以使用任意的两个GPIO引脚通过软件模拟来实现I²C通讯。ESP8266的数据表(datasheet)中,GPIO4(D2)标注为SDA,GPIO5(D1)标注为SCL。

SPI

ESP8266的SPI端口情况如下: GPIO14 — CLK GPIO12 — MISO GPIO13 — MOSI GPIO 15 — CS(SS)

安装驱动

需要安装驱动 才能通过usb连接NodeMcu电脑才能识别到端口 Windows驱动请访问:https://yun.coupile.top/#/s/WBh6 (v1使用ch341驱动 V2 与V3 大部分使用cp210x驱动)

c108ef8e2d30f8035e1bde562d73ff16.png

那么看完了NodeMCU的介绍,现在开始搞起今天的项目。

最新版Arduino IDE下载   https://yun.coupile.top/#/s/WBh6Arduino IDE是开发Arduino用的,但是如果你要写非Arduino的控制板(比如今天的主角,NodeMCU,就是一款基于esp8266的开发板),请先在文件 —> 首选项 —> 附加开发板管理器地址里,输入http://arduino.esp8266.com/stable/package_esp8266com_index.json 网址6da11d443a380bfa6369e5a4db7f71dd.png00759aa476288c72ef8ab638b54bf0b4.png

确认保存之后,再次选中工具 —> 开发板:“XXXXXX” —> 开发板管理器,在搜索框中输入esp8266,选择安装即可(可能会很慢,如果提示

a1b5a51854088fa1fe2605a1abaf87af.png

就需要魔法飞到qiang外。)

639cffe52ccc8c3ac768d05493b1a86e.png

安装完成之后,重新打开工具 —> 开发板:“XXXXXX”,选择NodeMCU 1.0(ESP-12E)

ab4046074f5a155e87ebd97a2059be98.png

然后就可以愉快的编程啦。

当然,我们还需要了解一下ArduinoIDE使用语言的语法。

Arduino使用C/C++编写程序,虽然C++兼容C语言,但这是两种语言,C语言是一种面向过程的编程语言,C++是一种面向对象的编程语言。早期的Arduino核心库使用C语言编写,后来引进了面向对象的思想,目前最新的Arduino核心库采用C与C++混合编写而成。        通常我们说的Arduino语言,是指Arduino核心库文件提供的各种应用程序编程接口(Application Programming Interface,简称API)的集合。这些API是对更底层的单片机支持库进行二次封装所形成的。

在Arduino中,使用了清楚明了的API替代繁杂的寄存器配置过程,如以下代码:
pinMode(13,OUTPUT);digitalWrite(13,HIGH);
pinMode(13,OUTPUT)即是设置引脚的模式,这里设定了13脚为输出模式;而digitalWrite(13,HIGH) 是让13脚输出高电平数字信号,digitalWrite(13,LOW) 是让13脚输出低电平数字信号。

这些封装好的API,使得程序中的语句更容易被理解,我们不用理会单片机中繁杂的寄存器配置,就能直观的控制Arduino,增强程序的可读性的同时,也提高了开发效率。

我们新建一个项目,你会发现,在Arduino程序中是没有main函数的。其实并不是Arduino没有main函数,而是main函数的定义隐藏在了Arduino的核心库文件中。Arduino开发一般不直接操作main函数,而是使用Setup和loop这个两个函数。 Arduino程序基本结构由setup() 和loop() 两个函数组成:
void setup(){// 在这里加入setup代码,它只会运行一次:}void loop(){// 在这里加入loop代码,它会不断重复运行:}
Arduino控制器(NodeMCU)通电或复位后,即会开始执行setup() 函数中的程序,该部分只会执行一次。 通常我们会在setup() 函数中完成Arduino(NodeMCU)的初始化设置,如配置I/O口状态,初始化串口等操作。

在setup() 函数中的程序执行完后,Arduino(NodeMCU)会接着执行loop() 函数中的程序。而loop()函数是一个死循环,其中的程序会不断的重复运行

通常我们会在loop() 函数中完成程序的主要功能,如驱动各种模块,采集数据等。

c108ef8e2d30f8035e1bde562d73ff16.png

那么了解了NodeMCU的硬件和软件之后,就正式开始编写程序了。 今天写的流水灯程序,主要是使用6根线,控制9个LED灯的亮灭,要实现这个功能,咱们先来了解下LED点阵。我这里是使用了自制的3*3点阵,某宝可以购买8*8的点阵,更加集成化。实物图和原理图如下:

779c20cfce100646f41125ae6eb70974.png

原理图:

eec68876f04a7810b1529573ed2ea1c2.png

前面讲到,在NodeMCU中,可以使用10个脚作为数字输入输出脚,那么使用其中的6只作为输出脚,对应关系如下表:
GPIO1312144516
灯珠矩阵123456
那么也就是说,把GPIO13拉高,(digitalWrite(13,HIGH);),再把GPIO4拉低(digitalWrite(4,LOW);),即可使灯珠1亮起。 接线完毕之后,开始写程序。 首先初始化引脚模式以 及设定初始电平:
int pin[6]={13,12,14,4,5,16};void setup() {    for(int i=0;i<6;i++)     {          pinMode(pin[i],OUTPUT);       if(i<3)          digitalWrite(pin[i],LOW);       else          digitalWrite(pin[i],HIGH);     }}

接下来编写主程序。为了让大家明白流水灯是个怎么“流”法,我画了一张表格:

灯珠|GPIO1312144516
1100011
2100101
3100110
4010011
5010101
6010110
7001011
8001101
9001110
其中表格正文的0和1代表着电平的高低,1是高电平,也就是HIGH。0是低,也就是LOW。 也就是先把灯珠矩阵引脚1拉高,再分别拉低4,5,6,也就是灯珠1,2,3分别亮。 可以发现,引脚电平变化是有种周期性。外循环每循环一次,内循环循环三次。 那么可以根据这种周期性来写loop()
void loop() {  for(int i=0;i<3;i++)  {       digitalWrite(pin[i],HIGH);//拉高第i行       for(int j=3;j<6;j++)       {          digitalWrite(pin[j],LOW);//拉低第j列          delay(500);//延时0.5s          digitalWrite(pin[j],HIGH);//拉高第j列(拉高拉低相当于亮了一次)          delay(500);//延时0.5s       }       digitalWrite(pin[i],LOW);//拉低第i行,如果无此语句,那么外循环第二次的时候第一行也会亮。  }}

最后插上开发版烧录就行啦。

效果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值