1. 程式人生 > >arduino實驗組合技——光敏電阻控制LED加數碼管顯示

arduino實驗組合技——光敏電阻控制LED加數碼管顯示

實現目標效果:光敏電阻控制LED的亮度 同時數碼管顯示光敏電阻的數值

實現原理:獲得光敏電阻阻值後傳入開發板 在串列埠通訊中顯示光敏電阻阻值同時將數值傳入數碼管 將數值大小寫入6引腳就能控制LED的亮度

過程:一、在編寫過程中發現數碼管會閃爍 則取消延時並在大函式中多迴圈幾次即可解決   二、在編寫過程中發現數碼管每換一個數就會滅一次然後再亮 則在主函式中取消延時即可解決 三、又發現1引腳不正常 檢查了所有的程式碼發現沒有問題 又單獨測試了1引腳發現1引腳出現未知錯誤(新手勿噴) 那就把1引腳換成13引腳解決 四、發現光敏電阻經過程式的洗禮後並不靈敏 原因是本人太菜不會多執行緒 這個問題以後解決 五、發現接上13引腳時也會微微亮 晶片內部結構不太懂 不知道為什麼13引腳會有微微的電平

連線:數碼管和上一次的相同 把1引腳改成13引腳即可 LED燈連6引腳 光敏電阻Vcc連線5V引腳 GND連線GND OUT連線A0 其中 LED連線一個阻值為100歐姆的電阻 光敏電阻連線一個阻值為10K歐姆的電阻 最好不要用同一個GND 可能會提升最底電平導致實現出現小問題

圖片:

下面提供了程式碼 和上一次寫的相同的數碼管顯示數字的邏輯 但是最大的缺陷就是沒有使用多執行緒 勉強能用就是反應有點遲鈍

#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);
}