首页 > 其他分享 >基于Arduino的数码管显示变阻器模拟量读取值

基于Arduino的数码管显示变阻器模拟量读取值

时间:2024-11-06 23:15:40浏览次数:3  
标签:引脚 digitalWrite Arduino number else 数码管 变阻器

题目要求

采集变阻器模拟量信号在数码管中显示,要求有二位小数

电路连接

  1. 数码管连接:

    • 数码管的七个段(a-g)分别连接到Arduino的引脚 2 到 8。
    • 数码管的小数点(dp)连接到Arduino的引脚9。
    • 数码管的4个控制引脚连接到Arduino的引脚10到11。
  2. 变阻器连接:

    • 变阻器的模拟输出引脚连接到Arduino的A0引脚,用来读取模拟值。

以下是控制数码管显示和读取温度传感器的完整代码:

#define a 2        // 数码管的a引脚连接到Arduino的第2号引脚
#define b 3        // 数码管的b引脚连接到Arduino的第3号引脚
#define c 4        // 数码管的c引脚连接到Arduino的第4号引脚
#define d 5        // 数码管的d引脚连接到Arduino的第5号引脚
#define e 6        // 数码管的e引脚连接到Arduino的第6号引脚
#define f 7        // 数码管的f引脚连接到Arduino的第7号引脚
#define g 8        // 数码管的g引脚连接到Arduino的第8号引脚
#define dp 9       // 数码管的小数点引脚连接到Arduino的第9号引脚

// 数码管的4个控制引脚,用来选择显示哪一位数字
const byte DIGIT_PINS[4] = {10, 11, 12, 13};

int a0, a1, a2, a3; // 用于存储分解后的显示数字的各个位(千位、百位、十位、个位)

void setup() {
  Serial.begin(9600);  // 初始化串口通讯,波特率为9600
  // 设置数字引脚2到13为输出模式
  for (int i = 2; i <= 13; i++) {
    pinMode(i, OUTPUT); 
  }
}

void loop() {
  int sensorValue = analogRead(A0); // 读取A0引脚的模拟值
  float read_value = mapFloat(sensorValue, 0, 1023, 0.0, 99.99); // 将模拟值映射为0.00到99.99之间的浮动数值
  int read_value_display = (int)(read_value * 100); // 将浮动数值转换为整数,保留两位小数
  
  Serial.println(read_value_display); // 打印读取到的整数值到串口

  // 将整数分解为千位、百位、十位和个位的值
  a0 = read_value_display / 1000; // 千位
  a1 = read_value_display / 100 % 10; // 百位
  a2 = read_value_display / 10 % 10;  // 十位
  a3 = read_value_display % 10;       // 个位

  // 如果显示值小于100(即没有千位),只显示百位、十位、个位
  if (read_value_display / 100 < 10) {
    displayNumber(a1, 0, 0); // 显示百位
    displayNumber(a2, 1, 1); // 显示十位
    displayNumber(a3, 1, 2); // 显示个位
  }
  // 如果显示值大于或等于100(即有千位),显示所有四位数字
  else if (read_value_display / 100 >= 10) {
    displayNumber(a0, 1, 0); // 显示千位
    displayNumber(a1, 0, 1); // 显示百位
    displayNumber(a2, 1, 2); // 显示十位
    displayNumber(a3, 1, 3); // 显示个位
  }
}

// 自定义的map函数,用来进行浮动数值的线性插值
float mapFloat(int x, int in_min, int in_max, float out_min, float out_max) {
  return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}

// 控制显示数字的函数
void displayNumber(int number, int bp, int pins) {
  // 关闭其他数码管(将所有数码管引脚设为LOW)
  for (byte j = 0; j < 4; j++) {
    digitalWrite(DIGIT_PINS[j], LOW);
  }

  // 点亮当前选中的数码管(设置指定的数码管引脚为HIGH)
  digitalWrite(DIGIT_PINS[pins], HIGH);

  // 根据输入的数字(0到9)控制数码管的显示
  if (number == 0) {
    digitalWrite(a, 0); 
    digitalWrite(b, 0); 
    digitalWrite(c, 0); 
    digitalWrite(d, 0); 
    digitalWrite(e, 0); 
    digitalWrite(f, 0); 
    digitalWrite(g, 1); // 显示0
  } else if (number == 1) {
    digitalWrite(a, 1); 
    digitalWrite(b, 0); 
    digitalWrite(c, 0); 
    digitalWrite(d, 1); 
    digitalWrite(e, 1); 
    digitalWrite(f, 1); 
    digitalWrite(g, 1); // 显示1
  } else if (number == 2) {
    digitalWrite(a, 0); 
    digitalWrite(b, 0); 
    digitalWrite(c, 1); 
    digitalWrite(d, 0); 
    digitalWrite(e, 0); 
    digitalWrite(f, 1); 
    digitalWrite(g, 0); // 显示2
  } else if (number == 3) {
    digitalWrite(a, 0); 
    digitalWrite(b, 0); 
    digitalWrite(c, 0); 
    digitalWrite(d, 0); 
    digitalWrite(e, 1); 
    digitalWrite(f, 1); 
    digitalWrite(g, 0); // 显示3
  } else if (number == 4) {
    digitalWrite(a, 1); 
    digitalWrite(b, 0); 
    digitalWrite(c, 0); 
    digitalWrite(d, 1); 
    digitalWrite(e, 1); 
    digitalWrite(f, 0); 
    digitalWrite(g, 0); // 显示4
  } else if (number == 5) {
    digitalWrite(a, 0); 
    digitalWrite(b, 1); 
    digitalWrite(c, 0); 
    digitalWrite(d, 0); 
    digitalWrite(e, 1); 
    digitalWrite(f, 0); 
    digitalWrite(g, 0); // 显示5
  } else if (number == 6) {
    digitalWrite(a, 0); 
    digitalWrite(b, 1); 
    digitalWrite(c, 0); 
    digitalWrite(d, 0); 
    digitalWrite(e, 0); 
    digitalWrite(f, 0); 
    digitalWrite(g, 0); // 显示6
  } else if (number == 7) {
    digitalWrite(a, 0); 
    digitalWrite(b, 0); 
    digitalWrite(c, 0); 
    digitalWrite(d, 1); 
    digitalWrite(e, 1); 
    digitalWrite(f, 1); 
    digitalWrite(g, 1); // 显示7
  } else if (number == 8) {
    digitalWrite(a, 0); 
    digitalWrite(b, 0); 
    digitalWrite(c, 0); 
    digitalWrite(d, 0); 
    digitalWrite(e, 0); 
    digitalWrite(f, 0); 
    digitalWrite(g, 0); // 显示8
  } else if (number == 9) {
    digitalWrite(a, 0); 
    digitalWrite(b, 0); 
    digitalWrite(c, 0); 
    digitalWrite(d, 1); 
    digitalWrite(e, 1); 
    digitalWrite(f, 0); 
    digitalWrite(g, 0); // 显示9
  }

  // 控制小数点的显示
  digitalWrite(dp, bp);

  delay(5); // 延时5ms,避免显示跳动
}

