아두이노 다루기 (기초)

이하정·2021년 7월 25일
0

한이음

목록 보기
2/3

📝시작하기전에...

아두이노를 사용하여 프로젝트를 진행하기 전에 기본적인 예제들을 테스트해보겠습니다.

저희는 적외선 센서와 GPS를 활용하여 사용자의 현재 온도와 위치를 받아 일정 온도 이상 및 일정 국가에 속해있으면 알림을 보내는 것이 목표입니다. 따라서 아두이노 사용법을 먼저 익힌 후, 적외선 센서와 GPS를 사용해보고 이를 화면에 나타내어 확인할 수 있도록 LCD도 사용해보겠습니다.

LED 예제


먼저 아두이노에 익숙해지기 위해 가장 기본 예제인 LED를 다루기를 해보겠습니다.
아두이노에 연결된 LED를 1초 간격으로 ON/OFF를 반복하도록 코드를 작성했습니다.

int led = 13;  // led를 D13핀에 연결한 것을 선언한다.
 
void setup() {
  pinMode(led, OUTPUT);
}
 
void loop() {                   // loop를 이용해 무한반복 설정
  digitalWrite(led, HIGH);      // LED ON
  delay(1000);                  // 1초간 지속
  digitalWrite(led, LOW);       // LED OFF
  delay(1000);                  // 1초간 지속
}

적외선 온도 센서


아두이노를 사용하는 방법에 대해 이제 조금 알 것 같습니다. 다음은 LED대신 적외선 온도 센서를 연결하여 사용자의 온도를 받아오겠습니다.

저희가 구매한 적외선 온도 센서 사이트 및 예제 코드 출처입니다.
[에듀이노] 아두이노 비접촉식 적외선 IR 온도센서 모듈

위의 사이트에 나와있는 대로 라이브러리를 다운받고 진행해주어야 합니다.

#include <Wire.h>
#include <Adafruit_MLX90614.h> // 적외선 센서 라이브러리
 
Adafruit_MLX90614 mlx = Adafruit_MLX90614();    // 라이브러리 생성
 
void setup() {
  Serial.begin(9600);                           // 통신속도 설정
  mlx.begin();                                  // 온도센서 시작
}

void loop() {                                   // 시리얼모니터에 출력
  Serial.print("Object : ") ;
  Serial.println(mlx.readObjectTempC());
  delay(500);
}

시리얼모니터를 켜보면 온도가 정상적으로 측정되는 것을 확인할 수 있습니다.

GPS


다음은 GPS모듈을 연결하여 사용자의 현재 위도와 경도를 받아오겠습니다.
적외선온도센서와 같이 아래 사이트에서 라이브러리 다운 후 진행해줍니다.

저희가 구매한 아두이노 GPS 수신 모듈 사이트 및 예제 코드 출처입니다.
[에듀이노] 아두이노 GPS 수신 모듈

#include <SoftwareSerial.h>

#include <TinyGPS.h>

TinyGPS gps;
SoftwareSerial ss(11, 12);

void setup()
{
  Serial.begin(9600);
  ss.begin(9600);
  
  Serial.print("Simple TinyGPS library v. "); Serial.println(TinyGPS::library_version());
  Serial.println("by Mikal Hart");
  Serial.println();
}

void loop()
{
  bool newData = false;
  unsigned long chars;
  unsigned short sentences, failed;

  for (unsigned long start = millis(); millis() - start < 1000;)
  {
    while (ss.available())
    {
      char c = ss.read();
      
      if (gps.encode(c))
        newData = true;
    }
  }

  if (newData)
  {
    float flat, flon;
    unsigned long age;
    gps.f_get_position(&flat, &flon, &age);
    Serial.print("LAT=");
    Serial.print(flat == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flat, 6);
    Serial.print(" LON=");
    Serial.print(flon == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flon, 6);
    Serial.print(" SAT=");
    Serial.print(gps.satellites() == TinyGPS::GPS_INVALID_SATELLITES ? 0 : gps.satellites());
    Serial.print(" PREC=");
    Serial.print(gps.hdop() == TinyGPS::GPS_INVALID_HDOP ? 0 : gps.hdop());
  }
  
  gps.stats(&chars, &sentences, &failed);
  Serial.print(" CHARS=");
  Serial.print(chars);
  Serial.print(" SENTENCES=");
  Serial.print(sentences);
  Serial.print(" CSUM ERR=");
  Serial.println(failed);
  if (chars == 0)
    Serial.println("** No characters received from GPS: check wiring **");
}

위도, 경도

