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

GPS 기반의 저렴하고 정확한 시계

구성품 및 소모품

Arduino UNO
× 1
Adafruit RGB 백라이트 LCD - 16x2
제 경우에는 쉽게 연결할 수 있는 nobrand LCD 20x4 Display mit I2C 어댑터
× 1
브레드보드(일반)
× 1
점퍼 와이어(일반)
× 1
GPS 수신기(일반)
Ublox NEO-6M이 있는 GY-GPS6Mv2
× 1

앱 및 온라인 서비스

Arduino IDE

이 프로젝트 정보


지금까지 시계 프로젝트에 다양한 RTC 시계를 사용하거나 NTP 서버에서 시간을 가져왔습니다. 이 프로젝트에서 저는 전 세계 GPS 위성의 NMEA 문자열에서 구문 분석하는 또 다른 소스를 제공합니다.

나는 오늘날 GPS 수신기가 얼마나 저렴한지 놀랐습니다. 하나 구입하십시오(제 경우에는 GY-GPS6Mv2가 사용됨).

a.) 첫 번째 - 선택 사항 - Windows PC에서 테스트:U-Blox에서 다운로드하여 "u-center"를 설치합니다.

FTDI 어댑터의 도움으로 GPS 브레이크아웃은 PC의 COM 포트로 가는 길을 찾고 약 1분 후에 궤도에 고정(연결)을 표시합니다. 이를 위해 브레이크 아웃의 빨간색 제어 램프가 깜박입니다.

자동으로 생성된 그래픽은 GPS를 더 많이 실험하고 싶게 만듭니다. 보기 메뉴에서 F8 - 텍스트 콘솔을 사용하면 다양한 NMEA 문자열을 얻을 수 있습니다.

b.) 무료 온라인 서비스에서 디코딩 테스트를 수행할 수 있습니다:https://rl.se/gprmc

GPS 수신기가 제대로 작동하는지 확인했으므로 하늘이 보이는지 확인하십시오. 원하는 대로 문자열에서 원하는 정보를 추출할 수 있습니다.

우리는 Adafruit 라이브러리 "Adafruit GPS 라이브러리"를 사용합니다. Arduino IDE에 설치했다면 예제를 통해 조금 시도해 볼 수 있습니다.

c.) 회로

Arduino A4> 디스플레이 SDA Arduino A5> 디스플레이 SCL

#include #include LiquidCrystal_I2C lcd(0x3F, 20, 4); // LCD 주소 설정> 종종 0x27 또는 0x3F

> 16x2 크기의 디스플레이를 사용하시겠습니까?

#include #include

GPS 전원 핀을 5V에 연결합니다.GPS 접지 핀을 접지에 연결합니다.GPS TX(전송) 핀을 디지털 8에 연결합니다. GPS RX(수신) 핀을 디지털 7에 연결합니다.// 배선과 일치하도록 핀 번호를 변경할 수 있습니다.SoftwareSerial mySerial(8 , 7);Adafruit_GPS GPS(&mySerial);

> GPS 수신기는 3.3/5V를 허용합니다.

d.) 우리의 시계는 시간, 날짜, 풍속 및 고도를 표시해야 합니다. 내 시계가 창가에서 멈출 것이기 때문에 위치는 필요하지 않습니다.

NMEA 문자열은 UTC 표준의 시간을 제공합니다. 현지 시간대로 변환하는 것은 우리에게 달려 있습니다. 아무도 더 나은 제안을 하지 않는 한 내 시간대(유럽 베를린)에 +1을 추가합니다.

int 시간대 =+1; // 유럽/베를린(UTC +0100)> NMEA는 UTC 기준입니다. 

시간대를 원하는 대로 조정하십시오. 그런 다음 UTC 값인 GPS.hour 대신 LCD 디스플레이의 출력 코드에 변수 hour가 사용됩니다.

