这段时间锻炼的少了,血糖又有上升的趋势,就把我的破自行车修了一下,开始骑行。但夜间骑行不安全,就考虑加一个尾灯。
把零件盒里的电子垃圾扒拉了一下,找到一块ws2812b,8联封装好的那种,一块以前买的的arduino nano,再从老婆的旧电动车上拆了一个转向开关总成,然后就开始组装了。
【实现功能】
我要实现的功能很简单,从车把上控制尾灯的开关及左转右转。正常情况下,尾灯以呼吸灯的形式提醒后车,转向的时间采用向左或向右的流水灯显示。
【所需配件】
1、Arduino nano一个。
电源开关一个(尾灯白天断电关闭,夜间需要时通电打开)、双向开关一个(控制左转和右转)实际上我用一个电动车的转向总成控制,上面有大灯开关和转向开关(还有一个喇叭开关,空置不用)。
10K电阻两个(用于转向灯的分流)
【程序代码】
程序如下:
/*
* 本实例用于实现自行车电子尾灯,主要功能是实现夜行警示及右转、右转提示
* 主要元器件包括:
* 1、一块arduino nano(控制灯光显示及变化)
* 2、一块8联ws2812B-8彩色LED
* 3、一块9v层叠电池(普通的电量小不奈用,我用的是一个可充电的)
* 4、三位开关、电源开关(也可以使用一个电动车的转向开关总成)
* 5、10K色环电阻两个(用于分流)
* 源码所涉及库文件到:https://download.csdn.net/download/hnkkfan/72395780下载
*/
#include
#ifdef __AVR__
#include
#endif
#define PIN 6 //ws2812b的din接在arduino的D6上
#define NUMPIXELS 8 // LED数量为8
// 定义灯珠对象
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
int delayval = 500; // 延时变量
int Pin_Left=A0;//设置左转信号接A0
int Pin_Right=A1;//设置右转信号接A1
void setup() {
#if defined (__AVR_ATtiny85__)
if (F_CPU == 16000000) clock_prescale_set(clock_div_1);
#endif
// End of trinket special code
pixels.begin(); // 初始化对象.
}
void loop()
{
if(digitalRead(Pin_Left)==HIGH)//如果按下左转
{
turnLeft();
}
else
{
if(digitalRead(Pin_Right)==HIGH)//如果按下右转
{
turnRight();
}
else//什么也没按
{
turnFlash();
}
}
}
void turnLeft()
{
for(int i=NUMPIXELS;i>0;i-=2)
{
//方法pixels.setPixelColor(s, pixels.Color(r,g,b))用于设置灯珠,s为第几个灯珠,rgb为红绿蓝分量,0-255.
pixels.setPixelColor(i-1, pixels.Color(255,80,0));
pixels.setPixelColor(i-2, pixels.Color(255,80,0));
pixels.show(); // 在ws2812b上更新LED显示信息
delay(delayval);
}
//下面的循环用于熄灭全部灯珠
for(int i=0;i<NUMPIXELS;i++)
{
pixels.setPixelColor(i, pixels.Color(0,0,0));
pixels.show();
}
delay(delayval);
}
void turnRight()
{
for(int i=0;i<NUMPIXELS;i+=2)
{
pixels.setPixelColor(i, pixels.Color(255,80,0));
pixels.setPixelColor(i+1, pixels.Color(255,80,0));
pixels.show();
delay(delayval);
}
for(int i=0;i<NUMPIXELS;i++)
{
pixels.setPixelColor(i, pixels.Color(0,0,0));
pixels.show();
}
delay(delayval);
}
void turnFlash()
{
for(int i=255;i>0;i-=64)
{
pixels.setPixelColor(3, pixels.Color(i,0,0));
pixels.setPixelColor(4, pixels.Color(i,0,0));
pixels.setPixelColor(2, pixels.Color(0,i,0));
pixels.setPixelColor(5, pixels.Color(0,i,0));
pixels.setPixelColor(1, pixels.Color(0,0,i));
pixels.setPixelColor(6, pixels.Color(0,0,i));
pixels.setPixelColor(0, pixels.Color(i,i/2,0));
pixels.setPixelColor(7, pixels.Color(i,i/2,0));
pixels.show();
delay(250);
}
for(int i=0;i<255;i+=64)
{
pixels.setPixelColor(3, pixels.Color(i,0,0));
pixels.setPixelColor(4, pixels.Color(i,0,0));
pixels.setPixelColor(2, pixels.Color(0,i,0));
pixels.setPixelColor(5, pixels.Color(0,i,0));
pixels.setPixelColor(1, pixels.Color(0,0,i));
pixels.setPixelColor(6, pixels.Color(0,0,i));
pixels.setPixelColor(0, pixels.Color(i,i/2,0));
pixels.setPixelColor(7, pixels.Color(i,i/2,0));
pixels.show();
delay(250);
}
}
安装后用3d打印机简单做了一个盒子,上盖用白色的PLA材料(我本来想用透明的,但手头没有),做完后固定到自行车后座下面,然后把开关总成固定在车把上,一个有转向提示功能的尾灯就完成了。
【效果】
安装后的效果如下:
通电尾灯呼吸状态
左转时的流水灯
右转时的流水灯
做完了试下,夜行时,偶就是最靓的仔!