제조공정
![]() |
| × | 1 | |||
![]() |
| × | 1 | |||
![]() |
| × | 1 | |||
![]() |
| × | 1 | |||
| × | 1 |
![]() |
|
지금까지 시계 프로젝트에 다양한 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
> 16x2 크기의 디스플레이를 사용하시겠습니까?
#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="코드">// 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. 고도); } }}
제조공정
구성품 및 소모품 Arduino UNO × 1 점퍼 와이어(일반) × 1 PIR 모션 센서(일반) × 2 12V 전원 릴레이(4PDT) × 1 12볼트 SMPS × 1 Seeed Grove - 2채널 SPDT 릴레이 × 1 5볼트 SMPS × 1 토글 스위치, (켜기)-끄기-(켜기) × 1 라즈베리 파이 3 모델 B × 1 라즈베리 파이 카메라 모듈 V2
이 Arduino Tutorial에서는 DS3231 Real Time Clock Module을 사용하는 방법을 배웁니다. 다음 비디오를 보거나 아래에 작성된 튜토리얼을 읽을 수 있습니다. 개요 여기에 오는 첫 번째 질문은 Arduino 자체에 내장된 시간 측정기가 있는 경우 Arduino 프로젝트에 대해 실제로 별도의 RTC가 필요한 이유입니다. 요점은 RTC 모듈이 배터리로 실행되며 마이크로컨트롤러를 다시 프로그래밍하거나 주 전원을 분리하더라도 시간을 추적할 수 있다는 것입니다. DS3231 실시간 시계 DS3231은 시