怎么实现一个灯闪烁,一个长亮-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2651|回复: 4

[已解决] 怎么实现一个灯闪烁,一个长亮

[复制链接]
发表于 2021-7-8 23:04 | 显示全部楼层 |阅读模式
本帖最后由 oanger 于 2021-7-11 22:15 编辑

#define PIN 2
volatile long count = 0;//变量count声明为volatile类型
#define LED 8            //声明LED接8口
#define LED1 9      //声明LED1接9口
#define Holzer 2   //声明霍尔 接2口
unsigned int holdtime; //霍尔停下的时间
int Holzer_Status;

void setup() {
holdtime = millis(); //读取当前时间
pinMode(Holzer, INPUT);   //霍尔为输入
  pinMode(PIN, INPUT);
  Holzer_Status = digitalRead(Holzer); //读取霍尔初始状态
  digitalWrite(LED, LOW); //将LED的初始状态设置为关闭
  attachInterrupt(0, blinkA, FALLING);//当引脚电平由高电平变为低电平时触发中断服务程序
  Serial.begin(9600);
  pinMode(LED, OUTPUT);
pinMode(LED1, OUTPUT);  / /定义LED,LED1为输出模式
}

void loop() {
int Holzer_Status1 = digitalRead(Holzer); //读取霍尔状态
  int nowtime;
  if (Holzer_Status1 == (!Holzer_Status)) // 如果霍尔状态改变
  {
    Serial.println(Holzer_Status);
    digitalWrite(LED, HIGH); // 点亮LED
    Holzer_Status = Holzer_Status1; // 将霍尔状态重置为最新
    holdtime = millis(); // 读取当前时间
  }
else   // 如果霍尔状态不变
  {
    nowtime = millis();
    if (nowtime - holdtime > 100) // 如果没有变化持续 100
      digitalWrite(LED,LOW);//关闭LED
  }
  Serial.print("累计脉冲=");
  Serial.println(count);
  delay(1000);
  if (count >= 5){
digitalWrite(LED1,HIGH);   //LED灯亮
}
else
{
digitalWrite(LED1,LOW);     //LED灭
}
}
void blinkA()
{
  count++;
}


想用  attachInterrupt中断实现检测,当前用手动触发霍尔,日后用来水流检测,速度会比较快。  没什么用,想学习一下。
目前 要做到检测到单次霍尔触发LED亮,超过5次LED1亮。
哪里出问题了

