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

GPS로 DS3231 설정

구성품 및 소모품

Arduino Nano R3
× 1
DS3231 시계 모듈
× 1
NEO 6M GPS 모듈
× 1
BI 방향 레벨 시프터
× 1
LCD 16*2 디스플레이
× 1
I2C LCD 백팩
× 1
15방향 0.1인치 소켓
× 2
6방향 0.1인치 소켓
× 2
4방향 0.1인치 소켓
× 1
5웨이 0.1인치 소켓
× 1
4방향 0.1인치 핀 스트립
× 1
스트립보드 24줄 * 37열
× 1
4K7 저항기
× 2
푸시버튼(단극 순간 6m 정사각형)
× 1

이 프로젝트 정보

내 DS3231 드리프트, 시스템 시간을 사용하여 일부 코드를 컴파일하여 업데이트하는 일반적인 작업을 수행했지만 컴파일 및 업로드가 내 컴퓨터에서 발생하는 다른 프로세스에 의해 계속 중단되기 때문에 약간 부정확한 것으로 판명되었습니다.

GPS가 정확한 시간(UTC)과 날짜를 알려준다는 사실을 알게 된 후 나는 그것을 사용하여 DS3231을 설정하기로 결정했습니다.

회로:

Arduino에 대한 LCD 백팩:

GND - GND

VCC - 5V

SDA - SDA(A4)

SCL - SCL (A5)

DS3231 클록 모듈 - Arduino:

GND - GND

VCC - 5V

SDA - SDA(A4)

SCL - SCL (A5)

Arduino의 레벨 시프터:

5V - 5V

GND - GND

D3 - 버스

D4 - 버스

레벨 시프터의 NEO 6M GPS:

3V - VCC

GND - GND

버스 - TXD(D3에서 끝남)

버스 - RXD(D4에서 종료)

스위치 연락처:

스위치 - D9

스위치 - 접지

힘:

USB 케이블을 통해 회로에 전원을 공급합니다.

소프트웨어:

소프트웨어의 99%는 Adafruit GPS 라이브러리의 parsing.ino 예제입니다. 추출한 GPS 날짜와 시간을 DS3231에 전달하기 위해 소량의 코드를 추가했고 LCD 디스플레이에 DS3231에서 시간을 표시하기 위한 몇 가지 추가 코드를 추가했습니다.

사용된 라이브러리:

Adafruit 버전 1.0.3의 Adafruit GPSLibrary

Adafruit 버전 1.2.0의 RTCLib

I2C 디스플레이 백팩용 NewLiquidCrystal.

작업:

장치를 켜십시오.

LCD는 현재 DS3231 레지스터에 있는 날짜 및 시간 값을 표시합니다.

GPS가 잠길 때까지 잠시 기다리세요.

버튼을 눌러 GPS 신호를 통해 시간을 설정합니다.

LCD에 새로운 시간이 표시됩니다.

작업 제한:

GPS 장치를 잠그는 데 시간이 걸리고 잠금이 완료되었다는 표시가 없습니다. 잠금 없이 설정 버튼을 누르면 내 DS3231 날짜가 2000:0:0으로 설정되고 시간이 0:0:0으로 설정되었습니다.

GPS 장치의 빨간색 LED가 깜박이기 시작한 후 설정 버튼을 누르기에 가장 좋은 시간인 것 같습니다. 이 시간은 실내에서 10분 정도 걸릴 수 있습니다.

처음에 내가 사용한 DS3231 장치는 배터리가 방전되어 설정을 누르면 날짜가 2000:0:0, 시간이 0:164:164로 설정되었습니다. 배터리가 GPS 데이터를 수신하고 자체적으로 올바르게 계속 똑딱 거리기에 충분한 충전을 얻는 데 꽤 오랜 시간이 걸렸습니다.

GPS 단점:

내가 구입한 보드는 단순히 NEO 6M GPS라고 했으며 연결 핀에 기능이 표시되어 있습니다. 장치 [1]의 데이터 시트를 살펴보니 장치가 약 3V에서 작동하므로 레벨 시프터를 사용한다고 나와 있습니다. 그러나 자세히 살펴보면 보드에 납땜된 4A2D 칩이 있다는 것을 발견했습니다. 인터넷 검색에서는 전압 조정기로 표시되지만 이것이 통신 라인의 레벨 이동을 보장하지는 않습니다(내 장치에는 회로도가 제공되지 않음).

나는 또한 다른 GPS 모듈이 실내에서 좋은 신호를 수신하는 능력이 다르다는 것을 온라인에서 읽었습니다. 따라서 외부로 가져갈 수 있도록 LCD 디스플레이를 추가했습니다.

LCD 단점:

I2C 주소가 0x3F인 이상한 주소 중 하나를 사용하고 있으며 대부분 주소 0x27을 사용하므로 아무 것도 표시되지 않으면 먼저 변경해 보십시오.

도서관의 특징:

