[앱인벤터] 실로폰

MIT 앱인벤터를 이용한 기초프로그래밍 작성에 필요한 데이터 입니다.

다운로드파일: Xylophone

“아빠 어디야”앱 아두이노 소스 판올림. Ver.180911

  • 충격이 수준이상이면 스팸으로 처리될 정도로 끊임없이 메시지보내는 부분 수정
  • 0.1초 간격으로 재 측정하도록 하면서
  • 감도를 50으로 나누어 영역화
  • 기존 값을 저장해서 기존 영역과 다를 경우에 앱으로 보내도록 수정함.
#include <SoftwareSerial.h>
#include <TinyGPS.h>

TinyGPS gps;
SoftwareSerial GPSSerial(4, 3);
SoftwareSerial BTSerial(0,1);

void GetGPSdata(TinyGPS &gps);
float latitude, longitude;
int year;
byte month, day, hour, minute, second, hundredths;

int PORT_SHOCK_ANALOG = A0;
int NowShockAnalogValue = 0;
int PreShockAnalogValue = 0;

void setup(){
pinMode(PORT_SHOCK_ANALOG, INPUT);

BTSerial.begin(9600);
Serial.begin(9600);
GPSSerial.begin(9600);

Serial.println(“GPS 위치 수신중..”);
Serial.println(“충격감지센서 조정중..”);
Serial.println(“”);
}

void loop(){
while(GPSSerial.available()) {
int data = GPSSerial.read();
if(gps.encode(data)){
gps.f_get_position(&latitude, &longitude);
gps.crack_datetime(&year,&month,&day,&hour,&minute,&second,&hundredths);
delay(100);
}

NowShockAnalogValue = 1024 - analogRead(PORT_SHOCK_ANALOG);
if(NowShockAnalogValue >= 100 and (int(NowShockAnalogValue/50) != int(PreShockAnlaogValue/50))){
//if(latitude > 0) {
Serial.println(NowShockAnalogValue);//Serial.print(“충격감도: “);
Serial.println(latitude,5);//Serial.print(“위도: “);
Serial.println(longitude,5);//Serial.print(“경도: “);

//Serial.print(“현재시각: “);
//Serial.print(hour, DEC); Serial.print(“:”);
//Serial.print(minute, DEC); Serial.print(“:”);
//Serial.print(second, DEC); Serial.print(“.”);
//Serial.println(hundredths, DEC);

BTSerial.println(NowShockAnlaogValue);
BTSerial.println(latitude);
BTSerial.println(longitude);

PreShockAnalogValue = NowShockAnlaogValue;
delay(100);
//}

}
delay(100);
}
}

아두이노 GPS 센서 테스트 소스

기본 테스트 소스

  • GPS 모듈(센서)가 제대로 작동하는지 확인용 소스
  • RAW 데이터를 받아 파싱이 되지 않아 구분이 힘들다
#include <SoftwareSerial.h>
SoftwareSerial gpsSerial(6,5);
void setup() {
  Serial.begin(9600);
  Serial.println(“Start GPS… “);
  gpsSerial.begin(9600);
}
void loop() {
  if(gpsSerial.available())
  {
    Serial.write(gpsSerial.read());
  }
}

 

Tiny GPS 라이브러리 이용하는소스