LAT은 위도(latitude)를 의미하고, LON은 경도(longitude)를 의미합니다.
GPS모듈의 경우 실내에서는 제대로 작동하지 않으므로 실외에서 진행하거나 창문 밖에서 진행해야 합니다. 저희는 창문 밖으로 GPS모듈을 내밀고 1분 정도 기다리니 위도와 경도가 정상적으로 측정되었습니다.

다음 시간에 위도와 경도를 국가로 바꾸는 역지오코딩을 해보겠습니다.

LCD


지금까지는 받아온 센서 값을 시리얼모니터에서 확인했습니다. 시리얼모니터가 아닌 LCD모니터를 활용하여 값을 확인해봅시다.

주소확인

LCD사용 시 아두이노의 주소를 확인해야 합니다.
아두이노 주소 확인

0x27 또는 0x5A를 사용하면 될 것 같네요.

LCD 모니터

이제 LCD모니터를 본격적으로 사용해봅시다.

저희가 구매한 아두이노 LCD 사이트 및 예제 코드 출처입니다.
[에듀이노] 아두이노 LCD

#include <Wire.h>                        // i2C 통신을 위한 라이브러리
#include <LiquidCrystal_I2C.h>        // LCD 1602 I2C용 라이브러리
LiquidCrystal_I2C lcd(0x27,16,2);     // 접근주소: 0x27
void setup()
{
  lcd.init();                      // LCD 초기화
  // Print a message to the LCD.
  lcd.backlight();                // 백라이트 켜기
  lcd.setCursor(0,0);             // 1번째, 1라인
  lcd.print("Hello, world!");
  lcd.setCursor(0,1);             // 1번째, 2라인
  lcd.print("Enjoy - Eduino");
}
void loop()
{
}

연동하기


위에서 작성한 코드들을 하나로 합쳐줍니다.

// gps include
#include <SoftwareSerial.h>
#include <TinyGPS.h>

TinyGPS gps;
SoftwareSerial ss(11, 12);

// temp include
#include <Adafruit_MLX90614.h> // 적외선 센서 라이브러리
Adafruit_MLX90614 mlx = Adafruit_MLX90614(); 

// lcd include
#include <Wire.h>                        // i2C 통신을 위한 라이브러리
#include <LiquidCrystal_I2C.h>        // LCD 1602 I2C용 라이브러리
LiquidCrystal_I2C lcd(0x27,20,4);


void setup()
{
  Serial.begin(9600); // 통신속도 설정
  ss.begin(9600);
  mlx.begin(); // 온도센서 시작
  
  Serial.print("Simple TinyGPS library v. "); Serial.println(TinyGPS::library_version());
  Serial.println("by Mikal Hart");
  Serial.println();

  lcd.init();                      // LCD 초기화
  lcd.backlight();                // 백라이트 켜기


}

void loop()
{
  bool newData = false;
  unsigned long chars;
  unsigned short sentences, failed;

  // For one second we parse GPS data and report some key values
  for (unsigned long start = millis(); millis() - start < 1000;)
  {
    while (ss.available())
    {
      char c = ss.read();
      // Serial.write(c); // uncomment this line if you want to see the GPS data flowing
      if (gps.encode(c)) // Did a new valid sentence come in?
        newData = true;
    }
  }

  if (newData)
  {
    float flat, flon;
    unsigned long age;
    gps.f_get_position(&flat, &flon, &age);
    Serial.print("LAT=");
    Serial.print(flat == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flat, 3);
    Serial.print(" LON=");
    Serial.print(flon == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flon, 3);
    Serial.print(" SAT=");
    Serial.print(chars);
    Serial.print(" PREC=");
    Serial.print(gps.hdop() == TinyGPS::GPS_INVALID_HDOP ? 0 : gps.hdop());
    lcd.setCursor(0,1);
    lcd.print(flat == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flat, 3);
    lcd.print(", ");
    lcd.print(flon == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flon, 3);
    

  }
  
  gps.stats(&chars, &sentences, &failed);
  Serial.print(" CHARS=");
  Serial.print(chars);
  Serial.print(" SENTENCES=");
  Serial.print(sentences);
  Serial.print(" CSUM ERR=");
  Serial.println(failed);
  if (chars == 0)
    Serial.println("** No characters received from GPS: check wiring **");

  Serial.print("temp : ") ;
  Serial.println(mlx.readObjectTempC());
  delay(500);
  lcd.setCursor(0,0);             // 1번째, 1라인
  lcd.print(mlx.readObjectTempC());

}

첫번째 줄에는 사용자의 현재 온도를, 두번째 줄에는 사용자의 현재 위치를 나타냈습니다.

0개의 댓글

관련 채용 정보