임 Arduino와 C로 내 기술을 향상시키기위한 재미있는 프로젝트 (적어도 나를 위해) 작업. 8ch 릴레이 보드와 Arduino Uno를 사용하여 내 크리스마스 트리를 간단한 이퀄라이저로 바꿨습니다.쓰기 대신 Arduino 디지털 업데이트 핀?
내가 겪고있는 문제는 이미 디지털로 점등되어있는 핀에 HIGH로 쓸 때마다 스트로브 효과가 깜박입니다. 이 효과는 루프를보다 빠르고 정확하게 나타낼 수 있습니다. 나는 나의 문제가 나의 오래 끌린 코드라고 생각한다. 나는 항상 HIGH 또는 LOW를 모두 쓰는 것이 아니라 업데이트가 필요한 핀을 업데이트하는 것을 선호한다. 디지털 업데이트가 있습니까? 내 자신의 업데이트 기능에서 활용할 수있는 핀의 상태를 기억하거나 검사하는 기존 기능이 있습니까? 아니면 단순히 각 채널에 변수를 만들고 활용해야합니까?
int DO = 2; //Pin for Digital Output - DO
int DA = A0; // Pin for Analog Output - AO
int mult = 5;
int threshold1 = 1 * mult; //Set minimum threshold for LED lit
int threshold2 = 2 * mult; //Set minimum threshold for LED lit
int threshold3 = 3 * mult; //Set minimum threshold for LED lit
int threshold4 = 4 * mult; //Set minimum threshold for LED lit
int threshold5 = 5 * mult; //Set minimum threshold for LED lit
int threshold6 = 6 * mult; //Set minimum threshold for LED lit
int threshold7 = 7 * mult; //Set minimum threshold for LED lit
int threshold8 = 8 * mult; //Set minimum threshold for LED lit
int threshold9 = 9 * mult; //Set minimum threshold for LED lit
int sensorvalue = 0;
//pinout
int white1 = 3;
int white2 = 4;
int white3 = 5;
int white4 = 6;
int blue1 = 7;
int blue2 = 8;
int blue3 = 9;
int red1 = 10;
void loop() {
sensorvalue = ReadSens_and_Condition(); //Read the analog value
//Troubleshooting
//sensorvalue = 3;
Serial.print("Analog: ");
Serial.print(sensorvalue); //Print the analog value
Serial.print(" ");
Serial.print("Threshold: ");
Serial.print(threshold1); //Print the analog value
Serial.print(" ");
Serial.print(threshold2); //Print the analog value
Serial.print(" ");
Serial.print(threshold3); //Print the analog value
Serial.print(" ");
Serial.print(threshold4); //Print the analog value
Serial.print(" ");
Serial.print(threshold5); //Print the analog value
Serial.print(" ");
Serial.print(threshold6); //Print the analog value
Serial.print(" ");
Serial.print(threshold7); //Print the analog value
Serial.print(" ");
Serial.print(threshold8); //Print the analog value
Serial.print(" ");
Serial.print(threshold9); //Print the analog value
Serial.print(" ");
Serial.print('\n');
Serial.print('\n');
//mode 3 is best so far
int mode = 3;
int ReadSens_and_Condition(){
int i;
int sval = 0;
for (i = 0; i < 50; i++){
sval = sval + analogRead(DA); // sensor on analog pin 0
}
sval = sval/50; // average
sval = sval/4; // scale
return sval;
}
void setup() {
Serial.begin(9600);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
}
//equalizer
if(mode == 3){
//delay
int pause = 5;
if(sensorvalue >= threshold9){
digitalWrite(white3, HIGH);
digitalWrite(blue3, HIGH);
digitalWrite(white2, HIGH);
digitalWrite(blue2, HIGH);
digitalWrite(white1, HIGH);
digitalWrite(blue1, HIGH);
digitalWrite(white4, HIGH);
digitalWrite(red1, HIGH);
delay(pause);
}
else if(sensorvalue >= threshold8){
digitalWrite(white3, HIGH);
digitalWrite(blue3, HIGH);
digitalWrite(white2, HIGH);
digitalWrite(blue2, HIGH);
digitalWrite(white1, HIGH);
digitalWrite(blue1, HIGH);
delay(pause);
digitalWrite(white4, LOW);
digitalWrite(red1, LOW);
}
else if(sensorvalue >= threshold6){
digitalWrite(white2, HIGH);
digitalWrite(blue2, HIGH);
digitalWrite(white1, HIGH);
digitalWrite(blue1, HIGH);
delay(pause);
digitalWrite(white3, LOW);
digitalWrite(blue3, LOW);
digitalWrite(white4, LOW);
digitalWrite(red1, LOW);
}
else if(sensorvalue >= threshold4){
digitalWrite(white1, HIGH);
digitalWrite(blue1, HIGH);
delay(pause);
digitalWrite(white2, LOW);
digitalWrite(blue2, LOW);
digitalWrite(white3, LOW);
digitalWrite(blue3, LOW);
digitalWrite(white4, LOW);
digitalWrite(red1, LOW);
}
else if(sensorvalue >= threshold2){
digitalWrite(white1, LOW);
digitalWrite(white2, LOW);
digitalWrite(white3, LOW);
digitalWrite(white4, LOW);
digitalWrite(blue1, LOW);
digitalWrite(blue2, LOW);
digitalWrite(blue3, LOW);
digitalWrite(red1, LOW);
delay(pause);
}
else {
digitalWrite(white1, LOW);
digitalWrite(white2, LOW);
digitalWrite(white3, LOW);
digitalWrite(white4, LOW);
digitalWrite(blue1, LOW);
digitalWrite(blue2, LOW);
digitalWrite(blue3, LOW);
digitalWrite(red1, LOW);
delay(pause);
}
}
}
이러한 구성 요소의 작동 방식에 대한 훌륭한 설명에 감사드립니다. 나는 Atmel이 출력이 높고 고장이 아니라는 것을 알았을 것이라고 생각했지만 여전히 스트로브를 계속 보았다. –
나는 결국이 사실을 알아 냈습니다. 나는 실제로 포스트를 업데이트하기 위해 돌아오고 있었다. 당신이 올바른지. 그것은 아날로그 신호의 잡음이었습니다. 나는 타이밍과 딜레이를 조금씩했는데 모두 잘했다. 특별한 것은 없지만 나에게 재미있는 학습 경험 : http://youtu.be/jkI-5WdBZIM?list=UUFUY0-QPkLLdw_7Vr6ERNFQ –
호기심에서, 내 ReadSens_and_Condition() 함수의 for 문이 얼마나 빠르는지 아십니까? 달릴 필요가 있니? 그것이 없으면 분명히 0이 아니었을지라도 0 값을 많이 읽었습니다. 샘플 수를 늘리면 기능이 느려지는 것 같습니다. 그럴까요? –