답변 : 아두이노 세븐 세그먼트 제어
페이지 정보
작성자 master 작성일19-08-29 21:21 조회6,768회 댓글0건본문
// MCU BASIC: https://www.basic4mcu.com
// DateTime : 2019-08-29 오후 9:11:02
// by Ok-Hyun Park
//
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>
#endif
//
#define A 3
#define B 4
#define C 8
#define D 10
#define E 9
#define F 7
#define G 11
#define digit1 6
#define digit2 5
#define PIN 12
#define NUMPIXELS 20
#define buttonPin 2
//
Adafruit_NeoPixel pixels=Adafruit_NeoPixel(NUMPIXELS,PIN,NEO_GRB+NEO_KHZ800);
//
const int segs[7]={ A,B,C,D,E,F,G};
const int numbers[10][7]={{ 1,1,1,1,1,1,0},{ 0,1,1,0,0,0,0},{ 1,1,0,1,1,0,1},{ 1,1,1,1,0,0,1},{ 0,1,1,0,0,1,1},{ 1,0,1,1,0,1,1},{ 1,0,1,1,1,1,1},{ 1,1,1,0,0,1,0},{ 1,1,1,1,1,1,1},{ 1,1,1,1,0,1,1},};
const int NUMBER_OF_FIELDS=2;
//
int values[NUMBER_OF_FIELDS];
int bookled,delayval=500,k=0,j=0,i=0;
int fieldIndex=0,randomNum=0;
char ch,store=0;
//
void setup(){
Serial.begin(9600);
#if defined(__AVR_ATtiny85__)
if(F_CPU==16000000)clock_prescale_set(clock_div_1);
#endif
pixels.begin();
pinMode(buttonPin,INPUT_PULLUP);
for(int i=0; i<7; i++){ pinMode(segs[i],OUTPUT); }
pinMode(digit1,OUTPUT); pinMode(digit2,OUTPUT);
}
//
void loop(){
if(Serial.available()){
ch=Serial.read();
if(store!=ch){
if(store>='0'&&store<='9'){
if(fieldIndex<NUMBER_OF_FIELDS){
values[fieldIndex]=(values[fieldIndex]*10)+((int)store-'0');
}
}
else if(store==','){ fieldIndex++; }
else { randomNum=values[0]; bookled=values[1]; fieldIndex=0; values[0]=0; }
store=ch;
}
}
//
lightnumber1(randomNum%10); delay(10);
lightnumber2(randomNum/10); delay(10);
//
pixels.clear(); pixels.show();
//
if(digitalRead(buttonPin)==LOW){
randomNum=0;
for(j=0; j<5; j++){
for(k=0; k<3; k++){
pixels.setPixelColor(bookled-2+k,pixels.Color(10,10,10));
}
pixels.show(); delay(delayval); pixels.clear();
pixels.show(); delay(delayval);
}
}
}
//
void lightnumber1(int num1){
digitalWrite(digit1,LOW); digitalWrite(digit2,HIGH);
for(int i=0; i<7; i++){ digitalWrite(segs[i],numbers[num1][i]); }
}
//
void lightnumber2(int num2){
digitalWrite(digit1,HIGH); digitalWrite(digit2,LOW);
for(int i=0; i<7; i++){ digitalWrite(segs[i],numbers[num2][i]); }
}
루프문만 보면 3종류의 코드가 있습니다.
if(Serial.available()){
ch=Serial.read();
if(store!=ch){
if(store>='0'&&store<='9'){
if(fieldIndex<NUMBER_OF_FIELDS){
values[fieldIndex]=(values[fieldIndex]*10)+((int)store-'0');
}
}
else if(store==','){ fieldIndex++; }
else { randomNum=values[0]; bookled=values[1]; fieldIndex=0; values[0]=0; }
store=ch;
}
}
이 부분은 시리얼 수신 데이터가 있어야하므로 평소에는 실행되지 않습니다.
if(digitalRead(buttonPin)==LOW){
randomNum=0;
for(j=0; j<5; j++){
for(k=0; k<3; k++){
pixels.setPixelColor(bookled-2+k,pixels.Color(10,10,10));
}
pixels.show(); delay(delayval); pixels.clear();
pixels.show(); delay(delayval);
}
}
이 부분은 스위치를 눌렀을 때만 동작하므로 평소에는 실행되지 않습니다.
//
lightnumber1(randomNum%10); delay(10);
lightnumber2(randomNum/10); delay(10);
//
pixels.clear(); pixels.show();
중간에는 이 코드가 들어 있는데요
일 자리는 10ms 딜레이라서 10ms 동안켜지지만
십 자리를 출력 후 10ms 딜레이라서 10ms 동안 켜지는 것으로 생각하겠지만
pixels.clear(); pixels.show();
이 코드를 실행하는데에도 시간이 걸리므로 십자리 출력에는 일자리보다 더 많은 시간동안 출력 됩니다.
시리얼수신이 있거나 스위치를 눌렀을 때는 훨씬 더 많은 시간동안 십자리가 표시됩니다.
lightnumber1(randomNum%10); pixels.clear(); pixels.show();
lightnumber2(randomNum/10); pixels.clear(); pixels.show();
이런식으로 변경하면 특별한(시리얼수신 또는 스위치입력) 일이 발생하지 않을 때에 일자리와 십자리가 동일한 시간동안 켜지게 됩니다.
댓글 : 0
조회수 : 6,768
등록된 댓글이 없습니다.