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

Arduino Nano + DS3231 + LDR이 있는 7-세그먼트 클록

구성품 및 소모품

Arduino Nano R3
Arduino Uno 또는 Elegoo Uno와 잘 작동
× 1
Adafruit 7-세그먼트 배낭 - 1.2" 키가 큰 숫자
- 제 경우에는 1.2" Tall Digits(번들 구매 시 선택 사항)
× 1
Adafruit 1.2 4자리 7세그먼트 디스플레이(I2C 배낭 포함) - 녹색
× 1
Adafruit DS3231
원하는 경우 DS1307
× 1
저항 100k 옴
× 1
포토 저항기
× 1
브레드보드(일반)
× 1
점퍼 와이어(일반)
10-14개
× 1
코인 셀 배터리 CR1220
× 1

앱 및 온라인 서비스

Arduino IDE

이 프로젝트 정보

소개

손목에 시계가 항상 차고 다니는 시대, 손목에 시계가 있든 스마트폰에 있든 Arduino Uno/Nano는 약간 둔합니다. 그렇지 않으면 인터넷 연결을 통해 지속적으로 온라인 상태인 이 기사 외부에 NTP 서버 동기화 장치가 있습니다.

이야기

내 친구 중 한 명은 침실에서 WiFi 연결이 가능한 장치를 개인적인 이유로 거부했기 때문에 Arduino에 별도의 시계가 장착되어 있습니다.

올바른 제품 선택

나는 Adafruit조차도 원하는 장력과 정밀도에 따라 얼마나 많은 다른 제품을 사용할 수 있는지 놀랐습니다! 여기에서 두 가지 제품으로 결정했습니다. 저렴한 DS1307 그리고 아마도 더 정확한 DS3231 .

분명히 하자면 이 시계에서는 두 제품을 모두 사용할 수 있습니다. DS1307을 사용하려면 올바른 PIN 할당과 온도 표시 옵션에 대한 제한 사항에 주의하십시오. 비고 "//" displayTemp(); 루프() 내의 함수입니다.

스케치 조정

스케치를 찾다가 다른 멤버와 함께 뭔가를 찾았습니다. 이 스케치를 재구성하고 맞추었지만 체코어 주석을 유지하고 영어 주석을 추가했습니다.

광고는 최대한 커야 했기 때문에 7세그먼트 광고로 결정했습니다. 결국 시간을 염두에 두고 싶었습니다.

스케치를 검토하는 동안 경험한 다음 긍정적인 놀라움:여기에서 DS3231은 온도 사용 옵션을 제공합니다. , DS1307은 부정확성과 함께 누락되었습니다.

시계 초기화

CR1220 버튼 셀 배터리가 있는 경우 시계 설정에 대한 Adafruit의 짧은 자습서를 따를 수 있습니다. 요약하면 시간은 인터넷에서 다운로드되는 것이 아니라 시간이 지남에 따라 로컬 PC에서 다운로드됩니다. 업로드 타임스탬프가 타이머로 전송됩니다.

기능

그 후 시간 및 온도 출력을 위한 회로에 LED 매트릭스를 추가했습니다. . 시간 및 온도의 변화 주기는 변수를 통해 설정할 수 있습니다.

특히 LED 매트릭스의 깜박이는 점과 숫자의 개별 제어가 작동하고 제어되는 방식이 스케치에 잘 설명되어 있습니다.

여기에서 더 많은 Adafruit 소스를 참조합니다.

스케치는 여름/겨울 시간 조정으로 반올림됩니다. 및 주변 조명에 따른 LED 매트릭스의 밝기 (밤에 디스플레이는 낮보다 더 어두워야 합니다.)

영상에서 확실히 시간과 온도의 변화를 눈치채셨군요. 사진의 왼쪽 부분에 주목하셨나요? 이것은 초에 따라 위치(위 또는 아래)를 변경합니다.

시계가 고장난 경우 LED 매트릭스에서 "ERR"을 발행하는 방법을 알고 계시다면 피드백을 주십시오. 현재 "bEEF"가 나타납니다:

 // 아니오, 데이터가 없습니다! Serial.println("DS3231 센서 오류 - 온도를 읽을 수 없습니다."); matrix.print(0xBEEF, HEX); // BEEF로 사용자에게 알립니다. matrix.writeDisplay(); 지연(5000); 