// LCD 디스플레이로 출력
lcd.setCursor(5,0); // ,0 =첫 번째 줄
int hour =(GPS.hour) + timezone; // GPS.hour UTC를 개별 시간대에 맞게 포맷
if (hour <10) { lcd.print('0'); }
lcd.print(시, 12월); lcd.print(':');

유럽에서는 풍속을 노트 대신 "km/h"를 사용합니다. 그래서 먼저 상수를 사용하여 값을 노트에서 km/h로 변환한 다음 그룹화했습니다.> 1노트 =1.852km/h

부동 속도 =(GPS.speed) * 1.852; // 속도/노트에서 전환> 속도/km/h 

Wikipedia에 따른 평가:

if (속도 <=1) {lcd.print(" Windsille");}
else if ((속도> 1) &&(속도 <=9)) {lcd.print(" leiser Zug");}
else if ((속도> 9) &&(속도 <=46)) {lcd.print(" Brise");}
else if ((속도> 46) &&(속도 <=56)) {lcd.print(" starker Wind");}
else if ((속도> 56) &&(속도 <=74)) {lcd.print(" stuerm. Wind");}
else if ((속도> 74) &&(속도 <=83)) {lcd.print(" Sturm");}
else if ((속도> 83) &&(속도 <=102)) {lcd.print(" schwerer Sturm");}
else if (속도> 102) {lcd.print(" Orkan");}
else {lcd.print(" ohne Bewertung ");}

결과는 다음과 같이 디스플레이에 표시되며 물론 원하는 대로 조정할 수 있습니다.

루프 내에서 업데이트 빈도를 2초로 유지했습니다. 심지어 16x2 디스플레이를 위해 초와 높이를 포기하는 경향이 있습니다.

다양한 GPS 옵션을 즐겨보세요!

유럽에서는 DCF77 무선 신호에 대한 평가도 사용할 수 있습니다. 그러나 이것은 훨씬 더 비싸고 취급이 매우 민감하다고 합니다.

<섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드">

코드

