BASIC4MCU | 질문게시판 | 사운드센서 값을 이용한 도트매트릭스 제어 코드 질문드립니다.
페이지 정보
작성자 맛있는전복죽 작성일2021-06-05 17:15 조회9,694회 댓글4건본문
#include <LedControl.h>
LedControl dot = LedControl(12,11,10,1);
byte levels[9][8] = {
{B00010000,
B00110000,
B00010000,
B00010000,
B00010000,
B00010000,
B00010000,
B00111000},
{B00111000,
B01000100,
B00000100,
B00000100,
B00001000,
B00010000,
B00100000,
B01111100},
{B00111000,
B01000100,
B00000100,
B00011000,
B00000100,
B00000100,
B01000100,
B00111000},
{B00000100,
B00001100,
B00010100,
B00100100,
B01000100,
B01111100,
B00000100,
B00000100},
{B01111100,
B01000000,
B01000000,
B01111000,
B00000100,
B00000100,
B01000100,
B00111000},
{B00111000,
B01000100,
B01000000,
B01111000,
B01000100,
B01000100,
B01000100,
B00111000},
{B01111100,
B00000100,
B00000100,
B00001000,
B00010000,
B00100000,
B00100000,
B00100000},
{B00111000,
B01000100,
B01000100,
B00111000,
B01000100,
B01000100,
B01000100,
B00111000},
{B00111000,
B01000100,
B01000100,
B01000100,
B00111100,
B00000100,
B01000100,
B00111000}
};
#define POWER 7
#define BUTTON 8
#define SOUND analogRead(A0)
unsigned long cnt=0;
boolean sts=false;
int LEVEL = 0;
int max0 = 0;
void setup() {
dot.shutdown(0,false);
dot.setIntensity(0,7);
dot.clearDisplay(0);
dot.setLed(0,0,0,true);
pinMode(BUTTON, INPUT);
pinMode(POWER, OUTPUT);
Serial.begin(9600);
}
void loop() {
if(digitalRead(BUTTON) == HIGH && cnt==0){
sts=!sts;
cnt=millis();
}
else if(cnt > 0 && millis() > cnt + 200){
cnt = 0;
}
digitalWrite(POWER, sts);
Serial.println(digitalRead(POWER));
while(digitalRead(POWER) == HIGH && digitalRead(BUTTON) == LOW){
if(SOUND < 50){
LEVEL = 1;
Serial.println(SOUND);
Serial.println(LEVEL);
Serial.println(max0);
delay(200);
for(int i = 0;i < 8; i++){
dot.setRow(0, i, levels[max0][i]);
}
}
else if(50 <= SOUND < 100){
LEVEL = 2;
if(max0 < LEVEL){
max0 = LEVEL - 1;
Serial.println(SOUND);
Serial.println(LEVEL);
Serial.println(max0);
delay(200);
for(int i = 0;i < 8; i++){
dot.setRow(0, i, levels[max0][i]);
}
}
}
else if(100 <= SOUND < 150){
LEVEL = 3;
if(max0 < LEVEL){
max0 = LEVEL - 1;
Serial.println(SOUND);
Serial.println(LEVEL);
Serial.println(max0);
delay(200);
for(int i = 0;i < 8; i++){
dot.setRow(0, i, levels[max0][i]);
}
}
}
else if(150 <= SOUND < 200){
LEVEL = 4;
if(max0 < LEVEL){
max0 = LEVEL - 1;
Serial.println(SOUND);
Serial.println(LEVEL);
Serial.println(max0);
delay(200);
for(int i = 0;i < 8; i++){
dot.setRow(0, i, levels[max0][i]);
}
}
}
else if(200 <= SOUND < 250){
LEVEL = 5;
if(max0 < LEVEL){
max0 = LEVEL - 1;
Serial.println(SOUND);
Serial.println(LEVEL);
Serial.println(max0);
delay(200);
for(int i = 0;i < 8; i++){
dot.setRow(0, i, levels[max0][i]);
}
}
}
else if(250 <= SOUND < 300){
LEVEL = 6;
if(max0 < LEVEL){
max0 = LEVEL - 1;
Serial.println(SOUND);
Serial.println(LEVEL);
Serial.println(max0);
delay(200);
for(int i = 0;i < 8; i++){
dot.setRow(0, i, levels[max0][i]);
}
}
}
else if(300 <= SOUND < 350){
LEVEL = 7;
if(max0 < LEVEL){
max0 = LEVEL - 1;
Serial.println(SOUND);
Serial.println(LEVEL);
Serial.println(max0);
delay(200);
for(int i = 0;i < 8; i++){
dot.setRow(0, i, levels[max0][i]);
}
}
}
else if(350 <= SOUND < 400){
LEVEL = 8;
if(max0 < LEVEL){
max0 = LEVEL - 1;
Serial.println(SOUND);
Serial.println(LEVEL);
Serial.println(max0);
delay(200);
for(int i = 0;i < 8; i++){
dot.setRow(0, i, levels[max0][i]);
}
}
}
else if(400 <= SOUND < 450){
LEVEL = 9;
if(max0 < LEVEL){
max0 = LEVEL - 1;
Serial.println(SOUND);
Serial.println(LEVEL);
Serial.println(max0);
delay(200);
for(int i = 0;i < 8; i++){
dot.setRow(0, i, levels[max0][i]);
}
}
}
}
}
버튼을 한번 누르면 on상태가 되어서 프로그램을 실행하는 방식입니다
사운드센서의 아날로그 값은 시리얼 통신으로 체크해봤을 때
1000까지도 나옵니다 근데 while문 안에 여러 if문의 조건이
아날로그 값 450까지를 각 50마다 레벨로 변환해서
레벨에 해당하는 값을 도트매트릭스로 표시하려고하는데요
아날로그 값은 정상적으로 시리얼창에 표시가 되는데
그로인해 바뀌어야할 LEVEL 값이 2까지밖에 올라가질 않습니다
그로인해서 당연히 도트매트릭스를 제어할때 쓰는 변수인 max0 값도 고정되어있습니다
그리고 근본적으로 코드를 딱히 건드리지 않았는데 켜고 끌때마다 도트매트릭스에 숫자가 표시될때도 있고
안나올때도 있습니다 (거의 안나오긴합니다) 뭐가 문제인지 알 수 있을까요??
댓글 4
조회수 9,694master님의 댓글
master 작성일
if(50 <=SOUND < 100)
이런 조건식은 산수책에서는 가능하지만 c언어에서는 불가능합니다.
if((50 <=SOUND) && (SOUND < 100))
이런식으로 구문을 나누어서 작성해야 합니다.
맛있는전복죽님의 댓글
맛있는전복죽 작성일
레벨 나누기가 됩니다! 감사합니다
그런데 추가로 제 도트매트릭스가 맨 윗줄만 나올때가 있고 8줄 전부 나올때가 있습니다 왜이럴까요??
master님의 댓글
master 작성일
#include <LedControl.h>
LedControl dot=LedControl(12,11,10,1);
//
byte levels[9][8]={
{B00010000,B00110000,B00010000,B00010000,B00010000,B00010000,B00010000,B00111000},
{B00111000,B01000100,B00000100,B00000100,B00001000,B00010000,B00100000,B01111100},
{B00111000,B01000100,B00000100,B00011000,B00000100,B00000100,B01000100,B00111000},
{B00000100,B00001100,B00010100,B00100100,B01000100,B01111100,B00000100,B00000100},
{B01111100,B01000000,B01000000,B01111000,B00000100,B00000100,B01000100,B00111000},
{B00111000,B01000100,B01000000,B01111000,B01000100,B01000100,B01000100,B00111000},
{B01111100,B00000100,B00000100,B00001000,B00010000,B00100000,B00100000,B00100000},
{B00111000,B01000100,B01000100,B00111000,B01000100,B01000100,B01000100,B00111000},
{B00111000,B01000100,B01000100,B01000100,B00111100,B00000100,B01000100,B00111000}
};
//
#define POWER 7
#define BUTTON 8
//
bool sts=0,flag=0;
int LEVEL=0,max0=0;
//
void setup(){
dot.shutdown(0,false); dot.setIntensity(0,7); dot.clearDisplay(0); dot.setLed(0,0,0,true);
pinMode(POWER,OUTPUT);
Serial.begin(9600);
}
//
void loop(){
if(digitalRead(BUTTON)){
if(flag==0){ flag=1; sts=!sts; delay(100); digitalWrite(POWER,sts); Serial.println(sts); }
}
else{
if(flag){ flag=0; delay(100); }
}
//
if(sts){
SOUND=analogRead(A0);
if(SOUND<50)LEVEL=1;
else if(SOUND<100)LEVEL=2;
else if(SOUND<150)LEVEL=3;
else if(SOUND<200)LEVEL=4;
else if(SOUND<250)LEVEL=5;
else if(SOUND<300)LEVEL=6;
else if(SOUND<350)LEVEL=7;
else if(SOUND<400)LEVEL=8;
else LEVEL=9; // else if(SOUND<450)LEVEL=9;
//
max0=LEVEL-1;
for(int i=0;i<8;i++){ dot.setRow(0,i,levels[max0][i]); }
Serial.print(SOUND); Serial.print(","); Serial.print(LEVEL); Serial.print(","); Serial.println(max0); delay(200);
}
}
맛있는전복죽님의 댓글
맛있는전복죽 작성일감사합니다 해결했습니다 !!!!