机械必威体育网址

 找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 6953|回复: 9
打印 上一主题 下一主题

用单片机做一个自行车车速表的过程描述,含一段代码

[复制链接]
跳转到指定楼层
1#
发表于 2023-9-3 17:56:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
要制作一个自行车车速表,您可以使用单片机(微控制器)来测量自行车的速度并显示在一个数字屏幕上。以下是一个简单的概述,可以帮助您开始:

材料和硬件需求:

单片机(例如Arduino、Raspberry Pi等)
自行车速度传感器(可以使用磁性传感器、光电传感器等)
数字显示屏(可以使用7段数码管、LCD显示屏、OLED显示屏等)
电源供应(电池或电源适配器)
连接线和焊接设备(如果需要)
步骤:

连接传感器:首先,将速度传感器连接到单片机。具体的连接方式将取决于您选择的传感器类型。传感器将帮助您测量自行车的速度。

编程单片机:使用您选择的单片机编写代码来读取传感器的数据并计算速度。您需要将传感器的输出数据与自行车轮胎的尺寸和转动周期进行关联以计算速度。您可以使用编程语言(如Arduino IDE或Python)来实现此功能。

显示速度:将计算出的速度数据显示在数字屏幕上。如果使用7段数码管,您需要编写代码以将速度数字转换为适当的数码管段码。如果使用LCD或OLED显示屏,您可以使用适当的库来轻松显示文本或数字。

电源供应:确保您的电路有足够的电源供应以运行单片机和显示屏。

测试和校准:在您的自行车上安装传感器和显示屏,然后进行测试。确保速度测量准确,并根据需要进行校准。


以下是一个使用Arduino编写的简单自行车速度计的示例代码。这个代码假定您使用磁性传感器来检测自行车轮胎的旋转,并且您已经将磁性传感器连接到Arduino的数字引脚2上。

const int sensorPin = 2; // 传感器连接到Arduino的数字引脚2
const float wheelCircumference = 2.07; // 自行车轮胎的尺寸(单位:米)
unsigned long previousMillis = 0;
const long interval = 1000; // 更新速度的间隔(毫秒)

void setup() {
  Serial.begin(9600); // 初始化串口通信
  pinMode(sensorPin, INPUT);
}

void loop() {
  unsigned long currentMillis = millis();

  // 检测传感器状态变化
  int sensorValue = digitalRead(sensorPin);

  static int previousSensorValue = LOW;
  if (sensorValue != previousSensorValue) {
    if (sensorValue == HIGH) {
      // 每次传感器检测到磁铁时,计数加一
      // 在这里,您可以根据需要进行校准
      count++;
    }
    previousSensorValue = sensorValue;
  }

  // 计算速度并显示
  if (currentMillis - previousMillis >= interval) {
    float speed = (count * wheelCircumference) / (interval / 1000); // 计算速度(米/秒)
    Serial.print("Speed: ");
    Serial.print(speed);
    Serial.println(" m/s");
    count = 0; // 重置计数
    previousMillis = currentMillis;
  }
}


这段代码使用了一个磁性传感器来检测自行车轮胎上的磁铁,每次检测到磁铁时,计数加一。然后,它每隔一秒钟计算一次速度,并将其显示在串口监视器上。您可以根据需要进行校准以确保速度测量的准确性。此代码只是一个示例,具体的硬件和传感器可能需要不同的配置和代码。



评分

参与人数 1威望 +100 收起 理由
老鹰 + 100

查看全部评分

回复

使用道具 举报

2#
发表于 2023-9-4 08:26:12 | 只看该作者
这个可以啊。
不知道汽车是怎么测的。
回复 支持 反对

使用道具 举报

3#
发表于 2023-9-5 08:35:50 | 只看该作者
??你这行文风格太像ai了
回复 支持 反对

使用道具 举报

4#
发表于 2023-9-6 15:57:59 | 只看该作者
leioukupo 发表于 2023-9-5 08:35
??你这行文风格太像ai了

我也这么觉得的。
回复 支持 反对