<울>
  • GPS_SoftwareSerial_Parsing_ilo
  • GPS_SoftwareSerial_Parsing_iloC/C++
    Adafruits 예제는 약간 조정되었습니다
    // MTK3329/MTK3339 드라이버를 사용하는 Adafruit GPS 모듈에 대한 테스트 코드//// 이 코드는 프로그램이 더 많은 '자유'를 가질 수 있도록 하는 인터럽트에서 GPS 모듈을 수신하는 방법을 보여줍니다. - 새로운 NMEA 문장을 사용할 수 있을 때 // 구문 분석만 하세요! 그런 다음 원하는 시간에// 데이터에 액세스합니다./// 테스트를 거쳐 Adafruit Ultimate GPS 모듈// MTK33x9 칩셋을 사용하여// ------> http://www.adafruit.com/products/746/ / 오늘 Adafruit 전자 제품 매장에서 구입하고// 오픈 소스 하드웨어 및 소프트웨어 지원을 도와주세요! -ada// 수정됨 01.02.2020 - Ingo Lohs// GPRMC 및 GPGGA 디코더:https://rl.se/gprmc#include  #include LiquidCrystal_I2C lcd(0x3F,20,4); // 16자 및 2줄 디스플레이의 경우 LCD 주소를 0x27로 설정> 2004년 LCD 디스플레이의 경우 0x3F로 설정#include #include // GPS 전원 핀을 5V/에 연결 / GPS 접지 핀을 접지에 연결// GPS TX(전송) 핀을 디지털 8에 연결// GPS RX(수신) 핀을 디지털 7에 연결// 배선과 일치하도록 핀 번호를 변경할 수 있습니다.SoftwareSerial mySerial( 8, 7);Adafruit_GPS GPS(&mySerial);// GPSECHO를 'false'로 설정하여 GPS 데이터를 직렬 콘솔로 반향시키는 기능을 끕니다. // 디버그하고 원시 GPS 문장을 듣고 싶다면 'true'로 설정# GPSECHO trueint 시간대 정의 =+1; // 유럽/베를린(UTC +0100)> NMEA는 UTC 기준입니다.void setup(){ lcd.init(); lcd.backlight(); // 115200에 연결하여 GPS를 충분히 빠르게 읽고 문자를 삭제하지 않고 에코할 수 있습니다. // 또한 뱉어냅니다. Serial.begin(115200); 지연(5000); Serial.println("Adafruit GPS 라이브러리 기본 테스트!"); // 9600 NMEA는 Adafruit MTK GPS의 기본 전송 속도입니다. 일부는 4800 GPS.begin(9600)을 사용합니다. //> 제 경우에는 UBLOX 6M:GY-GPS6Mv2를 사용합니다. // 고도를 포함하여 RMC(최소 권장) 및 GGA(데이터 수정)를 켜기 위해 이 줄의 주석 처리를 제거합니다. GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA); // "최소 권장" 데이터만 켜려면 이 줄의 주석 처리를 제거합니다. //GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCONLY); // 데이터 파싱을 위해 RMC만 사용하거나 RMC+GGA 외에는 사용하지 않는 것이 좋습니다. // 파서는 현재 다른 문장에 대해 신경 쓰지 않기 때문입니다. // 업데이트 속도를 설정합니다. GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ); // 1Hz 업데이트 속도 // 구문 분석 코드가 제대로 작동하고 데이터를 정렬할 시간이 있고 // 인쇄하려면 1Hz보다 높은 것을 사용하지 않는 것이 좋습니다. // 안테나 상태에 대한 업데이트 요청, 주석 조용히 유지하기 위해 밖으로 GPS.sendCommand(PGCMD_ANTENNA); 지연(1000); // 펌웨어 버전 요청 mySerial.println(PMTK_Q_RELEASE);}uint32_t timer =millis();void loop() // 계속해서 실행{ char c =GPS.read(); // 디버그를 하고 싶다면 지금이 좋은 기회입니다! if ((c) &&(GPSECHO)) Serial.write(c); // 문장이 수신되면 체크섬을 확인하고 구문 분석할 수 있습니다... if (GPS.newNMEAreceived()) { // 여기서 까다로운 점은 NMEA 문장 또는 데이터를 인쇄하는 경우 // 우리가 끝내지 못하는 것입니다. 듣고 다른 문장 잡기! // OUTPUT_ALLDATA 및 trytng를 사용하여 데이터를 출력하려는 ​​경우 매우 주의해야 합니다. //Serial.println(GPS.lastNMEA()); // 이것은 또한 newNMEAreceived() 플래그를 false로 설정합니다. if (!GPS.parse(GPS.lastNMEA())) // 이것은 또한 newNMEAreceived() 플래그를 false로 설정합니다. return; // 문장을 파싱하는 데 실패할 수 있으며, 이 경우 다른 문장을 기다려야 합니다. } // millis() 또는 타이머가 순환하면 그냥 재설정합니다. if (timer> millis()) timer =millis(); // 약 2초 정도마다 현재 통계를 출력합니다. if (millis() - timer> 2000) { timer =millis(); // 타이머 재설정 Serial.print("\nTime:"); if (GPS.hour <10) { Serial.print('0'); } Serial.print(GPS.시간, DEC); Serial.print(':'); if (GPS.min <10) { Serial.print('0'); } Serial.print(GPS.분, DEC); Serial.print(':'); if (GPS.seconds <10) { Serial.print('0'); } Serial.print(GPS.seconds, DEC); Serial.print('.'); if (GPS.milliseconds <10) { Serial.print("00"); } else if (GPS.milliseconds> 9 &&GPS.milliseconds <100) { Serial.print("0"); } Serial.println(GPS.밀리초); Serial.print("날짜:"); Serial.print(GPS.day, DEC); Serial.print('/'); Serial.print(GPS.month, DEC); Serial.print("/20"); Serial.println(GPS.연도, DEC); Serial.print("수정:"); Serial.print((int)GPS.fix); Serial.print(" 품질:"); Serial.println((int)GPS.fixquality); // LCD 디스플레이에 출력 lcd.setCursor(5,0); // ,0 =첫 번째 줄 int hour =(GPS.hour) + timezone; // GPS.hour UTC를 개별 시간대에 맞게 포맷 if (hour <10) { lcd.print('0'); } lcd.print(시, 12월); lcd.print(':'); if (GPS.min <10) { lcd.print('0'); } lcd.print(GPS.분, DEC); lcd.print(':'); if (GPS.seconds <10) { lcd.print('0'); } lcd.print(GPS.seconds, DEC); // LCD 디스플레이에 출력 lcd.setCursor(5,1); // ,0 =두 번째 줄 if (GPS.day <10) { lcd.print('0'); } lcd.print(GPS.일, 12월); lcd.print('.'); if (GPS.month <10) { lcd.print('0'); } lcd.print(GPS.월, DEC); lcd.print('.'); lcd.print(GPS.연도, DEC); if (GPS.fix) { // 위성 연결이 있습니까? 그렇다면 더 많은 값이 있습니다. Serial.print("Location:"); Serial.print(GPS.latitude, 4); Serial.print(GPS.lat); Serial.print(", "); Serial.print(GPS.경도, 4); Serial.println(GPS.lon); Serial.print("속도(노트):"); Serial.println(GPS.속도); Serial.print("각도:"); Serial.println(GPS.angle); Serial.print("고도:"); Serial.println(GPS.altitude); Serial.print("위성:"); Serial.println((int)GPS.satellites); lcd.setCursor(0,2); // ,2 =세 번째 줄 // 1 Knoten =1,852 시간당 킬로미터 float speed =(GPS.speed) * 1.852; // 속도/노트에서 전환> 속도/km/h //lcd.print("km/h 속도:"); lcd.print(속도); // Bewertung der Windstärke nach https://de.wikipedia.org/wiki/Windgeschwindigkeit /* Beschreibung - Geschwindigkeit in km/h * Windstille - 0-1 * leiser Zug - 2-9 * leichte Brise - 10-19 * schwache Brise - 20-28 * Mäßige Brise - 29-37 * frische Brise - 38-46 * starker Wind - 47-56 * stürmischer Wind - 57-74 * Sturm - 75-83 * schwerer Sturm - 84-102 * Orkan -> 103*/ if ((속도> 9) &&(속도 <=46)) {lcd.print(" Brise");} else if ((속도> 46) &&(속도 <=56)) {lcd.print(" starker Wind ");} else if ((속도> 56) &&(속도 <=74)) {lcd.print(" stuerm. Wind");} else if ((속도> 74) &&(속도 <=83)) { lcd.print(" Sturm");} else if ((속도> 83) &&(속도 <=102)) {lcd.print(" schwerer Sturm");} else if (속도> 102) {lcd.print( " 오르칸 ");} else {lcd.print(" ohne Bewertung");} lcd.setCursor(0,3); // ,3 =네 번째 줄 lcd.print("Hoehe:"); lcd.print(GPS. 고도); } }}

    제조공정

    1. DIY 저렴한 장갑 컨트롤러 및 프로펠러 자동차
    2. DHT11 센서(LED 및 피에조 스피커 포함)
    3. GPS 데이터 로거, 공간 분석 및 Azure IoT Hub.
    4. 온도 및 습도 데이터 로거
    5. Arduino Temp. 3.2 디스플레이가 있는 모니터 및 실시간 시계
    6. 아날로그 스타일 LED POV 시계
    7. 생일 축하합니다:조명과 소리
    8. U-blox LEA-6H 02 GPS 모듈(Arduino 및 Python 포함)
    9. Arduino 및 OLED 기반 Cellular Automata
    10. 기타 스피드 픽 및 스톰프 페달!