확장

알람 또는 알람 시간도 아직 통합되지 않았습니다.

Bluetooth 모듈 및 Blynk를 통한 확장도 성공할 수 있습니다.

2019년 1월 2일 업데이트:

브레드보드에서 펀치 카드에 대한 영구 베팅으로의 전환이 오늘 완료되었습니다. 관심 있는 분들을 위한 사진 몇 장:

첨부 파일에서 업데이트된 코드 v1.1과 맞춤형 프리징 이미지를 찾을 수 있습니다.

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

코드

<울>
  • 마이클록 v1.0
  • 마이클록 v1.1
  • MyClock v1.0C/C++
    // MyClock v1.0// Ingo Lohs// 하드웨어:Arduino IDE v1.8.8/* Theory for Matrix ht16k33을 사용하여 Arduino Uno 및 Arduino Nano(ATmega328P [Old Bootloader])로 테스트했습니다. 인쇄 - Serialprint(변수, HEX)에서 하는 것처럼 - 0000에서 FFFFprint(변수,DEC) 또는 print(변수)까지의 16진수 숫자를 인쇄합니다. - 0000에서 9999까지의 10진수 정수를 인쇄합니다. 더 많은 제어가 필요하면 writeDigitNum(location, number)를 호출할 수 있습니다. - 이렇게 하면 단일 위치에 숫자(0-9)가 기록됩니다. 위치 #0은 왼쪽 끝까지이고 위치 #2는 콜론 점이므로 아마도 건너뛰려면 4번 위치가 오른쪽 끝까지입니다. 콜론과 소수점을 제어하려면 writeDigitRaw(location, bitmap) 함수를 사용하십시오. (중앙 콜론의 두 점은 디스플레이 내부에서 함께 연결되어 있습니다. , 따라서 개별적으로 주소를 지정할 수 없습니다.) 위치에 대해 2를 지정하고 비트는 다음과 같이 매핑됩니다. 0x02 - 센터 콜론(둘 다 d ots)0x04 - 왼쪽 콜론 - 아래쪽 dot0x08 - 왼쪽 콜론 - 위쪽 dot0x10 - 소수점 소수점을 원하면 writeDigitNum(location, number, true)를 호출하여 소수점을 칠합니다. 콜론을 그리려면 drawColon(true 또는 false)모든 숫자의 세그먼트를 완전히 제어하려면 writeDigitRaw(location,bitmask)를 호출하여 원시 8비트 마스크(uint8_t에 저장된 대로)를 임의의 위치에 그릴 수 있습니다. 모든 그리기 루틴은 디스플레이만 변경합니다. Arduino가 보관하는 메모리. I2C.Source:https://www.mouser.com/ds/2/737/adafruit-led-backpack-932846을 통해 매트릭스에 메모리를 '저장'하기 위해 그림을 그린 후 writeDisplay()를 호출하는 것을 잊지 마십시오. pdf*/#include  // Arduino Uno, Mega 등을 사용하는 경우 이 줄을 활성화합니다.#include #include "Adafruit_LEDBackpack.h#define DS3231_I2C_ADDRESS 0x68int ldr_sensor =A0; // GND에 100k Ohm이 있는 LDR 포토레지스터, 다른 쪽 레그 5Vint ldr_value =0; // LDR 값 - var store valueint 밝기_매트릭스; // LED 매트릭스 밝기 - var store valueint threshold_brightness =400; // 임계값 깜박임_값 =0; // LED 매트릭스 깜박임 비율int delay_matrix_time =20; // 표시 시간(20초)int delay_matrix_temp =2000; // 표시 온도(2초)int 깜박임_도트 =2; // 아무것도 깜박이지 않음 - 왼쪽에 단일 점 2개Adafruit_7segment matrix =Adafruit_7segment();byte decToBcd(byte val){return ( (val/10*16) + (val%10) );}byte bcdToDec(byte val){ 반환 ( (val/16*10) + (val%16) );} 무효 설정() { Serial.begin(9600); Wire.begin(); matrix.begin(0x70);} 무효 루프() { lightBrightness(); // 매트릭스-밝기 정의 matrixBlinkrate(); // 매트릭스-Blinkrate 디스플레이타임(); // 실시간 시계 데이터 표시 displayTemp(); // 온도 표시 }void lightBrightness() {// setBrightness(brightness) - 전체 디스플레이의 전체 밝기를 변경할 수 있습니다. 0은 가장 밝지 않고 15는 가장 밝으며 시작할 때 디스플레이에 의해 초기화되는 값입니다. ldr_value =analogRead(ldr_sensor); Serial.print("LDR:"); Serial.println(ldr_value); if (ldr_value <=threshold_brightness) { // 밝기 대 임계값 밝기 측정값 밝기_매트릭스 =0; // 대낮에 밝음 } else { bright_matrix =15; // 어두운 밤 }}void matrixBlinkrate() {// 깜박임 속도(rate) - 전체 디스플레이를 깜박일 수 있습니다. 0은 깜박임이 없습니다. 1, 2 또는 3은 디스플레이 깜박임입니다. matrix.blinkRate(blinkrate_value);} 무효 displayTime(){matrix.setBrightness(brightness_matrix); matrix.clear();// 매트릭스에 표시되는 시간(초)for (uint16_t i =0; i > 서머 타임으로 변경 - 3월 마지막 일요일 2시 if ((dayOfWeek ==7) &&(dayOfMonth>=25)&&(month ==3) &&(시간 ==2)) { // nastavení hodin na 3 hodinu // 시계를 3시간으로 설정 setDS3231time(se,mi,3,we,dm,mo,ye); } // změna času na zimní //>> 겨울 시간으로 변경 if ((dayOfWeek ==7) &&(dayOfMonth>=25) &&(month ==10) &&(hour ==1)&&(year !=1 )) { // rok použit jako indikace, že bylo léto // 여름임을 나타내는 연도 setDS3231time(se,mi,ho,we,dm,mo,1); } if ((dayOfWeek ==7) &&(dayOfMonth>=25) &&(월 ==10) &&(시간 ==3) &&(연도 ==1)) { // nastavení hodin na 2 hodinu a příznak na 0 // 시계를 2시간으로 설정하고 연도를 0으로 설정합니다. setDS3231time(se,mi,2,we,dm,mo,0); } /* 위치에 2를 지정하면 비트가 다음과 같이 매핑됩니다. 0x02 - 중앙 콜론(두 점) 0x04 - 왼쪽 콜론 - 아래쪽 점 0x08 - 왼쪽 콜론 - 위쪽 점 0x10 - 소수점 */ /* 위치 #2 컨트롤 또한 왼쪽 2개의 단일 점(=blinky_dot):2 =아무것도 깜박이지 않음 3 =아무것도 깜박이지 않음 4 =왼쪽 상단을 깜박임(상단 점 1개) 5 =왼쪽 상단을 깜박임(상단 점 1개) 6 =왼쪽 상단을 깜박임(상단 점 1개) ) + 둘 다 중간 7에 콜론 =왼쪽 상단 깜박임(하나의 상단 점) + 둘 다 콜론 중반 8 =하단 왼쪽 깜박임(하나의 하단 점) 9 =하단 왼쪽 깜박임(단일 하단 점) 10 =하단 왼쪽 깜박임(단일 하단 점) ) + 둘 다 중간 11에 콜론 =왼쪽 하단 깜박임(하단 하나의 점) + 둘 다 중간에 콜론 12 =둘 다 깜박임 콜론(둘 다 왼쪽 단일 점) 둘 다 없이 콜론 중간에 */ // 형식 시간:_0:mm if (시간> 9) { matrix.writeDigitNum(0, (시 / 10), 거짓); matrix.writeDigitNum(1, (시간 % 10), 거짓); // 이것은 모듈로를 사용하여 단일 위치에 숫자(0-9)를 씁니다. https://www.arduino.cc/reference/en/language/structure/arithmetic-operators/modulo/ } else { matrix.writeDigitNum( 1, 시간, 거짓); } // matrix.drawColon(true); // 두 콜론이 중간 활성 상태임:왼쪽 점을 깜박이지 않으려면 여기에서 두 콜론을 활성화할 수 있습니다. // 초가 왼쪽 위치에 표시할 기회를 제공합니다. // 왼쪽 하단 깜박임(하단 단일 점) + 둘 다 중간에 콜론 } else if (se> 30) { 깜박임_dot =6; // 왼쪽 상단 깜박임(상단 단일 점) + 둘 다 중간에 콜론 } matrix.writeDigitRaw(2, 깜박임_도트); matrix.writeDigitNum(3, (분 / 10), 거짓); matrix.writeDigitNum(4, (분 % 10), 거짓); 매트릭스.writeDisplay(); // 0.5초 동안 깜박이는 이중 점 delay(500); matrix.drawColon(거짓); 매트릭스.writeDisplay(); 지연(500); }} 무효 displayTemp(){matrix.setBrightness(brightness_matrix); matrix.clear(); 바이트 온도 =get3231Temp(); int abs_temp =abs(temp); // 값의 절대값 matrix.writeDigitNum(1,(abs_temp % 10), false); // 위치 1, 값 9, 소수 표시) if (temp <0) matrix.writeDigitRaw(0,64); if (temp <=-10) matrix.writeDigitRaw(2,12); // 온도가 음수이면 마이너스 기호를 첫 번째 위치에 플로팅합니다. if (temp>
    =10) matrix.writeDigitNum(0, (abs_temp/10), false); // 위치 0, 값 1, 소수 표시) if (temp <=-10) matrix.writeDigitNum(0, (abs_temp/10), false); // 위치 0, 값 1, 소수 표시) // matrix.writeDigitRaw(2,0x10); // 십진수 점 matrix.writeDigitRaw(3,99); // 99 ="°" matrix.writeDigitRaw(4,57); // 57 ="C" matrix.writeDisplay(); // 직렬 라인에 온도 값을 표시합니다. // zobrazí hodnoty teploty na seriove lince Serial.print("Temperatur in C:"); Serial.println(get3231Temp()); // +/- 3 Grad섭씨 // 매트릭스의 온도를 초 단위로 표시하는 시간 delay(delay_matrix_temp);}void setDS3231time(바이트 초, 바이트 분, 바이트 시간, 바이트 dayOfWeek, 바이트 dayOfMonth, 바이트 월, 바이트 연도){ / / 시간 및 날짜 데이터를 DS3231로 설정 Wire.beginTransmission(DS3231_I2C_ADDRESS); Wire.write(0); // 다음 입력을 초에서 시작하도록 설정 레지스터 Wire.write(decToBcd(second)); // 초 설정 Wire.write(decToBcd(분)); // 분 설정 Wire.write(decToBcd(hour)); // 시간 설정 Wire.write(decToBcd(dayOfWeek)); // 요일 설정 (1=일요일, 7=토요일) Wire.write(decToBcd(dayOfMonth)); // 날짜 설정(1 ~ 31) Wire.write(decToBcd(month)); // 월 설정 Wire.write(decToBcd(year)); // 연도 설정(0~99) Wire.endTransmission();}void getDateDs3231(byte *second, byte *분, byte *hour, byte *dayOfWeek, byte *dayOfMonth, byte *month, byte *year){ Wire. 시작전송(DS3231_I2C_ADDRESS); Wire.write(0); Wire.endTransmission(); Wire.requestFrom(DS3231_I2C_ADDRESS, 7); *초 =bcdToDec(Wire.read() &0x7f); *분 =bcdToDec(Wire.read()); *시간 =bcdToDec(Wire.read() &0x3f); *dayOfWeek =bcdToDec(Wire.read()); *dayOfMonth =bcdToDec(Wire.read()); *월 =bcdToDec(Wire.read()); *년 =bcdToDec(Wire.read());} float get3231Temp(){ 바이트 tMSB, tLSB; 플로트 temp3231; Wire.beginTransmission(DS3231_I2C_ADDRESS); Wire.write(0x11); Wire.endTransmission(); Wire.requestFrom(DS3231_I2C_ADDRESS, 2); if (Wire.available()) { tMSB =Wire.read(); // 2의 보수 int 부분 tLSB =Wire.read(); // 분수 부분 temp3231 =(tMSB &B01111111); // Tmsb에서 2의 수학을 수행 temp3231 +=( (tLSB>> 6) * 0.25 ); // 비트 7과 8에만 관심이 있습니다. return temp3231; } else { // 오 아니오, 데이터가 없습니다! Serial.println("DS3231 센서 오류 - 온도를 읽을 수 없습니다."); matrix.print(0xBEEF, HEX); // BEEF로 사용자에게 알립니다. matrix.writeDisplay(); 지연(5000); } }
    MyClock v1.1C/C++
    Summer/Winter-Time
    // MyClock v1.1// Ingo Lohs// 하드웨어 업데이트:Arduino IDE v1.8.8// Change v1.0을 사용하여 Arduino Uno 및 Arduino Nano(ATmega328P [이전 부트로더])로 테스트됨> v1.1// dayOfWeek ==1 anstatt 7 abgeändert in displayTime() zur korrekten Ermittlung des Sonntages für die Zeitumstellung/* Theory for the Matrix ht16k33가장 쉬운 방법은 인쇄를 호출하는 것입니다. - 0000에서 FFFF까지의 16진수를 인쇄합니다.print(변수,DEC) 또는 print(변수) - 0000에서 9999까지의 10진수 정수를 인쇄합니다. 더 많은 제어가 필요한 경우 writeDigitNum(location, number)을 호출할 수 있습니다. - 이것은 단일 위치에 숫자(0-9)를 씁니다. 위치 #0은 왼쪽 끝까지, 위치 #2는 콜론 점이므로 건너뛰고 싶을 것입니다. 위치 #4는 끝까지 오른쪽. 콜론과 소수점을 제어하려면 writeDigitRaw(location, bitmap) 함수를 사용하십시오. (중앙 콜론의 두 점은 다음에서 함께 연결됩니다. 디스플레이 내부에 있으므로 별도로 주소를 지정할 수 없습니다.) 위치에 2를 지정하고 비트는 다음과 같이 매핑됩니다. - 소수점 소수점을 원하면 writeDigitNum(location, number, true)를 호출하여 소수점을 칠합니다. 콜론을 그리려면 drawColon(true 또는 false)을 사용하십시오. 모든 숫자의 세그먼트를 완전히 제어하려면 writeDigitRaw(location,bitmask)를 호출하여 원시 8비트 마스크(uint8_t에 저장된 대로)를 임의의 위치에 그릴 수 있습니다. 모든 그리기 루틴은 Arduino가 유지하는 디스플레이 메모리만 변경합니다. I2C.Source:https://www.mouser.com/ds/2/737/adafruit-led-backpack-932846을 통해 매트릭스에 메모리를 '저장'하기 위해 그림을 그린 후 writeDisplay()를 호출하는 것을 잊지 마십시오. pdf*/#include  // Arduino Uno, Mega 등을 사용하는 경우 이 줄을 활성화합니다.#include #include "Adafruit_LEDBackpack.h#define DS3231_I2C_ADDRESS 0x68int ldr_sensor =A0; // GND에 100k Ohm이 있는 LDR 포토레지스터, 다른 쪽 레그 5Vint ldr_value =0; // LDR 값 - var store valueint 밝기_매트릭스; // LED 매트릭스 밝기 - var store valueint threshold_brightness =400; // 임계값 깜박임_값 =0; // LED 매트릭스 깜박임 비율int delay_matrix_time =20; // 표시 시간(20초)int delay_matrix_temp =2000; // 표시 온도(2초)int 깜박임_도트 =2; // 아무것도 깜박이지 않음 - 왼쪽에 단일 점 2개Adafruit_7segment matrix =Adafruit_7segment();byte decToBcd(byte val){return ( (val/10*16) + (val%10) );}byte bcdToDec(byte val){ 반환 ( (val/16*10) + (val%16) );} 무효 설정() { Serial.begin(9600); Wire.begin(); matrix.begin(0x70);} 무효 루프() { lightBrightness(); // 매트릭스-밝기 정의 matrixBlinkrate(); // 매트릭스-Blinkrate 디스플레이타임(); // 실시간 시계 데이터 표시 displayTemp(); // 온도 표시 }void lightBrightness() {// setBrightness(brightness) - 전체 디스플레이의 전체 밝기를 변경할 수 있습니다. 0은 가장 밝지 않고 15는 가장 밝으며 시작할 때 디스플레이에 의해 초기화되는 값입니다. ldr_value =analogRead(ldr_sensor); Serial.print("LDR:"); Serial.println(ldr_value); if (ldr_value <=threshold_brightness) { // 밝기 대 임계값 밝기 측정값 밝기_매트릭스 =0; // 대낮에 밝음 } else { bright_matrix =15; // 어두운 밤 }}void matrixBlinkrate() {// 깜박임 속도(rate) - 전체 디스플레이를 깜박일 수 있습니다. 0은 깜박임이 없습니다. 1, 2 또는 3은 디스플레이 깜박임입니다. matrix.blinkRate(blinkrate_value);} 무효 displayTime(){matrix.setBrightness(brightness_matrix); matrix.clear();// 매트릭스에 표시되는 시간(초)for (uint16_t i =0; i > 서머 타임으로 변경 - 3월 마지막 일요일 2시에 if ((dayOfWeek ==1) &&(dayOfMonth>=25)&&(month ==3) &&(시간 ==2)) { // nastavení hodin na 3 hodinu // 시계를 3시간으로 설정 setDS3231time(se,mi,3,we,dm,mo,ye); } // změna času na zimní //>> 겨울 시간으로 변경 if ((dayOfWeek ==1) &&(dayOfMonth>=25) &&(month ==10) &&(hour ==1)&&(year !=1 )) { // rok použit jako indikace, že bylo léto // 여름임을 나타내는 연도 setDS3231time(se,mi,ho,we,dm,mo,1); } if ((dayOfWeek ==1) &&(dayOfMonth>=25) &&(month ==10) &&(hour ==3) &&(year ==1)) { // nastavení hodin na 2 hodinu a příznak na 0 // 시계를 2시간으로 설정하고 연도를 0으로 설정합니다. setDS3231time(se,mi,2,we,dm,mo,0); } /* 위치에 2를 지정하면 비트가 다음과 같이 매핑됩니다. 0x02 - 중앙 콜론(두 점) 0x04 - 왼쪽 콜론 - 아래쪽 점 0x08 - 왼쪽 콜론 - 위쪽 점 0x10 - 소수점 */ /* 위치 #2 컨트롤 또한 왼쪽 2개의 단일 점(=blinky_dot):2 =아무것도 깜박이지 않음 3 =아무것도 깜박이지 않음 4 =왼쪽 상단을 깜박임(상단 점 1개) 5 =왼쪽 상단을 깜박임(상단 점 1개) 6 =왼쪽 상단을 깜박임(상단 점 1개) ) + 둘 다 중간 7에 콜론 =왼쪽 상단 깜박임(하나의 상단 점) + 둘 다 콜론 중반 8 =하단 왼쪽 깜박임(하나의 하단 점) 9 =하단 왼쪽 깜박임(단일 하단 점) 10 =하단 왼쪽 깜박임(단일 하단 점) ) + 둘 다 중간 11에 콜론 =왼쪽 하단 깜박임(하단 하나의 점) + 둘 다 중간에 콜론 12 =둘 다 깜박임 콜론(둘 다 왼쪽 단일 점) 둘 다 없이 콜론 중간에 */ // 형식 시간:_0:mm if (시간> 9) { matrix.writeDigitNum(0, (시 / 10), 거짓); matrix.writeDigitNum(1, (시간 % 10), 거짓); // 이것은 모듈로를 사용하여 단일 위치에 숫자(0-9)를 씁니다. https://www.arduino.cc/reference/en/language/structure/arithmetic-operators/modulo/ } else { matrix.writeDigitNum( 1, 시간, 거짓); } // matrix.drawColon(true); // 두 콜론이 중간 활성 상태임:왼쪽 점을 깜박이지 않으려면 여기에서 두 콜론을 활성화할 수 있습니다. // 초가 왼쪽 위치에 표시할 기회를 제공합니다. // 왼쪽 하단 깜박임(하단 단일 점) + 둘 다 중간에 콜론 } else if (se> 30) { 깜박임_dot =6; // 왼쪽 상단 깜박임(상단 단일 점) + 둘 다 중간에 콜론 } matrix.writeDigitRaw(2, 깜박임_도트); matrix.writeDigitNum(3, (분 / 10), 거짓); matrix.writeDigitNum(4, (분 % 10), 거짓); 매트릭스.writeDisplay(); // 0.5초 동안 깜박이는 이중 점 delay(500); matrix.drawColon(거짓); 매트릭스.writeDisplay(); 지연(500); }} 무효 displayTemp(){matrix.setBrightness(brightness_matrix); matrix.clear(); 바이트 온도 =get3231Temp(); int abs_temp =abs(temp); // 값의 절대값 matrix.writeDigitNum(1,(abs_temp % 10), false); // 위치 1, 값 9, 소수 표시) if (temp <0) matrix.writeDigitRaw(0,64); if (temp <=-10) matrix.writeDigitRaw(2,12); // 온도가 음수이면 마이너스 기호를 첫 번째 위치에 플로팅합니다. if (temp>
    =10) matrix.writeDigitNum(0, (abs_temp/10), false); // 위치 0, 값 1, 소수 표시) if (temp <=-10) matrix.writeDigitNum(0, (abs_temp/10), false); // 위치 0, 값 1, 소수 표시) // matrix.writeDigitRaw(2,0x10); // 십진수 점 matrix.writeDigitRaw(3,99); // 99 ="°" matrix.writeDigitRaw(4,57); // 57 ="C" matrix.writeDisplay(); // 직렬 라인에 온도 값을 표시합니다. // zobrazí hodnoty teploty na seriove lince Serial.print("Temperatur in C:"); Serial.println(get3231Temp()); // +/- 3 Grad섭씨 // 매트릭스의 온도를 초 단위로 표시하는 시간 delay(delay_matrix_temp);}void setDS3231time(바이트 초, 바이트 분, 바이트 시간, 바이트 dayOfWeek, 바이트 dayOfMonth, 바이트 월, 바이트 연도){ / / 시간 및 날짜 데이터를 DS3231로 설정 Wire.beginTransmission(DS3231_I2C_ADDRESS); Wire.write(0); // 다음 입력을 초에서 시작하도록 설정 레지스터 Wire.write(decToBcd(second)); // 초 설정 Wire.write(decToBcd(분)); // 분 설정 Wire.write(decToBcd(hour)); // 시간 설정 Wire.write(decToBcd(dayOfWeek)); // 요일 설정 (1=일요일, 7=토요일) Wire.write(decToBcd(dayOfMonth)); // 날짜 설정(1 ~ 31) Wire.write(decToBcd(month)); // 월 설정 Wire.write(decToBcd(year)); // 연도 설정(0~99) Wire.endTransmission();}void getDateDs3231(byte *second, byte *분, byte *hour, byte *dayOfWeek, byte *dayOfMonth, byte *month, byte *year){ Wire. 시작전송(DS3231_I2C_ADDRESS); Wire.write(0); Wire.endTransmission(); Wire.requestFrom(DS3231_I2C_ADDRESS, 7); *초 =bcdToDec(Wire.read() &0x7f); *분 =bcdToDec(Wire.read()); *시간 =bcdToDec(Wire.read() &0x3f); *dayOfWeek =bcdToDec(Wire.read()); *dayOfMonth =bcdToDec(Wire.read()); *월 =bcdToDec(Wire.read()); *년 =bcdToDec(Wire.read());} float get3231Temp(){ 바이트 tMSB, tLSB; 플로트 temp3231; Wire.beginTransmission(DS3231_I2C_ADDRESS); Wire.write(0x11); Wire.endTransmission(); Wire.requestFrom(DS3231_I2C_ADDRESS, 2); if (Wire.available()) { tMSB =Wire.read(); // 2의 보수 int 부분 tLSB =Wire.read(); // 분수 부분 temp3231 =(tMSB &B01111111); // Tmsb에서 2의 수학을 수행 temp3231 +=( (tLSB>> 6) * 0.25 ); // 비트 7과 8에만 관심이 있습니다. return temp3231; } else { // 오 아니오, 데이터가 없습니다! Serial.println("DS3231 센서 오류 - 온도를 읽을 수 없습니다."); matrix.print(0xBEEF, HEX); // BEEF로 사용자에게 알립니다. matrix.writeDisplay(); 지연(5000); } }
    깃허브
    https://github.com/ILohs/MySketches

    회로도

    LDR 경로 수정됨

    제조공정

    1. Arduino 관점 시계
    2. Arduino로 DIY 가장 간단한 IV9 Numitron 시계
    3. Adafruit 1/4 60 Ring Neopixel을 사용한 간단한 벽시계
    4. 이슬람 기도 시간이 있는 Arduino 시계
    5. 마스터 시계
    6. Arduino Temp. 3.2 디스플레이가 있는 모니터 및 실시간 시계
    7. Arduino Nano:조이스틱으로 2개의 스테퍼 모터 제어
    8. Arduino Apple Watch
    9. 7-세그먼트 어레이 시계
    10. DS1302 RTC가 있는 간단한 알람 시계