산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

실시간 씽어아이오(Thinger.io) 지도 연동 안정적인 자동차 GPS 트래커 제작

부품 및 소모품

부품수량비고
아두이노 레오나르도1전용 하드웨어 시리얼 확보용
SIM900 개발 보드1GSM/GPRS 통신용
u-blox NEO-6M GPS 모듈1
GPS 안테나1저가형은 수신 불량 가능, 품질 좋은 것 권장
220Ω 저항2상태 LED용
LED2전원 및 GPS 락 표시
납땜 보드 7x5cm13D 프린트 인클로저 맞춤 크기
12V→5V 스텝다운 모듈1차량 배터리/시거잭 전원용
아다프루트 SD 카드 리더15V 호환 (SPI 헤더 연결 용이)
마이크로 SD 카드1

필수 도구 및 장비

앱 및 온라인 서비스

프로젝트 소개

간단한 "GPS 트래커 아이디어"로 시작해 "다목적 GPS 트래커"로 발전했습니다. 첫 프로젝트라 학습 곡선이 가파르니 피드백과 개선 제안 환영합니다!

차량에 장착하며 주요 기능:

아두이노 메모리 제약으로 오버헤드 최소화 및 효율적 코드 작성, 경량 라이브러리 사용.

사용 라이브러리

씽어아이오(Thinger.io) 라이브러리를 쓰지 않는 이유

공식 라이브러리는 편하지만 플래시 메모리 80% 차지해 나머지 코드 공간 부족. HTTP POST 요청으로 직접 통신 구현.

SMS 명령어

NeoGPS 설정

GPSPort.h 파일을 아래 내용으로 전체 교체:

#ifndef GPSport_h
#define GPSport_h
#define gpsPort Serial1
#define GPS_PORT_NAME "Serial1"
#define DEBUG_PORT Serial
#endif

다른 보드 사용 시 해당 시리얼 포트(Serial2, Serial3 등)로 변경.

정확도 참고: GPS는 정지 시에도 좌표 드리프트 발생. 10m 미만 이동은 정지로 간주, 15초 샘플링. 직선 거리 계산이므로 실제 주행거리와 차이 남.

PetitFS 설정

pffArduino.h: SD_CS_PIN을 10으로 변경 (SPI SS 핀).
pffconf.h: _USE_DIR, _USE_LSEEK, _FS_FAT12, _FS_FAT16을 0으로 비활성화 (코드 크기 절감).
초기 컴파일 에러 시 pff.cpp에 FRESULT 반환 타입 추가.

SD 카드 준비

FAT32로 포맷 (공식 SD Card Formatter 권장). 라이브러리가 파일 생성 불가하므로 dist.txt, settings.txt 미리 생성해 카드에 복사. 제공된 참조 파일 사용 권장 (포맷/내용 매우 엄격). dist.txt는 초기 거리(예: 0), settings.txt는 알림 트리거 거리(미터 단위) 저장.

SIM900 보드 준비

코드 수정 사항

Thinger.io 연동

  1. 계정 생성 → 버킷(데이터베이스) 생성.
  2. HTTP 디바이스 생성 (공식 문서 참조). 디바이스 이름은 짧게 (인증 키 길이 문제 방지).
  3. 디바이스 콜백 설정에서 'write bucket'을 생성한 버킷으로 지정.
  4. 디바이스 콜백 개요에서 메서드 URL과 인증 헤더(Bearer 제외) 확인.
  5. 코드 내 postDataThinger()의 URL과 인증 키를 본인 것으로 교체. https→http로 변경 필수 (SIM900 SSL 미지원).
  6. 성공 시 시리얼 모니터에 +HTTPACTION: 1,200,0 표시. 400 에러 시 URL/키/펌웨어 확인.
  7. 대시보드에서 맵 위젯으로 버킷 데이터 시각화.
  8. 더 많은 데이터 전송 시 JSON 포맷에 필드 추가 (sprintf 문법 엄수).

인클로저

3D 프린팅 가능한 완전한 인클로저 STL 파일 제공. M3 나사 사용. 7x5cm 납땜 보드용 설계 (브레드보드 사용 시 글루건 고정). 상단 케이스 마운트 홀은 막혀 있어 출력 후 3mm 드릴로 뚫기. 0.2mm 레이어, 서포트 없이 출력 가능.

차량 배터리/전원 연결

시거잭 회로(시동 ON/OFF 연동)에 연결해 차량 시동 시만 동작하도록 구성. 상시 전원 원하면 배터리 직결 또는 배터리 팩 추가. 12V→5V 스텝다운 모듈로 아두이노와 SIM900 각각 USB 포트로 전원 공급. GSM 활동 시 약 110mA 소모 (통신 불량 지역 시 증가).

알려진 이슈

코드

GPS_tracker_Leonardo_v2.ino (주요 부분 발췌)

#include 
#include 
#include 
#include 
#include "PF.h"
#include "PetitSerial.h"

#define UTC_OFFSET 1
#define TXPin 8
#define RXPin 9
#define PWRPin 7
#define DEFAULT_NUMBER "+4712345678"

