【联盛德 W800 Arduino开发板】PWM 测试、彩色呼吸灯、OLED显示
这里我们使用 Arduino IDE 编译工程实现对 W800 的控制和开发,测试项目包括 PWM 实现板载 RGB 三色 LED 呼吸效果,0.96 英寸 IIC 通信 OLED 显示、舵机驱动。
PWM
脉宽调制(Pulse Width Modulation, PWM)是一种方波控制信号,采用不同的占空比来实现近似“模拟输出”。
简介
PWM 是一种通过数字方式获得模拟结果的技术。数字控制用于创建方波,即在打开和关闭之间切换的信号。
这种开关模式可以通过改变信号花费的时间与信号关闭的时间部分来模拟电路板全 Vcc 之间的电压(例如,开发板上的 5 V 和 3.3 V)和关闭(0 V)之间的电压。
“导通时间” 的持续时间称为脉冲宽度。要获得不同的模拟值,需要更改或调制该脉冲宽度。
如果对 LED 足够快地重复这个开关模式,结果就好像信号是 0 到 Vcc 之间的稳定电压,控制 LED 的亮度。
实现方式
当 PWM 频率约为 500Hz 时,每个周期的持续时间为 1/500 秒。对 analogWrite() 的调用范围为 0 - 255,因此 100% 的占空比(始终开启)对应 analogWrite(255),50% 的占空比(在一半的时间内)对应 analogWrite(127) .
硬件参数
W800_Arduino 开发板提供一个三色灯,方便客户调试 PWM 。
由原理图可知
LED1为三色灯 ,可以通过 3 路 PWM 分别调光 。
当使用时 ,需要将 K1 开关拨到 ON 档;不用时 K1 拨到 OFF 档。
代码
- #include <Arduino.h>
-
- #define DUTY_MAX 240
- #define DUTY_MIN 50
-
- // Note: on W801 board only two LEDs are connetcted to PWM pins, so PB5 led won't lit
-
- intm[3] = { 0 }, d[3] = { DUTY_MIN, (DUTY_MIN+DUTY_MAX) /2, DUTY_MAX-1 };
-
- intpwm_pin[3] = { LED_BUILTIN_1, LED_BUILTIN_2, LED_BUILTIN_3 };
-
- voidsetup() {
- for (inti=0; i<3; i++) pinMode(pwm_pin, PWM_OUT);
- }
-
- voidloop() {
-
- for (inti=0; i<3; i++) {
- if (m ==0) // Increasing
- {
- analogWrite(pwm_pin, d++);
- if (d ==DUTY_MAX) m =1;
- } else// Decreasing
- {
- analogWrite(pwm_pin, d--);
- if (d ==DUTY_MIN) m =0;
- }
- }
- delay(5);
- }
参考例程
实现效果
OLED]使用 IIC 通信 0.96 英寸的 OLED 显示屏,实现图片帧循环播放。
简介
<span]介绍 IIC 协议、OLED 原理、SSD1306驱动原理。
IIC]IIC (Inter-Integrated Circuit) 即集成电路总线。它是一种串行通信总线,使用多主从架构,如图所示。
自2006年10月1日起,使用 IIC 协议不需要支付专利费,但制造商仍然需要付费以获取 IIC 从属设备地址。
IIC 使用两根线进行通信:一根时钟线 SCL,一根数据线 SDA。
传输数据时,SDA在SCL低电平时改变数据,在SCL高电平时保持数据,每个SCL脉冲的高电平传递1位数据。
OLED 显示原理
OLED 由于同时具备自发光,不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板、使用温度范围广、构造及制程较简单等优异特性,被认为是下一代的平面显示器新兴应用技术。
0.96英寸OLED基本参数
- 工作电压:3.3~5V(内置3.3V]OLED 模块电路
SSD1306 驱动电路
取模
PCtoLCD2018 参数设置
硬件连接
<span]硬件连接需要注意阅读使用手册,开发板两排排针和排母分别对应主控 MCU 的复用引脚,这里使用 Arduino 定义,因此对应开发板的 CN5 (1-4) 排母。
代码
- #include <GyverOLED.h>
- #include "bmp.h"
-
- GyverOLED<SSD1306_128x64, OLED_BUFFER>oled;
-
- voidsetup() {
- Serial.begin(115200);
- oled.init(); // инициализация
- }
-
- voidloop() {
- oled.clear();
- oled.drawBitmap(0, 0, bitmap1_128x64, 128, 64);
- oled.update();
- delay(550);
-
- oled.clear();
- oled.drawBitmap(0, 0, bitmap2_128x64, 128, 64);
- oled.update();
- delay(550);
- }
其他效果如滚动字幕、动态输出……详见例程。
实现效果
建议
1.Arduino IDE 例程较少,且兼容性不足,无法满足更多外设模块的开发调用,如 DS18B20 , DHT11 等;
2.程序烧录无法自动下载,需要复位后才能上传进芯片;
3.无线功能有待完善和扩展,适配 Arduino IDE,充足和完善相关应用,如 MQTT 协议等。
- #include <GyverOLED.h>