arduino实验组合技——光敏电阻控制LED加数码管显示

时间:2024-05-18 15:27:32

实现目标效果:光敏电阻控制LED的亮度 同时数码管显示光敏电阻的数值

实现原理:获得光敏电阻阻值后传入开发板 在串口通信中显示光敏电阻阻值同时将数值传入数码管 将数值大小写入6引脚就能控制LED的亮度

过程:一、在编写过程中发现数码管会闪烁 则取消延时并在大函数中多循环几次即可解决   二、在编写过程中发现数码管每换一个数就会灭一次然后再亮 则在主函数中取消延时即可解决 三、又发现1引脚不正常 检查了所有的代码发现没有问题 又单独测试了1引脚发现1引脚出现未知错误(新手勿喷) 那就把1引脚换成13引脚解决 四、发现光敏电阻经过程序的洗礼后并不灵敏 原因是本人太菜不会多线程 这个问题以后解决 五、发现接上13引脚时也会微微亮 芯片内部结构不太懂 不知道为什么13引脚会有微微的电平

连线:数码管和上一次的相同 把1引脚改成13引脚即可 LED灯连6引脚 光敏电阻Vcc连接5V引脚 GND连接GND OUT连接A0 其中 LED连接一个阻值为100欧姆的电阻 光敏电阻连接一个阻值为10K欧姆的电阻 最好不要用同一个GND 可能会提升最底电平导致实现出现小问题

图片:arduino实验组合技——光敏电阻控制LED加数码管显示arduino实验组合技——光敏电阻控制LED加数码管显示arduino实验组合技——光敏电阻控制LED加数码管显示

下面提供了代码 和上一次写的相同的数码管显示数字的逻辑 但是最大的缺陷就是没有使用多线程 勉强能用就是反应有点迟钝

#define open(num) digitalWrite(num,LOW)
#define close(num) digitalWrite(num,HIGH)
int e=13;
int d=2;
int dp=3;
int c=4;
int g=5;
int b=7;
int BT3=8;
int BT2=9;
int f=10;
int a=11;
int BT1=12;
int LED=13;///LED变成高电平时会亮
void digital_1()
{
	open(b);
	open(c);
	//delay(10);
}
void digital_2()
{
	open(a);
	open(b);
	open(g);
	open(e);
	open(d);
	//delay(10);
}
void digital_3()
{
	open(a);
	open(b);
	open(g);
	open(c);
	open(d);
	//delay(10);
}
void digital_4()
{
	open(b);
	open(f);
	open(g);
	open(c);
	//delay(10);
}
void digital_5()
{
	open(a);
	open(f);
	open(g);
	open(c);
	open(d);
	//delay(10);
}
void digital_6()
{
	open(a);
	open(f);
	open(g);
	open(e);
	open(c);
	open(d);
	//delay(10);
}
void digital_7()
{
	open(a);
	open(b);
	open(c);
	//delay(10);
}
void digital_8()
{
	open(a);
	open(f);
	open(g);
	open(e);
	open(c);
	open(d);
	open(b);
	//delay(10);
}
void digital_9()
{
	open(a);
	open(f);
	open(g);
	open(c);
	open(d);
	open(b);
	//delay(10);
}
void digital_0()
{
	open(a);
	open(f);
	open(e);
	open(c);
	open(d);
	open(b);
	//delay(10);
}
void resetup()
{
	int i;
	for(i=1;i<=13;i++)
	{
                if(i!=6)
		digitalWrite(i,HIGH);
	}
	open(8);
	open(9);
	open(12);
}
void digital_up(int num)
{
        int num1=num/100;
	int num2=num/10%10;
	int num3=num%10;
	int i=100;
        Serial.println(num,DEC);
	while(i--)
	{
                analogWrite(6,num/4);
                switch(num1)
		{
			case 0:digital_0();break;
			case 1:digital_1();break;
			case 2:digital_2();break;
			case 3:digital_3();break;
			case 4:digital_4();break;
			case 5:digital_5();break;
			case 6:digital_6();break;
			case 7:digital_7();break;
			case 8:digital_8();break;
			case 9:digital_9();
		}
		close(BT1);
                delay(2);
		resetup();
		open(BT1);
		switch(num2)
		{
			case 0:digital_0();break;
			case 1:digital_1();break;
			case 2:digital_2();break;
			case 3:digital_3();break;
			case 4:digital_4();break;
			case 5:digital_5();break;
			case 6:digital_6();break;
			case 7:digital_7();break;
			case 8:digital_8();break;
			case 9:digital_9();
		}
		close(BT2);
                delay(2);
		resetup();
		open(BT2);
		switch(num3)
		{
			case 0:digital_0();break;
			case 1:digital_1();break;
			case 2:digital_2();break;
			case 3:digital_3();break;
			case 4:digital_4();break;
			case 5:digital_5();break;
			case 6:digital_6();break;
			case 7:digital_7();break;
			case 8:digital_8();break;
			case 9:digital_9();
		}
		close(BT3);
                delay(2);
		resetup();
		open(BT3);
	}
        open(BT1);
	open(BT2);
	open(BT3);
	return;
}
void setup(){
  pinMode(6,OUTPUT);
  Serial.begin(9600);
  unsigned char i;
	for(i=1;i<=13;i++)
	{
		pinMode(i,OUTPUT);
		digitalWrite(i,HIGH);
	}
	open(8);
	open(9);
	open(12);
}
void loop(){
 int light;
  light=analogRead(A0);
  digital_up(light);
  Serial.println(light,DEC);
}