使用道具 举报

5#
发表于 2023-9-9 08:13:50 | 只看该作者
本帖最后由 cc851 于 2023-9-9 08:16 编辑

带蓝牙的单片机放在车把上,前叉上安装接近传感器,车轮上均布多颗磁铁,写入程序连上APP搞定
方案还有很多,前轮连接编码器、转速计等都能实现这个功能。
回复 支持 反对

使用道具 举报

6#
发表于 2023-9-13 09:31:07 | 只看该作者
程序可以这样写,用中断计数要准一点,
/****************PCA定时器定义*********************/
code unsigned long FOSC=11059200;  //系统运行频率
#define T25Hz  FOSC / 12 / 25
  //中断子程序  使用中断1,寄存器组0 ,计数器模式
void count0() interrupt 1
{
   T0count++;
}
//-----------------------------------------------
//PCA定时中断程序  接收频率=频率分频/8        25HZ周期为1/25*2=0.08秒

void PCA_isr() interrupt 7
{
        static         Count1=0;          //静态变量计数器1
        Count1++;                      //每次中断计数器加1
    CCF0 = 0;                  //清中断标志
    CCAP0L = value;
    CCAP0H = value >> 8;       //更新比较值
        value += T25Hz;
        if(Count1>=2)                  //如果计数器超过25/2=12.5HZ  0.08S
        {
                ET0=0;                                   //计数器0关闭                                         
                dispcount=T0count;           //更新频率值
                Count1=0;              //计数器清零
                T0count=0;
                ET0=1;                                    //计数器0允许
        }       
}       
void main(void)

{
        IT0 = 1;                            //设置INT0的中断类型 (1:仅下降沿 0:上升沿和下降沿)
        TMOD &= 0xf0;                       //设置定时器为模式0(16位自动重装载)
        TMOD |= 0x04;                                            //定时器0工作于模式1-16位计数模式
        TH0=0Xff;
        TL0=0Xff;
        TR0=1;                                                            //计数器0开始工作
        ET0=1;                                                            //计数器0允许
    ACC = P_SW1;
    ACC &= ~(CCP_S0 | CCP_S1);          //CCP_S0=0 CCP_S1=0
    P_SW1 = ACC;                        //(P1.2/ECI, P1.1/CCP0, P1.0/CCP1, P3.7/CCP2)
        CCON = 0;                           //初始化PCA控制寄存器
    CL = 0;                             //复位PCA寄存器
    CH = 0;
    CMOD = 0x00;                        //设置PCA时钟源
    value = T25Hz;
    CCAP0L = value;
    CCAP0H = value >> 8;                //初始化PCA模块0
    value += T25Hz;
    CCAPM0 = 0x49;                      //PCA模块0为16位定时器模式
    CR = 1;                                  //PCA定时器开始工作
    EA = 1;  
}
回复 支持 反对

使用道具 举报

7#
发表于 2023-9-14 17:44:51 | 只看该作者
长桥卧波 发表于 2023-9-13 09:31
程序可以这样写,用中断计数要准一点,
/****************PCA定时器定义*********************/
code uns ...

都是机电双修的牛人啊,,,,
回复 支持 反对

使用道具 举报

8#
发表于 2023-9-14 17:46:06 | 只看该作者
cc851 发表于 2023-9-9 08:13
带蓝牙的单片机放在车把上,前叉上安装接近传感器,车轮上均布多颗磁铁,写入程序连上APP搞定
方案还有 ...

事实上好像的确是,手机干掉了码表行业
回复 支持 反对

使用道具 举报

9#
发表于 2023-9-15 11:44:11 | 只看该作者
已学
回复

使用道具 举报

10#
发表于 2023-10-13 10:32:54 | 只看该作者
厉害
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

小黑屋|手机版|Archiver|机械必威体育网址 ( 京ICP备10217105号-1,京ICP证050210号,浙公网安备33038202004372号 )

GMT+8, 2024-11-22 04:27 , Processed in 0.053789 second(s), 16 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表