我有一个带有Arduino Nano的4位7段显示项目,但它没有';行不通
该项目是关于在显示器上显示温度的 电路包含以下内容:我有一个带有Arduino Nano的4位7段显示项目,但它没有';行不通,arduino,sensors,display,segment,Arduino,Sensors,Display,Segment,该项目是关于在显示器上显示温度的 电路包含以下内容: Arduino Nano(AtMega328p) 4位7段显示器(金布莱特CA56-12SRWA) 74HC595N移位寄存器 显示器用4个220欧姆电阻器 DHT11温度和湿度传感器 传感器的1k欧姆电阻器 该方案: #include "DHT.h" #define DHTPIN 7 #define DHTTYPE DHT11 DHT dht(DHTPIN, DHTTYPE); const int latchPin = 5; co
- Arduino Nano(AtMega328p)
- 4位7段显示器(金布莱特CA56-12SRWA)
- 74HC595N移位寄存器
- 显示器用4个220欧姆电阻器
- DHT11温度和湿度传感器
- 传感器的1k欧姆电阻器
#include "DHT.h"
#define DHTPIN 7
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
const int latchPin = 5;
const int dataPin = 6;
const int clockPin = 4;
const int digitPins[4] =
{
A0, A3, A2, A1
};
const byte digit[10] =
{
B01010000, //0
B11010111, //1
B01100100, //2
B01000110, //3
B11000011, //4
B01001010, //5
B01001000, //6
B11010110, //7
B01000000, //8
B01000010 //9
};
int digitBuffer[4] = {0};
int digitScan = 0;
void updateDisp(){
for(byte j = 0; j < 4; j++){
digitalWrite(digitPins[j], LOW);
}
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, B11111111);
digitalWrite(latchPin, HIGH);
delayMicroseconds(100);
digitalWrite(digitPins[digitScan], HIGH);
digitalWrite(latchPin, LOW);
if(digitScan==1){
shiftOut(dataPin, clockPin, MSBFIRST, ~(digit[digitBuffer[digitScan]] |
B01000000));
}
else
{
shiftOut(dataPin, clockPin, MSBFIRST, ~(digit[digitBuffer[digitScan]]));
}
digitalWrite(latchPin, HIGH);
digitScan++;
if(digitScan > 3){digitScan = 0;}
}
void setup() {
Serial.begin(9600);
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
for(int i = 0; i < 4; i++){
pinMode(digitPins[i], OUTPUT);
}
dht.begin();
}
void loop() {
float h = dht.readHumidity();
float t = dht.readTemperature();
float hi = dht.computeHeatIndex(t, h, false);
digitBuffer[3] = int(t)/1000;
digitBuffer[2] = (int(t)%1000)/100;
digitBuffer[0] = (int(t)%100)/10;
digitBuffer[1] = (int(t)%100)%10;
updateDisp();
Serial.println(t);
delay(5);
}
#包括“DHT.h”
#定义DHTPIN 7
#定义DHT类型DHT11
DHT-DHT(DHTPIN,DHTTYPE);
常数int闭锁销=5;
常数int dataPin=6;
常数int时钟引脚=4;
常数int数字管脚[4]=
{
A0、A3、A2、A1
};
常量字节数字[10]=
{
B01010000,//0
B11010111,//1
B01100100,//2
B01000110,//3
B11000011,//4
B01001010,//5
B01001000,//6
B11010110,//7
B01000000,//8
B01000010//9
};
int-digitBuffer[4]={0};
int-digitScan=0;
void updateDisp(){
用于(字节j=0;j<4;j++){
数字写入(数字引脚[j],低);
}
数字写入(锁定销,低电平);
移位器(数据引脚、时钟引脚、MSBFIRST、B11111111);
数字写入(锁定销,高);
延迟微秒(100);
数字写入(数字引脚[digitScan],高);
数字写入(锁定销,低电平);
如果(数字扫描==1){
移位(数据管脚、时钟管脚、MSBFIRST、~(digit[digitBuffer[digitScan]])
B01000000);
}
其他的
{
移位(数据管脚、时钟管脚、MSBFIRST、~(digit[digitBuffer[digitScan]]);
}
数字写入(锁定销,高);
digitScan++;
如果(digitScan>3){digitScan=0;}
}
无效设置(){
Serial.begin(9600);
引脚模式(锁定引脚,输出);
引脚模式(数据引脚,输出);
引脚模式(时钟引脚,输出);
对于(int i=0;i<4;i++){
引脚模式(数字引脚[i],输出);
}
dht.begin();
}
void循环(){
浮动h=dht.read湿度();
浮点数t=dht.readTemperature();
float hi=dht.计算热指数(t,h,false);
数字缓冲区[3]=int(t)/1000;
数字缓冲区[2]=(int(t)%1000)/100;
数字缓冲区[0]=(int(t)%100)/10;
数字缓冲区[1]=(int(t)%100)%10;
updateDisp();
序列号println(t);
延误(5);
}
问题是LED不显示数字,但我测试了二进制,在测试程序中,所有数字都正常工作。几乎每2秒钟,所有LED都会变为f,然后再次点亮。理论上,组件和连接都不会有问题。如果我在某个地方犯了一个大错误,请不要生气,我是初学者。我对电路部分比对编码更感兴趣,我无法解决这个问题。我相信您已经使用了这里的代码
您的系统更新显示太快,因此DHT无法正确处理温度,并最终给出垃圾值
将延迟从5(5毫秒)增加到大约250(250毫秒),您将看到数字。我建议使用2000ms,但我觉得250应该可以用。您也可以使用MAX7219芯片 我可以解决显示没有意义的东西的问题,问题是我必须反转数字的二进制。但开关仍然是一个问题。为了更容易理解,我制作了一个视频:我刚刚注意到了问题所在。要使LED矩阵保持亮起,您需要不断扫描数字。但每隔2秒,DHT传感器会给出一个正确的读数,库会在Read湿度和readTemperature功能中等待。这就是为什么当led熄灭时,1位数字保持点亮,而Arduino上的串行led熄灭。您需要使用定时器中断来编写代码,或者可能使用2个Arduino,1个用于控制led,1个用于从DHT测量。谢谢您的帮助,先生。