#include <SoftwareSerial.h>
#include <TinyGPS.h>
// Define which pins you will use on the Arduino to communicate with your
// GPS. In this case, the GPS module’s TX pin will connect to the
// Arduino’s RXPIN which is pin 3.
#define RXPIN 6
#define TXPIN 5
//Set this value equal to the baud rate of your GPS
#define GPSBAUD 9600
// Create an instance of the TinyGPS object
TinyGPS gps;
// Initialize the NewSoftSerial library to the pins you defined above
SoftwareSerial uart_gps(RXPIN, TXPIN);
// This is where you declare prototypes for the functions that will be
// using the TinyGPS library.
void getgps(TinyGPS &gps);
// In the setup function, you need to initialize two serial ports; the
// standard hardware serial port (Serial()) to communicate with your
// terminal program an another serial port (NewSoftSerial()) for your
// GPS.
void setup()
{
  // This is the serial rate for your terminal program. It must be this
  // fast because we need to print everything before a new sentence
  // comes in. If you slow it down, the messages might not be valid and
  // you will likely get checksum errors.
  Serial.begin(9600);
  //Sets baud rate of your GPS
  uart_gps.begin(GPSBAUD);
  Serial.println(“”);
  Serial.println(“GPS Shield QuickStart Example Sketch v12”);
  Serial.println(”       …waiting for lock…           “);
  Serial.println(“”);
}
// This is the main loop of the code. All it does is check for data on
// the RX pin of the ardiuno, makes sure the data is valid NMEA sentences,
// then jumps to the getgps() function.
void loop()
{
  while(uart_gps.available())     // While there is data on the RX pin…
  {
      int c = uart_gps.read();    // load the data into a variable…
      if(gps.encode(c))      // if there is a new valid sentence…
      {
        getgps(gps);         // then grab the data.
      }
  }
}
// The getgps function will get and print the values we want.
void getgps(TinyGPS &gps)
{
  // To get all of the data into varialbes that you can use in your code,
  // all you need to do is define variables and query the object for the
  // data. To see the complete list of functions see keywords.txt file in
  // the TinyGPS and NewSoftSerial libs.
  // Define the variables that will be used
  float latitude, longitude;
  // Then call this function
  gps.f_get_position(&latitude, &longitude);
  // You can now print variables latitude and longitude
  Serial.print(“Lat/Long: “);
  Serial.print(latitude,5);
  Serial.print(“, “);
  Serial.println(longitude,5);
  // Same goes for date and time
  int year;
  byte month, day, hour, minute, second, hundredths;
  gps.crack_datetime(&year,&month,&day,&hour,&minute,&second,&hundredths);
  // Print data and time
  Serial.print(“Date: “); Serial.print(month, DEC); Serial.print(“/”);
  Serial.print(day, DEC); Serial.print(“/”); Serial.print(year);
  Serial.print(”  Time: “); Serial.print(hour, DEC); Serial.print(“:”);
  Serial.print(minute, DEC); Serial.print(“:”); Serial.print(second, DEC);
  Serial.print(“.”); Serial.println(hundredths, DEC);
  //Since month, day, hour, minute, second, and hundr
  // Here you can print the altitude and course values directly since
  // there is only one value for the function
  Serial.print(“Altitude (meters): “); Serial.println(gps.f_altitude());
  // Same goes for course
  Serial.print(“Course (degrees): “); Serial.println(gps.f_course());
  // And same goes for speed
  Serial.print(“Speed(kmph): “); Serial.println(gps.f_speed_kmph());
  Serial.println();
  // Here you can print statistics on the sentences.
  unsigned long chars;
  unsigned short sentences, failed_checksum;
  gps.stats(&chars, &sentences, &failed_checksum);
  //Serial.print(“Failed Checksums: “);Serial.print(failed_checksum);
  //Serial.println(); Serial.println();
  delay(10000);
}

출처: http://deneb21.tistory.com/331 [Do It Yourself!]

“아빠 어디야” 앱 아두이노 소스 판올림

  • GPS 쉴드를 연결하여 현 위치 파악가능하게 수정함.
  • 3번, 4번 핀으로 GPS와 연결하고, 현 위치 상시 파악하며 충격이 500 이상 감지되면 데이터 나타나도록 함.
  • GPS신호를 못 잡으면 데이터 전송하지 않도록 함.
  • 블루투스 전송시 데이터를 받는 앱에 어떻게 전달해야 구분이 편할지는 조금 더 고민해야 함
  • 시리얼모니터의 결과는 다음과 같이 나옴

#include <SoftwareSerial.h>
#include <TinyGPS.h>
#define SHOCK_A_IN_PIN 0

TinyGPS gps;
SoftwareSerial GPSSerial(4, 3);
SoftwareSerial BTSerial(0,1);

void GetGPSdata(TinyGPS &gps);
int iShockValue = 0;
float latitude, longitude;
int year;
byte month, day, hour, minute, second, hundredths;

void setup(){
BTSerial.begin(9600);
Serial.begin(9600);
GPSSerial.begin(9600);

Serial.println(“GPS 위치 수신중..”);
Serial.println(“충격감지센서 조정중..”);
Serial.println(“”);
}

void loop(){
while(GPSSerial.available()) {
int data = GPSSerial.read();
if(gps.encode(data)){
gps.f_get_position(&latitude, &longitude);
gps.crack_datetime(&year,&month,&day,&hour,&minute,&second,&hundredths);
delay(100);
}

iShockValue = 1024- analogRead(SHOCK_A_IN_PIN);
if (iShockValue >= 500){
if(latitude > 0) {
//Serial.print(“충격감도: “);
Serial.println(iShockValue);
//Serial.print(“위도: “);
Serial.println(latitude,5);
//Serial.print(“경도: “);
Serial.println(longitude,5);

//Serial.print(“현재시각: “); Serial.print(hour, DEC); Serial.print(“:”);
//Serial.print(minute, DEC); Serial.print(“:”); Serial.print(second, DEC);
//Serial.print(“.”); Serial.println(hundredths, DEC);

BTSerial.println(iShockValue);
BTSerial.println(latitude);
BTSerial.println(longitude);
delay(100);
}
}
}
}