标签:引脚,digitalWrite,Arduino,number,else,数码管,变阻器
From: https://blog.csdn.net/weixin_45345979/article/details/143581719

相关文章

  • Proteus中数码管动态扫描显示不全(已解决)
    前言我是直接把以前写的51数码管程序复制过来的,当时看的郭天祥的视频,先送段选,消隐后送位选,最后来个1ms的延时。代码在Proteus中数码管静态是可以的,动态显示出了问题——显示不全,我在网上搜的说是Proteus的Bug,需要先送位选再送段选,我试了试也不行。最后在我多次实验下......
  • 使用platformio平台Arduino开发ESP32-C2
    使用platformio平台Arduino开发ESP32-C2有两种方法,推荐方法二。方法一:安装vscode后安装platformio插件(参考:YourGatewaytoEmbeddedSoftwareDevelopmentExcellence·PlatformIO安装时,需要可靠的网络链接。使用platformio创建一个esp32-c3项目(platformio平台默认......
  • 使用Arduino IDE配置Atmega328P
    引言单片机(MicrocontrollerUnit,MCU)是一种将中央处理单元(CPU)、存储器、输入输出接口等集成在一块芯片上的微型计算机系统。本教程旨在帮助初学者了解单片机的基本概念,并通过实际操作来掌握单片机编程的基础知识。第一部分:单片机基础概念什么是单片机?单片机是嵌入式系统......
  • 抗干扰数显LED显示屏驱动芯片/数码管驱动控制器-VK1628 SOP28
    VK1628是一种带键盘扫描接口的数码管或点阵LED驱动控制专用芯片,内部集成有3线串行接口、数据锁存器、LED驱动、键盘扫描等电路。SEG脚接LED阳极,GRID脚接LED阴极,可支持13SEGx4GRID、12SEGx5GRID、11SEGx6GRID、10SEGx7GRID的点阵LED显示面板,最大支持10x2按键。适用于要求可......
  • 【花雕学编程】Arduino RTOS 之时间片轮转调度
    Arduino是一个开放源码的电子原型平台,它可以让你用简单的硬件和软件来创建各种互动的项目。Arduino的核心是一个微控制器板,它可以通过一系列的引脚来连接各种传感器、执行器、显示器等外部设备。Arduino的编程是基于C/C++语言的,你可以使用ArduinoIDE(集成开发环境)来编写、......
  • 【STM32 Blue Pill编程实例】-4位7段数码管使用
    4位7段数码管使用文章目录4位7段数码管使用1、7段数码介绍2、硬件准备与接线3、模块配置4、代码实现在本文中,我们将介绍如何将STM32BluePill开发板与4位7段数码管连接,并在STM32CubeIDE中对其进行编程。在文章中首先将介绍4位7段数码管及其与......
  • 基于51单片机温湿度采集数码管手机app显示+源代码程序+proteus仿真+dht11温湿度传感器
    一、设计简介本项目是简单的物联网(IoT)应用,使用51单片机STC89C52与温湿度传感器DHT11相结合,测量温湿度数据显示在八位数码管,同时通过WiFi模块ESP8266(ESP-01S)将测得的温湿度数据发送到手机APP上,而手机APP则使用AppInventor进行开发。二、功能设计1、数码管实时显示当前温湿度......
  • 如何选择合适的变阻器?
    变阻器是一种可以改变电阻值的电子元件,广泛应用于各种电子设备和电路中。选择合适的变阻器对于保证设备正常工作和提高性能至关重要。以下是一些建议,可以帮助您选择合适的变阻器:确定应用场景:首先,您需要了解变阻器将用于哪种类型的设备或电路。不同类型的变阻器具有不同的特性和......
  • 内置RC振荡器/抗干扰能力强VK1668 SOP24数码管驱动控制器/LED驱动器原厂技术支持
    产品品牌:永嘉微电/VINKA产品型号:VK1668封装形式:SOP24概述VK1668是一种带键盘扫描接口的数码管或点阵LED驱动控制专用芯片,内部集成有3线串行接口、数据锁存器、LED驱动、键盘扫描等电路。SEG脚接LED阳极,GRID脚接LED阴极,可支持13SEGx4GRID、12SEGx5GRID、11SEGx6GRID、10S......
  • 【花雕学编程】Arduino动手做(237)---使用 ESP32 V1 Rev1 自身的热点来创建一个简易的 H
    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来——小小的......