3.基于霍尔传感器的简易速度计的程序在了解移位寄存器的使用方法和复习7段LED之后,我们开始实际设计速度计的程序。具体的程序流程是以按一定间隔(此次为1秒钟)获取的转速为基础,计算时速的程序。假设为每转1圈前进0.5m时,1秒钟检测到2次时为0.5m×2次 = 前进1m。将其换算为1小时即可求出时速。 程序的关键在于,对7段LED就像之前也操作过的那样,通过在短时间内切换显示第1~3位来实现3位显示,和获取millis()函数处理时机的时间,按一定时间计算速度并在7段LED上显示的原理。
程序 – 简易速度计的程序
#include <BD7411.h>
long _beforetime = 0;
//传感器用
int _hallout_pin = 0; // use D0 pin
int _cnt = 0;
bool _flg = false;
unsigned long _starttime = 0;
BD7411 bd7411;
//移位寄存器用
#define SCK_PIN 13
#define RCK_PIN 10
#define SI_PIN 11
//位数控制用
#define DP1 2
#define DP2 3
#define DP3 4
//
float _meter = 1; //每转1圈的距离数
float _speedVal = 0;
//7段LED的数字排列
const int digits[10] = {
0b00111111, // 0
0b00000110, // 1
0b01011011, // 2
0b01001111, // 3
0b01100110, // 4
0b01101101, // 5
0b01111101, // 6
0b00100111, // 7
0b01111111, // 8
0b01101111, // 9
};
void setup(){
Serial.begin(9600);
while (!Serial);
bd7411.init(_hallout_pin);
pinMode(SCK_PIN, OUTPUT);
pinMode(RCK_PIN, OUTPUT);
pinMode(SI_PIN, OUTPUT);
pinMode(DP1, OUTPUT);
pinMode(DP2, OUTPUT);
pinMode(DP3, OUTPUT);
_beforetime = millis();
}
void loop() {
int hallout;
hallout = bd7411.readoutpin();
if (hallout == 0 && _flg == false) {
if(_starttime == 0){
_starttime = millis();
}
Serial.print("BD7411G Magnet field Detect! - ");
_flg = true;
_cnt++;
Serial.print(hallout);
Serial.print("-");
Serial.println(_cnt);
}
else{
_flg = false;
}
//超过从上一次闪烁开始的经过时间(1秒)后刷新速度
if (millis() - _beforetime > 1000) {
_beforetime = millis();
//计算速度并在7段LED上显示
float sp = _meter * _cnt * 60*60 / 1000; //速度=距离(_meter*_cnt)÷时间(60秒×60分)/1000(为了做成仪表单位)
_speedVal = sp * 10;
Serial.print("SPEED:");
Serial.println(_speedVal);
_cnt = 0;
}
SEGMENT_OUT((int)_speedVal);
delay(1);
}
void SEGMENT_OUT(int num){
for(int i = 0; i < 3; i++){
int disp_num = 0;
int dots = 0;
//第1位的处理
if(i==0){
disp_num = NumParse(num,1);
digitalWrite(DP1, LOW);
digitalWrite(DP2, HIGH);
digitalWrite(DP3, HIGH);
}
//第2位的处理
else if(i==1){
dots = 0b10000000;
disp_num = NumParse(num,2);
digitalWrite(DP2, LOW);
digitalWrite(DP1, HIGH);
digitalWrite(DP3, HIGH);
}
//第3位的处理
else if(i==2){
disp_num = NumParse(num,3);
digitalWrite(DP3, LOW);
digitalWrite(DP1, HIGH);
digitalWrite(DP2, HIGH);
}
digitalWrite(RCK_PIN, LOW);
shiftOut(SI_PIN, SCK_PIN, MSBFIRST, digits[disp_num]+dots);
digitalWrite(RCK_PIN, HIGH);
delay(3);
}
}
//将3位逐一分解的函数
int NumParse(int Number,int s){
int val[3];
val[0] = (Number % 10); Number /= 10; // 取出第1位
val[1] = (Number % 10); Number /= 10; // 取出第2位
val[2] = (Number % 10); Number /= 10; // 取出第3位
return val[s-1];
}
可以看出接近或远离磁铁后,速度会随之刷新。
装到自行车上试试准备完成后,将其实际装上自行车。此次,将以100日元均价购买的强力磁铁安装在自行车的后轮上(轮胎的框架是金属的,因此直接吸住磁铁)并固定,以使磁铁与传感器接近。磁铁与传感器的距离需要稍稍调整,因此用遮蔽胶带固定传感器。
传感器固定完成后,实际转动轮胎以测试传感器有无反应。快速旋转时,确认到显示的数值发生变化!
基于霍尔传感器的简易速度计的总结此次,我们使用霍尔传感器制作了简易速度计。使用传感器评估套件时,或不使用时,随着制作设备的经验增加,发现Arduino的引脚数太少的情况会越来越多。这时,通过使用移位寄存器等方法,可以制作扩展性更强的设备。下次,将继续介绍传感器评估套件中的其他传感器!
|