|
可以的
- /*
- 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
- 实验九十一: 1号霍尔水流量传感器 直饮机流量监控模块
- 项目八:通过串口,监测实时流量与累计流量(有流量时LED亮)
- 实验接线:Uno D2接流量传感器OUT,LED接D13
- */
- byte statusLed = 13;
- byte sensorInterrupt = 0; // 0 = digital pin 2
- byte sensorPin = 2;
- // 霍尔效应流量传感器每秒输出大约 7.5 个脉冲
- // 升/分钟的流量。
- float calibrationFactor = 7.5; //这个系数(及后面算法)仅为参考演示值,实际使用请自行专业校准
- volatile byte pulseCount;
- float flowRate;
- unsigned int flowMilliLitres;
- unsigned long totalMilliLitres;
- unsigned long oldTime;
- void setup() {
- // 初始化串行连接以向主机报告值
- Serial.begin(38400);
- // 将状态 LED 设置为输出
- pinMode(statusLed, OUTPUT);
- digitalWrite(statusLed, LOW); // 我们连接了一个高电平有效的 LED
- pinMode(sensorPin, INPUT);
- digitalWrite(sensorPin, HIGH); // 上拉霍尔效应流量传感器输出端为高电平
- pulseCount = 0;
- flowRate = 0.0;
- flowMilliLitres = 0;
- totalMilliLitres = 0;
- oldTime = 0;
- // 霍尔效应传感器连接到使用中断 0 的引脚 2。
- // 配置为在下降状态变化时触发(从 HIGH 转换
- // 状态到 LOW 状态)
- attachInterrupt(sensorInterrupt, pulseCounter, FALLING);
- Serial.println("流量计准备就绪OK");
- }
- void loop() {
- if ((millis() - oldTime) > 1000) // 每秒只处理一次计数器
- {
- // 在计算流量并将值发送给主机时禁用中断
- detachInterrupt(sensorInterrupt);
- // 因为这个循环可能不会在 1 秒的间隔内完成,我们计算
- // 自上次执行和使用以来经过的毫秒数
- // 缩放输出。 我们还应用了校准因子来缩放输出
- // 基于每测量单位每秒的脉冲数(升/分钟
- // 这种情况)来自传感器。
- flowRate = ((1000.0 / (millis() - oldTime)) * pulseCount) / calibrationFactor;
- // 请注意执行此处理过程的时间。 请注意,因为我们已经
- // 禁用中断millis() 函数实际上不会正确递增
- // 此时,它仍然会返回之前设置的值
- // 中断消失了。
- oldTime = millis();
- // 将以升/分钟为单位的流速除以 60 以确定有多少升
- // 在这 1 秒的间隔内通过传感器,然后乘以 1000 到
- // 转换为毫升。
- flowMilliLitres = (flowRate / 60) * 1000;
- // 将这一秒传递的毫升数加到累计总数中
- totalMilliLitres += flowMilliLitres;
- unsigned int frac;
- // 以升/分钟为单位打印这一秒的流量
- Serial.print("流速: ");
- Serial.print(int(flowRate)); // 打印变量的整数部分
- Serial.print("."); // 打印小数点
- //确定小数部分。 10 乘数给我们 1 个小数位。
- frac = (flowRate - int(flowRate)) * 10;
- Serial.print(frac, DEC) ; // 打印变量的小数部分
- Serial.print("升/分钟");
- // 打印这一秒流过的毫升数
- Serial.print(" 当前流量: "); // 输出分隔符
- Serial.print(flowMilliLitres);
- Serial.print("毫升/秒");
- // 打印自启动以来流过的累计升数
- Serial.print(" 累计流量: "); // 输出分隔符
- Serial.print(totalMilliLitres);
- Serial.println("毫升");
- if (flowMilliLitres > 10) {
- digitalWrite(statusLed, HIGH); //有流量时点亮LED灯,否则熄灭
- }
- if (flowMilliLitres < 10) {
- digitalWrite(statusLed, LOW);
- }
- //重置脉冲计数器,以便我们可以再次开始递增
- pulseCount = 0;
- //现在我们已完成发送输出,再次启用中断
- attachInterrupt(sensorInterrupt, pulseCounter, FALLING);
- }
- }
- // 中断服务程序
- void pulseCounter() {
- // 增加脉冲计数器
- pulseCount++;
- }
复制代码
|
|