libraryRTCLib(Adafruit 버전 1.2.0)은 시간 및 날짜 레지스터를 설정하지만 DS3231의 날짜 레지스터는 설정하지 않습니다. 라이브러리에는 날짜 레지스터의 값을 사용하여 즉석에서 계산된 요일을 반환하는 기능이 있습니다.

나는 이것이 이상하다는 것을 알았지만 결국 그것이 의미가 있다는 것을 깨달았습니다. 요일 레지스터를 설정하려면 윤년에 변경하도록 코드를 설정해야 하는 반면 공식으로 요일을 생성하면 이를 방지할 수 있습니다.

UTC 및 현지 시간:

UTC에서 검색한 결과 현지 시간으로 변경할 필요가 없다는 것을 알게 되었기 때문에 필요한 경우 해당 코드를 직접 추가해야 합니다.

참조:

[1] https://www.u-blox.com/sites/default/files/products/documents/NEO-6_DataSheet_(GPS.G6-HW-09005).pdf(2018년 12월 검색)

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

코드

<울>
  • DS3231 코드 파일 설정
  • DS3231 코드 파일 설정Arduino
    // I2C 및 Wire를 통해 연결된 DS3231 RTC를 사용하는 날짜 및 시간 기능 lib#include #include "RTClib.h"//Aadafruit 버전 1.2.0 on my machineRTC_DS3231 RTC;char daysOfTheWeek[7] [12] ={"일요일", "월요일", "화요일", "수요일", "목요일", "금요일", "토요일"}; const int days_string_length =12;//시계 끝//LCD용 display//#include //이미 포함됨(위) // 여기에서 LCD I2C 라이브러리를 가져옵니다. // https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads#include //0x3F 대부분의 lcd 사용 주소는 0x27이므로 아무 것도 표시되지 않는 경우 firstLiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE)를 변경해 보십시오. // LCD I2C 주소 설정//LCD 디스플레이의 끝//버튼#define 버튼 9// MTK3329/MTK3339 드라이버를 사용하는 Adafruit GPS 모듈 테스트 코드//// 이 코드는 GPS 모듈을 수신하는 방법을 보여줍니다. 인터럽트 // 프로그램이 더 많은 '자유'를 가질 수 있도록 합니다. 새로운 NMEA 문장을 사용할 수 있을 때 // 구문 분석만 하면 됩니다! 그런 다음 원하는 시간에// 데이터에 액세스합니다./// 테스트를 거쳐 Adafruit Ultimate GPS 모듈// MTK33x9 칩셋을 사용하여// ------> http://www.adafruit.com/products/746/ / 오늘 Adafruit 전자 제품 매장에서 구입하여 // 오픈 소스 하드웨어 및 소프트웨어 지원을 도와주세요! -ada#include #include // GPS 모듈을 사용하는 경우:// GPS 전원 핀을 5V에 연결// GPS 접지 핀을 접지에 연결// 소프트웨어를 사용하는 경우 serial(스케치 예제 기본값):// GPS TX(전송) 핀을 Digital 3에 연결// GPS RX(수신) 핀을 Digital 2에 연결// 하드웨어 직렬(예:Arduino Mega)을 사용하는 경우 // GPS 연결 Arduino RX1, RX2 또는 RX3에 대한 TX(전송) 핀// GPS RX(수신) 핀을 일치하는 TX1, TX2 또는 TX3에 연결// Adafruit GPS 실드를 사용하는 경우 // SoftwareSerial mySerial(3, 2) 변경 ); -> SoftwareSerial mySerial(8, 7);// 스위치가 SoftSerial로 설정되어 있는지 확인합니다.// 소프트웨어 직렬을 사용하는 경우 이 라인을 활성화된 상태로 유지합니다.//(배선과 일치하도록 핀 번호를 변경할 수 있음):SoftwareSerial mySerial( 3, 2);// 하드웨어 직렬(예:Arduino Mega)을 사용하는 경우 SoftwareSerial 행 위의 ///를 주석 처리하고 이 행을 대신 활성화합니다. =Serial1;Adafruit_GPS GPS(&mySerial);// GPSECHO를 'false'로 설정하여 GPS 데이터를 직렬 콘솔로 반향시키는 기능을 끄십시오. // 디버그하고 원시 GPS 문장을 들으려면 'true'로 설정하십시오. #define GPSECHO false //--------->꺼짐// 인터럽트를 사용하는지 여부를 추적합니다. // 기본적으로 꺼짐!boolean usingInterrupt =false;void useInterrupt(boolean); // Func 프로토타입은 Arduino 0023을 유지 happyvoid setup() { // 115200에 연결하여 GPS를 충분히 빠르게 읽고 문자를 삭제하지 않고 에코할 수 있습니다. // 또한 뱉어냅니다. Serial.begin(115200); Serial.println("Adafruit GPS 라이브러리 기본 테스트!"); // 9600 NMEA는 Adafruit MTK GPS의 기본 전송 속도입니다. 일부는 4800 GPS.begin(9600)을 사용합니다. // 고도를 포함하여 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); // 이 코드의 좋은 점은 timer0 인터럽트가 // 1밀리초마다 꺼지도록 하고 GPS에서 데이터를 읽을 수 있다는 것입니다. // 루프 코드를 훨씬 쉽게 만듭니다! useInterrupt(참); 지연(1000); // 펌웨어 버전 요청 mySerial.println(PMTK_Q_RELEASE); //LCD 시작 lcd.begin(16,2); lcd.backlight(); lcd.clear(); //설정 버튼 pinMode(button,INPUT_PULLUP); }// 인터럽트는 밀리초에 한 번 호출되고 새 GPS 데이터를 찾고 itSIGNAL(TIMER0_COMPA_vect) { char c =GPS.read(); // 디버그를 하고 싶다면 지금이 좋은 기회입니다!#ifdef UDR0 if (GPSECHO) if (c) UDR0 =c; // UDR0에 직접 쓰는 것은 Serial.print보다 훨씬 빠르지만 // 한 번에 하나의 문자만 쓸 수 있습니다. #endif}void useInterrupt(boolean v) { if (v) { // Timer0은 이미 millis()에 사용되었습니다. // 중간 어딘가에 인터럽트를 걸고 OCR0A =0xAF 위의 "Compare A" 함수를 호출합니다. TIMSK0 |=_BV(OCIE0A); usingInterrupt =참; } else { // 인터럽트 함수 COMPA를 더 이상 호출하지 않음 TIMSK0 &=~_BV(OCIE0A); usingInterrupt =거짓; }}uint32_t timer =millis();void loop() // 계속해서 실행{ // 위의 인터럽트를 사용하지 않는 경우 // GPS를 '수동 쿼리'해야 합니다. ( if (! usingInterrupt) { // '메인 루프'에서 GPS 데이터 읽기 char c =GPS.read(); // 디버그를 하고 싶다면 지금이 좋은 기회입니다! if (GPSECHO) if (c) Serial.print(c); } // 문장이 수신되면 체크섬을 확인하고 구문 분석할 수 있습니다... if (GPS.newNMEAreceived()) { // 여기서 까다로운 점은 인쇄하면 NMEA 문장 또는 데이터 // 우리는 결국 다른 문장을 듣지 않고 포착하게 됩니다! // 데이터를 출력하기 위해 OUTPUT_ALLDATA 및 trytng를 사용하는 경우 매우 주의해야 합니다. //Serial.println(GPS.lastNMEA()); // 이것도 역시 newNMEAreceived() 플래그를 false로 설정 if (!GPS.parse(GPS.lastNMEA())) // 이것은 또한 newNMEAreceived() 플래그를 false로 설정합니다. 그냥 다른 시간을 기다리십시오 } // millis() 또는 타이머가 순환하는 경우, 우리는 그냥 재설정합니다 if (timer> millis()) 타이머 =millis(); 정적 부울 second_time_round=false; // 약 2초마다 현재 통계를 출력합니다. //if (millis() - timer> 2000) { // timer =millis(); // 타이머 재설정 //버튼을 누르면 클록에 데이터 쓰기 - 내부 풀업에 의해 일반적으로 버튼은 높게 유지 if(!digitalRead(button)){//참고:RTClib는 DS3231에서 요일 레지스터를 명시적으로 설정하지 않습니다.// 대신 dayOfTheWeek()를 사용하면 날짜를 기반으로 하는 수식으로 날짜가 계산됩니다. //일요일은 0으로 간주됩니다.//(라이브러리 헤더 및 ccp 파일을 읽은 결과) //set rtc RTC.adjust(DateTime(GPS.year, GPS.month, GPS.day, GPS.hour, GPS.분, GPS.초)); //LCD lcd.clear(); lcd.setCursor(2,0); lcd.print("눌러진 설정"); 지연(5000); lcd.clear(); } 지금 날짜 시간 =RTC.now(); lcd.setCursor(4,0); lcd.print(now.year(), DEC); lcd.print('/'); lcd.print(now.month(), DEC); lcd.print('/'); lcd.print(now.day(), DEC); lcd.print(' '); lcd.setCursor(4,1); lcd.print(now.hour(), DEC); lcd.print(':'); lcd.print(지금.분(), DEC); lcd.print(':'); lcd.print(now.second(), DEC); lcd.print(" ");}

    회로도


    제조공정

    1. 고정 나사 란 무엇입니까?
    2. 영원한 유산 남기기
    3. SMRP는 M&R 메트릭 정의 세트를 게시합니다.
    4. 자바 10 - 환경 설정
    5. 정사각형이란 무엇입니까?
    6. 구식 방법으로 표면 연삭
    7. 최고의 선택:박스 웨이 CNC 선반
    8. 펀치 세트 란 무엇입니까?
    9. 리니어웨이 CNC 선반이란?
    10. 메카닉 툴셋 이해하기