FATFS fs;
String textMessage, number = DEFAULT_NUMBER;
char sms_msg[160];
float Lat = 0, Long = 0;
boolean valid_location = false;
uint8_t num_sat;
NeoGPS::Location_t prevFix;
NMEAGPS gps;
gps_fix fix;
const char *googlePrefix = "https://maps.google.com/maps?q=";
const char *filename = "DIST.TXT";
const char *settings = "SETTINGS.TXT";

NeoGPS::time_t timeFix;
char datePrint[13], timePrint[10];
float totalDistance = 0, triggerDistance = 4000000;
SoftwareSerial SIM900(TXPin, RXPin);

void setup() {
  pinMode(3, OUTPUT); pinMode(4, OUTPUT);
  digitalWrite(3, HIGH); // 전원 LED
  Serial.begin(9600);
  // while (!Serial); // 디버깅 시만 활성화
  SIM900.begin(9600);
  gpsPort.begin(9600);
  initializeSD();
  SIM900power();
  SIM900.println(F("AT")); delay(500);
  SIM900.println(F("AT+CMGF=1")); delay(500);
  SIM900.println(F("AT+CNMI=1,2,0,0,0")); delay(500);
  connectGPRS();
}

void loop() {
  while (gps.available(gpsPort)) {
    fix = gps.read();
    num_sat = fix.satellites;
    if (fix.valid.location) {
      digitalWrite(4, HIGH);
      Lat = fix.latitude(); Long = fix.longitude();
      if (Lat != 0 && Long != 0 && !valid_location) {
        valid_location = true; prevFix = fix.location;
      }
    }
    if (fix.valid.date && fix.valid.time) {
      timeFix = fix.dateTime; updateTime();
    }
    if (valid_location) {
      // 15초마다 거리 계산
      static const unsigned long REFRESH_INTERVAL_UPD = 15000;
      static unsigned long lastRefreshTime = millis();
      if (millis() - lastRefreshTime >= REFRESH_INTERVAL_UPD) {
        lastRefreshTime += REFRESH_INTERVAL_UPD;
        float distanceDelta = prevFix.DistanceKm(fix.location) * 1000;
        if (distanceDelta > 10 && distanceDelta < 10000) totalDistance += distanceDelta;
        prevFix = fix.location;
      }
      // 2분마다 SD 기록 & 씽어아이오 전송
      static const unsigned long REFRESH_INTERVAL_WRITE_SD = 120000UL;
      static unsigned long lastRefreshTimeWriteSD = millis();
      if (millis() - lastRefreshTimeWriteSD >= REFRESH_INTERVAL_WRITE_SD) {
        lastRefreshTimeWriteSD += REFRESH_INTERVAL_WRITE_SD;
        // SD 쓰기 (PetitFS)
        char buf[9]; dtostrf(totalDistance, 8, 0, buf);
        if (PF.open(filename)) Serial.println(F("error open file"));
        while (1) {
          UINT nr;
          if (PF.writeFile(buf, sizeof(buf), &nr)) Serial.println(F("error write file"));
          if (nr == sizeof(buf)) { PF.writeFile(0, 0, &nr); break; }
        }
        // 씽어아이오 HTTP POST
        char httpContent[60], tempstrLong[10], tempstrLat[10];
        dtostrf(Lat, 2, 6, tempstrLat); dtostrf(Long, 2, 6, tempstrLong);
        sprintf(httpContent, "{\"longitude\": %s , \"latitude\": %s , \"date\": \"%s %s\"}", tempstrLong, tempstrLat, datePrint, timePrint);
        char httpdataLen[20]; sprintf(httpdataLen, "AT+HTTPDATA=%i,10000", strlen(httpContent));
        postDataThinger(httpdataLen, httpContent);
      }
    }
  }
  // 주행거리 알림
  if (totalDistance > triggerDistance) {
    char distanceTotalMsg[10];
    itoa((totalDistance / 1000), distanceTotalMsg, 10);
    sprintf(sms_msg, "Empty catchtank! Current distance: %skm", distanceTotalMsg);
    textMessage = ""; number = DEFAULT_NUMBER; totalDistance = 0;
    sendSMS(sms_msg);
  }
  updateSerial();
}

// SMS 수신/파싱, 발신, GPRS 연결, HTTP POST, SD 초기화, 시간 보정 등 함수들 구현됨

커스텀 파트 및 인클로저

회로도

전체 회로도 이미지 제공 (아두이노 레오나르도, SIM900, GPS, SD 카드, LED, 스텝다운, 전원 연결)

제조공정

  1. 다리미판 제조: 설계, 재료, 생산 공정
  2. 서핑보드 제작과 디자인: 폴리네시아 기원에서 현대 혁신까지
  3. 실외 GPS 자산 추적: 트렌드, 과제, 신기술
  4. 라즈베리 파이, RP2040 MCU와 4달러 Pico 보드 공개
  5. 라즈베리 파이에 센서 데이터 통합하기: GPS 및 MPU-9150 IMU 실전 가이드
  6. PSoC 6 파이오니어 보드와 IoT 애드온 실드 마스터하기: 개발자 가이드
  7. BIOVIA Living Map으로 COVID-19 약물 재창출 가속화
  8. 파이썬 map() 함수 마스터하기: 문법, 예제, 모범 사례
  9. 자체 통합 시스템 활용으로 정밀 제조 실현: 바나매틱의 코봇 도입 사례
  10. 엔진 냉각수 부족 시 운전의 위험성: 과열·엔진 손상·안전사고 경고