정보나눔

오픈소스하드웨어 프로젝트에 대한 다양한 정보를 나누는 공간입니다.

아두이노 랜덤숫자 스위치이용해서 출력하는거.
손민수 | 2017-05-25

안녕하십니까 .아두이노 정말 초보인데 형님들이 알려주셨으면 좋겠습니다.

Lcd에 랜덤 숫자6개  뜨게하는 건데 여기다 스위치를 누를때마다 숫자가1개2개3개 이렇게 늘어가게 출력되게 하는방법좀 알려주셨으면 좋겠습니다.  부탁드립니다.

 

//* LCD 회로 :
 //* - LCD RS 핀 - 디지털 핀 12
 //* - LCD 디지털 핀 11에서 핀 사용 가능
 //* - LCD D4 핀 - 디지털 핀 5
//// * - LCD D5 핀 - 디지털 핀 4
// * - LCD D6 핀 - 디지털 핀 3
// * - LCD D7 핀 - 디지털 핀 2
 //* - LCD R / W 핀 대 접지
 //* - + 5V로 끝나고 접지 (가장 바깥 쪽 핀이 접지, 내부 전압 핀)
 //* - 포트를 LCD VO 핀 (핀 3)에 트림 (LCD 명암 대비)
 


#include <EEPROM.h>
#include <LiquidCrystal.h>

const int numNumbers = 6;// 생성 / 처리 할 숫자의 양
const int buttonPin = 7;


LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // 인터페이스 핀 번호로 라이브러리를 초기화한다.


int numbers[numNumbers]; // 생성 된 숫자를 저장할 배열을 초기화합니다.


boolean isInit = false;   // 첫 번째 버튼 누름을 기록합니다.
boolean lcdNeedsRefreshed = false;
boolean isFirstButtonPush = true;

// * *
// * 단추, 화면을 입력하고 난수 시드를 생성합니다.
// * /
void setup() {
  pinMode(buttonPin, INPUT_PULLUP);
  
  // * Fourums를 스캐닝하면이 솔루션을 사용하게되었습니다.
  // * EEPROM을 사용하는 더 나은 랜덤 시드.
  // * /
  int eeprom=EEPROM.read(0);
  eeprom+=1;
  EEPROM.write(0, eeprom);
  randomSeed(eeprom);

   // LCD의 열과 행 수를 설정하고 화면 지우기 :
  lcd.begin(16, 4);     //16col, 4row display
  lcd.home();          //back to start
  lcd.clear();  
}

/**
 * shows init message if button hasn't been pushed before, else
 * shows the numbers and checks for a button push which would
 * generate a new set of numbers.
 */
void loop(){  
    if(isFirstButtonPush){      
      readButtonPush();
      
      if(!isInit){
        showWelcomeMessage();
        isInit = true;
      }
    }else{
      readButtonPush();  

      if(lcdNeedsRefreshed){
        lcd.home();
        lcd.clear();  
        printNumbersToLCD();
        lcdNeedsRefreshed = false;
      }
    }    

    delay(100);
}

/**
 * Checks for button push and generates new numbers if it has been pushed
 */
void readButtonPush(){
    //Check for button push
    int reading = digitalRead(buttonPin);

    if(reading == LOW){
      generateRandomNumbers();
      isFirstButtonPush = false;
      lcdNeedsRefreshed = true;
    }  
}

/**
 * sets up the global numbers list with new random numbers
 */
void generateRandomNumbers(){
   for(int i = 0; i < numNumbers; i++){
       numbers[i] = nextRandomNumber();
   }
}

/** 
 * Generates a random number
 *
 * Generates a random number between 1 and 49, checks it against the global 
 * numbers array.  If the number exists in the array, it recursivly calls 
 * itself till it finds a valid number.
 *
 * returns int - random number between 1 and 49
 */
int nextRandomNumber(){
  int nextRandom = random(1,46);
  boolean isDuplicate = false;
  
  for(int i = 0; i < numNumbers; i++){
    if(nextRandom == numbers[i]) isDuplicate = true;
  } 
  
  if(isDuplicate) return nextRandomNumber();
  
  return nextRandom;
}

/**
 * prints "Welcome" message to the LCD display
 */
void showWelcomeMessage(){
    lcd.home();
    lcd.clear();
    lcd.setCursor(2, 0);
    lcd.print("LOTTERY-0-MATIC!");
    lcd.setCursor(8, 1);
    lcd.print("v2.0");
    lcd.setCursor(4, 3);
    delay(1000);
    lcd.print("Push button!");
    delay(10);
    lcd.home();
}


/**
 * Outputs the global var numbers to the LCD display
 *
 * The LCD is a 19 col, 4 row display, so there's plenty of room
 * to fit all the numbers into one line, so we'll provide some info
 * as to what is being displayed along with the numbers.
 */
void printNumbersToLCD(){
  lcd.setCursor(0, 0);
  lcd.print("Numbers:");
  lcd.setCursor(0,1);
  
  for(int i = 0; i < numNumbers; i++){    
    /* Numbers will always take up two characters of the LCD, 
     * so prepend any less than 10 with a zero.
     */
    if(numbers[i] < 10){
      lcd.print(0); lcd.print(numbers[i]); 
    }else{
      lcd.print(numbers[i]);
    }
    
    //If we're not on the last number, print a comma to seperate the numbers   
    if(i != 5) lcd.print(",");        
  }
  
  lcd.setCursor(5, 3);
  lcd.print("Good Luck!");
  lcd.home();
}

이전글   |    아두이노 리밋스위치 사용 질문 2017-05-24
다음글   |    esp8266 AT+CIPSEND 명령어.... 2017-05-25