发表于 2021-7-10 15:08 | 显示全部楼层
可以的

  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   实验九十一: 1号霍尔水流量传感器 直饮机流量监控模块
  4.   项目八:通过串口,监测实时流量与累计流量(有流量时LED亮)
  5.   实验接线:Uno D2接流量传感器OUT,LED接D13
  6. */

  7. byte statusLed    = 13;
  8. byte sensorInterrupt = 0;  // 0 = digital pin 2
  9. byte sensorPin       = 2;

  10. // 霍尔效应流量传感器每秒输出大约 7.5 个脉冲
  11. // 升/分钟的流量。
  12. float calibrationFactor = 7.5; //这个系数(及后面算法)仅为参考演示值,实际使用请自行专业校准

  13. volatile byte pulseCount;

  14. float flowRate;
  15. unsigned int flowMilliLitres;
  16. unsigned long totalMilliLitres;

  17. unsigned long oldTime;

  18. void setup() {
  19.   // 初始化串行连接以向主机报告值
  20.   Serial.begin(38400);

  21.   // 将状态 LED 设置为输出
  22.   pinMode(statusLed, OUTPUT);
  23.   digitalWrite(statusLed, LOW);  // 我们连接了一个高电平有效的 LED

  24.   pinMode(sensorPin, INPUT);
  25.   digitalWrite(sensorPin, HIGH); // 上拉霍尔效应流量传感器输出端为高电平

  26.   pulseCount        = 0;
  27.   flowRate          = 0.0;
  28.   flowMilliLitres   = 0;
  29.   totalMilliLitres  = 0;
  30.   oldTime           = 0;

  31.   // 霍尔效应传感器连接到使用中断 0 的引脚 2。
  32.   // 配置为在下降状态变化时触发(从 HIGH 转换
  33.   // 状态到 LOW 状态)
  34.   attachInterrupt(sensorInterrupt, pulseCounter, FALLING);
  35.   Serial.println("流量计准备就绪OK");
  36. }

  37. void loop() {
  38.   if ((millis() - oldTime) > 1000)   // 每秒只处理一次计数器
  39.   {
  40.     // 在计算流量并将值发送给主机时禁用中断
  41.     detachInterrupt(sensorInterrupt);

  42.     // 因为这个循环可能不会在 1 秒的间隔内完成,我们计算
  43.     // 自上次执行和使用以来经过的毫秒数
  44.     // 缩放输出。 我们还应用了校准因子来缩放输出
  45.     // 基于每测量单位每秒的脉冲数(升/分钟
  46.     // 这种情况)来自传感器。
  47.     flowRate = ((1000.0 / (millis() - oldTime)) * pulseCount) / calibrationFactor;

  48.     // 请注意执行此处理过程的时间。 请注意,因为我们已经
  49.     // 禁用中断millis() 函数实际上不会正确递增
  50.     // 此时,它仍然会返回之前设置的值
  51.     // 中断消失了。
  52.     oldTime = millis();

  53.     // 将以升/分钟为单位的流速除以 60 以确定有多少升
  54.     // 在这 1 秒的间隔内通过传感器,然后乘以 1000 到
  55.     // 转换为毫升。
  56.     flowMilliLitres = (flowRate / 60) * 1000;

  57.     // 将这一秒传递的毫升数加到累计总数中
  58.     totalMilliLitres += flowMilliLitres;

  59.     unsigned int frac;

  60.     // 以升/分钟为单位打印这一秒的流量
  61.     Serial.print("流速: ");
  62.     Serial.print(int(flowRate));  // 打印变量的整数部分
  63.     Serial.print(".");             // 打印小数点
  64.     //确定小数部分。 10 乘数给我们 1 个小数位。
  65.     frac = (flowRate - int(flowRate)) * 10;
  66.     Serial.print(frac, DEC) ;      // 打印变量的小数部分
  67.     Serial.print("升/分钟");
  68.     // 打印这一秒流过的毫升数
  69.     Serial.print("  当前流量: ");             // 输出分隔符
  70.     Serial.print(flowMilliLitres);
  71.     Serial.print("毫升/秒");

  72.     // 打印自启动以来流过的累计升数
  73.     Serial.print("  累计流量: ");             // 输出分隔符
  74.     Serial.print(totalMilliLitres);
  75.     Serial.println("毫升");

  76.     if (flowMilliLitres > 10) {
  77.       digitalWrite(statusLed, HIGH); //有流量时点亮LED灯,否则熄灭
  78.     }

  79.     if (flowMilliLitres < 10) {
  80.       digitalWrite(statusLed, LOW);
  81.     }

  82.     //重置脉冲计数器,以便我们可以再次开始递增
  83.     pulseCount = 0;

  84.     //现在我们已完成发送输出,再次启用中断
  85.     attachInterrupt(sensorInterrupt, pulseCounter, FALLING);
  86.   }
  87. }

  88. // 中断服务程序
  89. void pulseCounter() {
  90.   // 增加脉冲计数器
  91.   pulseCount++;
  92. }
复制代码


 楼主| 发表于 2021-7-10 17:10 来自手机 | 显示全部楼层
eagler8 发表于 2021-7-10 15:08
可以的

不好意思一直麻烦你,才跑到这里来的。
发表于 2021-7-10 17:34 | 显示全部楼层
oanger 发表于 2021-7-10 17:10
不好意思一直麻烦你,才跑到这里来的。

不客气
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-29 03:38 , Processed in 0.073849 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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