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

Arduino 기반 샤워 캐빈 FM 라디오

구성품 및 소모품

Arduino Nano R3
× 1
RDA Microelectronics RDA5807 FM 라디오 모듈
× 1
NXP NOKIA 5110 LCD 3V-5V 버전
× 1
초소형 RTC 모듈(DS1307 + 24c32 EEPROM)
× 1
PAM8403 - 2X3W 클래스 D 증폭기
× 1
Texas Instruments LM2596 DC-DC 강압 컨버터 모듈
× 1
LIR2032 3.6V 충전식 배터리
× 1
저항 100옴
× 1
저항 1k 옴
× 1
저항 10k 옴
× 6
저항 100k 옴
× 1
인피니언 IRLZ44 파워 MOSFET
× 1
PEIYING PY1010C 60W 4Ohm 스피커.
× 1
12V 3A 전원 공급 장치가 스크랩에서 발견되었습니다.
× 1
2200uF 25V 커패시터
× 2
커패시터 100μF
× 1
기존 G4 10W 할로겐을 대체하는 3W LED 전구
× 1

이 프로젝트 정보

몇 년 전, 나는 라디오와 함께 TR028 제어 시스템을 설치한 중국식 샤워 캐빈을 구입했습니다. 불행히도 어느 좋은 날 나는 이 시스템이 완전히 죽은 것을 발견했습니다. 아무도 수리할 수 없었기 때문에 더 저렴한 샤워 라디오를 하나 더 샀습니다. 약 1년 후에 사망했습니다.

우리 가족은 샤워실에 라디오를 가지고 있었기 때문에 이 라디오가 어떻게 만들어졌는지 연구하기 시작했습니다. TR028 시스템 내부에서 이상한 TEA5767 모듈을 발견했습니다. 일부 검색에서는 작고 저렴한 FM 라디오 모듈이라는 것을 알 수 있습니다. 검색 결과에서 또 다른 흥미로운 FM 라디오 모듈인 RDA5807을 찾았습니다. TEA5767과 매우 유사하지만 RDS, 볼륨 제어 및 베이스 부스트 기능이 있습니다. 그래서 내 결정은 내 새 프로젝트에서 RDA5807을 사용하는 것이었습니다.

인터넷을 검색하여 RDA5807 모듈이 사용된 여러 프로젝트를 찾았습니다.

<울>
  • 내 비전에 영감을 준 주요 프로젝트.
  • <울>
  • 큰 신호 강도 기호와 더 유용한 정보를 찾은 변형
  • <울>
  • 또 다른 변형
  • <울>
  • 훌륭한 라디오 모듈 라이브러리
  • <울>
  • 유용한 정보(러시아어)
  • <울>
  • 하나 더
  • 이 프로젝트 중 하나를 반복하는 것이 가능했지만 아무도 내 비전을 정확히 충족하지 못했습니다.

    내 비전은:

    <울>
  • 방수 구조를 보장하는 터치 스크린이 있는 장치. (저는 죽은 TR0289의 터치 패널이 있는 인클로저를 사용했습니다).
  • <울>
  • 라디오
  • <울>
  • 몇 가지 즐겨찾는 라디오 방송국 사전 설정
  • <울>
  • 볼륨 조절
  • <울>
  • 자동 라디오 방송국 탐색 기능
  • <울>
  • 찾은 라디오 방송국 암기 가능
  • <울>
  • 현재 시간을 볼 수 있는 시계입니다.
  • <울>
  • 켜기/끄기 기능
  • <울>
  • 조명 제어
  • <울>
  • 객실 내부 온도, RDS와 같은 일부 사소한 정보가 표시됩니다.
  • Aliexpress에서 RDA5807, 32kb EEPROM이 있는 Tiny RTC, PAM8403, NOKIA 5110 LCD, LM2596 모듈을 10€ 미만에 구입하고 실험을 시작했습니다.

    마침내 얻은 것:

    <울>
  • 2줄(!) RDS가 있는 FM 라디오
  • <울>
  • 좋아하는 라디오 방송국을 위한 6가지 사전 설정
  • <울>
  • 자동 또는 수동 조정
  • <울>
  • 좋아하는 라디오 방송국을 6개의 사전 설정 중 하나에 저장할 수 있음
  • <울>
  • 볼륨 및 베이스 부스트 제어
  • <울>
  • 샤워실 조명 제어
  • <울>
  • 개미 달력
  • <울>
  • RSSI(무선 신호 강도 표시기)
  • <울>
  • 스테레오 모드 표시기
  • <울>
  • 켜기/끄기 기능
  • 프로젝트의 일부 사진

    NOKIA 5110 디스플레이의 경우 멋진 라이브러리를 찾았습니다.

    TR028 터치 패널이 어떻게 작동하는지 이해했습니다. 실제로는 2열 X 7행 키패드입니다. 그것을 작동시키기 위해 나는 이 라이브러리를 사용했습니다.

    상자에 배치된 조립된 보드. USB 소켓을 제거하고 케이블을 직접 납땜한 것을 알 수 있습니다. PC 연결 가능성 및 향후 소프트웨어 개선을 위한 것입니다.

    작동 방식:

    <울>
  • 전원을 연결한 후 라디오가 켜지지 않습니다. 이것은 전력선이 불안정하거나 정전이 된 경우 라디오 재생을 방지합니다. 라디오를 처음 켜려면 전원 공급 장치를 연결하고 몇 초 후에 전원 키를 눌러야 합니다. 라디오는 레벨 03의 볼륨으로 마지막으로 재생된 라디오 방송국을 재생합니다. 작동 모드는 VOLUME 제어입니다. 라디오를 끄려면 전원 키를 누르기만 하면 됩니다. 장치는 LCD, LCD 백라이트, 증폭기 및 LED/할로겐 램프를 끕니다.
  • <울>
  • 라디오 방송국을 찾으려면 "Mod" 버튼을 눌러 자동 또는 수동 튜닝 모드를 선택할 수 있습니다. "<" 또는 ">" 버튼을 누르면 라디오가 주파수를 낮추거나 높이는 라디오 방송국을 검색합니다. 찾은 라디오 방송국을 저장하려면 "Mem" 버튼을 누르면 4초 동안 저장하려는 6개의 사전 설정 중 하나를 선택할 수 있습니다.
  • <울>
  • 현재 날짜를 보려면 I(정보) 키를 누르십시오. 날짜는 4초 동안 표시됩니다. 코드의 이 부분은 delay() 함수를 사용하기 때문에 최적화될 수 있습니다.
  • <울>
  • 시계를 조정하려면 시간 종료 신호(시간 신호)가 들리거나 정확한 시계에서 시간의 마지막 초를 볼 때 D 키를 2초 이상 길게 누릅니다. D 키를 놓아 hh.00.00을 설정합니다. 시계가 15분에서 1분으로 늦었다면 분 초가 00으로 설정되고 시간이 1씩 증가합니다. 시계가 1분에서 15분으로 늦었다면 조정 절차 후 분 초만 00으로 설정됩니다. .
  • 무엇을 변경할까요:

    <울>
  • RTC 모듈의 공진기는 정확도가 더 높지만 클록 조정 기능으로 이 문제를 해결할 수 있습니다.
  • <울>
  • 5110 LCD를 더 크고 더 밝게. 때때로 프로젝트에 사용된 NOKIA 5110 LCD에 대한 정보를 읽기 어렵기 때문에 1, 8" 또는 2.0" 컬러 LCD일 수 있습니다.
  • <울>
  • 2x15W 출력 전력을 갖는 PAM8610 또는 동일한 특성을 가진 TDA7297을 갖는 PAM8403 증폭기
  • 결론:

    새 프로젝트가 작동하는 방식에 만족합니다. 작업 1개월 후 시계 정확도를 제외하고는 문제가 관찰되지 않았습니다.

    저는 프로그래머가 아니므로 코드를 더 잘 최적화할 수 있습니다. 제 C/C++ 프로그래밍 경험은 독학으로 약 1년입니다. Arduino 플랫폼을 사용하는 첫 번째 유용한 프로젝트이자 허브에서 공유하는 첫 번째 프로젝트입니다. 가능한 실수와 저의 서투른 영어를 이해하고 용서해 주십시오.

    질문이 있는 경우 주저하지 말고 댓글이나 PM으로 문의하세요.

    업데이트 1.:사소한 하드웨어 및 소프트웨어 업데이트.

    하드웨어 - 12V 라인에 2A 퓨즈를 설치했습니다. 단지 안전상의 이유로.

    소프트웨어 - 라인 586 menu 추가 <코드>= <코드>1; 전원 키를 누른 후 모드를 VOLUME으로 복원합니다.

    업데이트 2:

    불행히도 내 라디오의 LCD가 죽을 것입니다.

    그래서 저렴한 NOKIA 5110 LCD 대안을 찾고 있습니다. 새 5110 LCD는 작고 읽기 어렵기 때문에 설치하지 않겠습니다. 1.8인치 TFT LCD로 실험해 볼 생각입니다. 좋은 점은 더 크고 더 밝으며 해상도가 더 좋습니다. 나쁜 점은 1.8인치 TFT가 중요한 리소스를 더 많이 소비할 것이라고 확신합니다.

    LCD 교체에 대한 귀하의 조언을 환영합니다.

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

    코드

    <울>
  • 프로젝트 스케치
  • 신호 강도 기호
  • 프로젝트 스케치Arduino
    <사전>///////////////////////////////////////////////// ///////////////////// Arduino 기반 샤워 FM 라디오 프로젝트 //// Arduino NANO, RDA5807M, RTC, EEPROM, LCD5110, 서미스터 //////// ////////////////////////////////////////////////////// /////////#include //http://www.rinkydinkelectronics.com/library.php?id=48#include //https://github. com/cyberp/AT24Cx#include //Arduino IDE 포함#include //http://www.mathertel.de/Arduino/RadioLibrary.aspx#include // http://www.mathertel.de/Arduino/RadioLibrary.aspx#include //https://github.com/adafruit/RTClib#include //http://www. mathertel.de/Arduino/RadioLibrary.aspx#include //http://playground.arduino.cc/Code/Keypad#define MAXmenu 4#define ledPin 13#define blPin 7//심볼 정의 키패드의 버튼문자 키[7][2] ={ {'L', 'P'}, //LED, POWER {'I', 'D'}, //INFO, DISPLAY {'1', '2 '}, //프리셋 {'3', '4'}, //1 {'5', '6'}, //부터 6 {'M', 'm'}, //M ODE, MEM {'<', '>'} //아래로, 위로};바이트 rowPins[7] ={11, 12, 10, 17, 9, 16, 8}; //키패드바이트의 행 핀아웃에 연결 colPins[2] ={15, 14}; //키패드의 열 핀아웃에 연결//키패드 kpd =Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );Keypad 키패드 =Keypad( makeKeymap(keys), rowPins, colPins, 7, 2 ); 부울 베이스 =0, dspl =0, memdisplay =0, mempress =0, adj =0; 부울 ledPin_state, power_state;int 메뉴;int 볼륨, volumeOld =5;int 주파수, frequencyOld;int txtl =0, temparray =0; int samples[5];unsigned int status[6];unsigned long timeprevious =0, timeprev =0;// EEPROM objectAT24CX mem;RTC_DS1307 rtc;//(clk, din, dc, ce, rst)LCD5110 lcd(6, 5, 4, 2, 3);// RDA5807 칩의 인스턴스 생성 radioRDA5807M radio;/// RDS 파서 가져오기RDSParser rds;extern unsigned char SmallFont[];extern uint8_t signal5[];extern uint8_t signal4[];extern uint8_t signal3[];extern uint8_t signal2[];extern uint8_t signal1[];//--------------------------SETUP---- ------------------------------//설정 무효화(){ analogReference(EXTERNAL); Serial.begin(9600); Wire.begin(); // 라디오 초기화 radio.init(); radio.debugEnable(); //화면 초기화 lcd.InitLCD(); lcd.clrScr(); //lcd.setContrast(45); //기본값이 좋지 않으면 조정 lcd.setFont(SmallFont); lcd.enableSleep(); //대기 모드 power_state =0; //전원이 연결되어 있을 때 기기의 전원을 켜지 않음(대기 모드) //키보드 키패드 초기화.addStatedEventListener(keypadEvent); // 이 키패드에 대한 이벤트 리스너를 추가합니다. 키패드.setHoldTime(1500); 핀모드(LED핀, 출력); // 디지털 핀을 출력으로 설정합니다. 핀모드(블핀, 출력); // 디지털 핀을 출력으로 설정합니다. 디지털 쓰기(LED 핀, LOW); // LED를 끕니다. digitalWrite(blPin, LOW); // BL 끄기(대기 모드) ledPin_state =digitalRead(ledPin); // 초기 LED 상태를 저장합니다. LED가 켜져 있을 때 HIGH. //rtc를 조정해야 하는 경우 주석 처리를 제거합니다. /*if (! rtc.isrunning()) { Serial.println("RTC가 실행되고 있지 않습니다!"); // 다음 줄은 RTC를 이 스케치가 컴파일된 날짜 및 시간으로 설정합니다. rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // 이 줄은 명시적 날짜 및 시간으로 RTC를 설정합니다. 예를 들어 // 2014년 1월 21일 오전 3시에 설정하려면 다음을 호출합니다. //rtc.adjust(DateTime(2018, 3, 13, 22, 33, 0) ); }*/ // 마지막 주파수 값 읽기 frequency =mem.readInt(201); 볼륨 =2; // 시작 메뉴의 볼륨 레벨 =1; //(volume <0) volume =0인 경우 시작 시 VOLUMME 모드를 표시합니다. if (볼륨> 15) 볼륨 =15; if (주파수 <0) 주파수 =0; if (주파수> 210) 주파수 =210; 쓰기 등록(0x02, 0xC00d); // 0xC00d를 Reg.2에 씁니다. ( soft reset, enable,RDS, ) //bbz canal(frequency); // RDS 데이터에 대한 정보 체인을 설정합니다. radio.attachReceiveRDS(RDS_process); rds.attachServicenNameCallback(디스플레이 서비스 이름); //rds.attachTimeCallback(디스플레이 타임); //나중에 사용하기 위해. RDS 신호가 약할 때 매우 부정확합니다. rds.attachTextCallback(DisplayText);}//--------------------------설치 종료-------------- ----------------------////------------------------ --LOOP----------------------------------------//무효 루프(){ if ( 주파수 !=frequencyOld) { frequencyOld =주파수; mem.writeInt(201, 빈도); 운하(빈도); } if (볼륨 !=volumeOld) { volumeOld =볼륨; WriteReg(5, 0x84D0 | 볼륨); } //키보드 읽기 char key =키패드.getKey(); //RDS 데이터 확인 radio.checkRDS(); // 0.6초마다 온도 프로브를 5번 읽고 평균 부동 평균을 계산합니다. unsigned long timenow =millis(); if ((unsigned long)(timenow - timeprevious)> 600) { timeprevious =timenow; 샘플[임시] =analogRead(A7); 임시 배열++; } if (temparray ==5) { // 판독값의 평균 계산 평균 =0; for (int i =0; i <5; i++) { 평균 +=샘플[i]; } printTemp(평균); 임시 배열 =0; } // MEM 디스플레이를 위한 4초 타임아웃 및 unsigned long 입력 dabar =millis(); if (멤프레스 ==1) { timeprev =dabar; 메모리 디스플레이 =1; 황후 =0; } if (memdisplay ==1) { if ((unsigned long)(dabar - timeprev) <4000) { memdisplay =1; } else { memdisplay =0; } } /*시간 조정 지침:1. 직렬 모니터를 실행합니다. 2. 9600 boud를 설정합니다. 3. Enter 키를 눌러 직렬 읽기를 활성화합니다. 4. hXX를 작성합니다. 여기서 XX는 일부 시간 서버에서 읽는 현재 시간이고 Enter 키를 눌러 RTC 시간을 조정합니다. 직렬 모니터는 "Hours XX"를 기록해야 합니다. 5. mXX를 기록합니다. 여기서 XX는 특정 시간 서버에서 읽는 현재 분이고 Enter 키를 눌러 RTC 분을 조정합니다. 직렬 모니터는 "분 XX"를 기록해야 합니다. 6. sXX를 기록합니다. 여기서 XX는 일부 시간 서버에서 읽는 현재 초이고 Enter 키를 눌러 RTC 초를 조정합니다. 직렬 모니터는 "초 XX"를 써야 합니다. 7. 시간만 조정할 수 있습니다. 즉. 일광 절약 시간이 변경되었을 때. 8. 시간만 수정해야 하는 경우 초만 조정할 수 있습니다. 9. RTC를 0(년, 월, 일 등)에서 조정해야 하는 경우 RTC 조정 설명 라인의 주석을 제거하고 스케치를 업로드합니다. */ 현재 날짜 시간 =rtc.now(); if (Serial.available()> 0) { char t =Serial.read(); switch (t) { case ('h'):{ unsigned int hours =Serial.parseInt(); rtc.adjust(DateTime(now.year(), now.month(), now.day(), 시간, now.minute(), now.second())); Serial.println(F("시간")); Serial.println(시간); 부서지다; } 케이스('m'):{ unsigned int mins =Serial.parseInt(); rtc.adjust(DateTime(now.year(), now.month(), now.day(), now.hour(), mins, now.second())); Serial.println(F("분")); Serial.println(분); 부서지다; } 케이스('s'):{ unsigned int sec =Serial.parseInt(); rtc.adjust(DateTime(now.year(), now.month(), now.day(), now.hour(), now.minute(), sec)); Serial.println(F("초")); Serial.println(초); 부서지다; } } } //LCD에 각종 정보 표시 printSignalStrength(); 인쇄라인(); 인쇄시간(); 인쇄주파수(); 인쇄 스테레오(); 인쇄 모드(); 인쇄메뉴(); 인쇄날짜(); lcd.update();}//------------------------- 루프 끝---------------- ----------------------//void printSignalStrength() //0000에서 1111까지(0-63){ unsigned int sig; 상태 읽기(); 시그 =상태[1] / 1000; if ((sig>=0) &&(sig <=12)) { lcd.drawBitmap(1, 1, signal1, 17, 6); } if ((sig>=13) &&(sig <=24)) { lcd.drawBitmap(1, 1, signal2, 17, 6); } if ((sig>=25) &&(sig <=36)) { lcd.drawBitmap(1, 1, signal3, 17, 6); } if ((sig>=37) &&(sig <=48)) { lcd.drawBitmap(1, 1, signal4, 17, 6); } if (sig>=49) { lcd.drawBitmap(1, 1, signal5, 17, 6); }} 무효 printLines(){ lcd.drawLine(0, 9, 84, 9); lcd.drawLine(0, 39, 84, 39);}void printTemp(float average) //최적화 가능 :){ 평균 /=5; 평균 =1023 / 평균 - 1; 평균 =51700 / 평균; 플로트 스타인하트; steinhart =평균 / 50000; // (R/Ro) steinhart =log(steinhart); // ln(R/Ro) steinhart // 3950; // 1/B * ln(R/Ro) steinhart +=1.0 / (25 + 273.15); // + (1/To) steinhart =1.0 / steinhart; // steinhart 반전 -=273.15; // 섭씨 변환 int tmp =round(steinhart); lcd.printNumI(tmp, 60, 1, 2); lcd.print(F("~C"), 72, 1);}/// RDS mode.void DisplayServiceName(char *name){ lcd.print(name, 18, 22);}void DisplayText(char *text){ //두 번째 RDS 줄 스크롤 lcd.print(text, txtl, 30); txtl =txtl - 66; if (txtl ==-396) txtl =0;}무효 printTime(){ DateTime now =rtc.now(); lcd.printNumI(지금.시간(), 24, 1, 2, '0'); lcd.print(":", 36, 1); lcd.printNumI(now.minute(), 42, 1, 2, '0');}void printDate(){ if (dspl ==1) { //디스플레이 키가 눌렸는지 확인 ClearRDS(); 지금 날짜 시간 =rtc.now(); lcd.printNumI(now.year(), 12, 22, 4); lcd.print(".", 36, 22); lcd.printNumI(now.month(), 42, 22, 2, '0'); lcd.print(".", 54, 22); lcd.printNumI(now.day(), 60, 22, 2, '0'); int dw =now.dayOfTheWeek(); 스위치 (dw) { 경우 0:lcd.print(F("Sekmadienis"), CENTER, 30); //sdram break를 저장하기 위한 일요일 F() 매크로; 사례 1:lcd.print(F("피르마디에니스"), CENTER, 30); //월요일 등... break; 사례 2:lcd.print(F("안트라디에니스"), CENTER, 30); 부서지다; 사례 3:lcd.print(F("Treciadienis"), CENTER, 30); 부서지다; 사례 4:lcd.print(F("Ketvirtadienis"), CENTER, 30); 부서지다; 사례 5:lcd.print(F("Penktadienis"), CENTER, 30); 부서지다; 사례 6:lcd.print(F("Sestadienis"), CENTER, 30); 부서지다; } lcd.update(); 지연(4000); //최적의 ClearRDS()가 아님; dpl =0; }} 무효 printMode(){ lcd.print(F("모드 "), 0, 41);} 무효 printMenu(){ if (메뉴 ==1) { lcd.print(F("볼륨 "), 30, 41); if (볼륨 <0) { lcd.print(F("XX"), 72, 41); } else lcd.printNumI(볼륨 + 1, 72, 41, 2, '0'); } if (메뉴 ==2) { lcd.print(F("자동 조정"), 30, 41); } if (메뉴 ==3) { lcd.print(F("MAN.-TUNE"), 30, 41); } if (메뉴 ==4) { lcd.print(F("저음"), 30, 41); if (저음 ==0) { lcd.print(F("OFF"), 66, 41); } else lcd.print(F(" 켜짐"), 66, 41); }}void printFreq() //현재 주파수 표시{ int frHundr, frDec; 부호 없는 int fr; fr =870 + 주파수; frHundr =fr / 10; frDec =fr % 10; lcd.printNumI(frHundr, 30, 12, 3); lcd.print(F("."), 48, 12); lcd.printNumI(frDec, 54, 12, 1); lcd.print(F("MHz"), 66, 12);}void printStereo(){ if (memdisplay ==1) { //MEM 키를 눌렀을 경우 lcd.print(F("MEM>"), 0 , 12); } //스테레오 감지 else if ((status[0] &0x0400) ==0) lcd.print(F("( )"), 0, 12); // MONO를 의미합니다. else lcd.print (F("(ST)"), 0, 12); // STEREO를 의미함} 무효 검색(바이트 디렉토리) //자동 검색{ 바이트 i; //위 또는 아래를 찾습니다. if (!directec) WriteReg(0x02, 0xC30d); 그렇지 않으면 WriteReg(0x02, 0xC10d); for (i =0, i <10, i++) { delay(200); 상태 읽기(); if (상태[0] &0x4000) { 빈도 =상태[0] &0x03ff; 부서지다; } }}void canal( int canal) //직접 주파수{ 바이트 numberH, numberL; numberH =운하>> 2; numberL =((관 및 3) <<6 | 0x10); Wire.beginTransmission(0x11); Wire.write(0x03); Wire.write(숫자H); // 주파수를 비트 15:6에 쓰고 조정 비트를 설정합니다. Wire.write(numberL); Wire.endTransmission();}//RDA5807_adrs=0x10;// 순차적 액세스를 위한 I2C 주소 RDA 칩int Readstatus(){ Wire.requestFrom(0x10, 12); for (int i =0; i <6; i++) { status[i] =256 * Wire.read() + Wire.read(); } Wire.endTransmission();}//RDA5807_adrr=0x11;// I2C-Address RDA Chip for random Accessvoid WriteReg(byte reg, unsigned int valor){ Wire.beginTransmission(0x11); Wire.write(reg); Wire.write(값>> 8); Wire.write(valor &0xFF); Wire.endTransmission(); //delay(50);}void RDS_process(uint16_t block1, uint16_t block2, uint16_t block3, uint16_t block4) { rds.processData(block1, block2, block3, block4);}void ClearRDS(){ lcd.print(" ", 0, 22); lcd.print(" ", 0, 30);}// 특별한 이벤트 처리 시간 종료 시간 신호를 듣거나 정확한 시계에서 마지막 시간 초를 볼 때 키 D를 2초 이상 누르십시오. 2. 키 D를 놓아 hh.00.00을 조정합니다. 3. 아터 조정, 만약 당신의 시계가 15분에서 1분으로 늦었다면, 분과 초는 00이 될 것이고 시간은 1만큼 증가할 것입니다. 4. 당신의 시계가 1분에서 15분으로 빨랐다면, 분과 초만 00이 될 것입니다. */ case HOLD:if (key =='D' &&power_state ==1) { adj =1; } 부서지다; 해제된 경우:if (key =='D' &&adj ==1) { DateTime now =rtc.now(); if (now.minute()>=45 &&now.minute() <=59) { rtc.adjust(DateTime(now.year(), now.month(), now.day(), now.hour() + 1, 0, 0)); } if (now.minute()>=1 &&now.minute() <=15) { rtc.adjust(DateTime(now.year(), now.month(), now.day(), now.hour( ), 0, 0)); } 조정 =0; } 부서지다; case PRESSED:if (키 =='M' &&power_state ==1) { memdisplay =0; 메뉴++; if (메뉴> 최대메뉴)메뉴 =1; } if (키 =='>' &&power_state ==1) { memdisplay =0; 스위치(메뉴) { 경우 1:if (볼륨 <0) { if (저음 ==0) { WriteReg(0x02, 0xD00D); 볼륨 =0; } if (베이스 ==1) { WriteReg(0x02, 0xC00D); 볼륨 =0; } } 그렇지 않으면 볼륨++; (볼륨> 15) 볼륨 =15인 경우; 부서지다; 사례 2:검색(0); 클리어RDS(); 부서지다; 사례 3:빈도++; if (주파수> 210)주파수 =210; // 주파수 상한 ClearRDS(); 부서지다; 경우 4:if (저음 ==0) { 저음 =1; 쓰기 등록(0x02, 0xD00D); } 부서지다; } } if (키 =='<' &&power_state ==1) { memdisplay =0; 스위치(메뉴) { 케이스 1:볼륨--; if (볼륨 <0) { WriteReg(0x02, 0x800D); //볼륨 =0; } 부서지다; 사례 2:search(1); 클리어RDS(); 부서지다; 사례 3:주파수--; if (주파수 <0)주파수 =0; 클리어RDS(); 부서지다; 경우 4:if (베이스 ==1) { 베이스 =0; 쓰기 등록(0x02, 0xC00D); } 부서지다; } } // LED 켜짐/꺼짐 if (key =='L' &&power_state ==1) { digitalWrite(ledPin, !digitalRead(ledPin)); ledPin_state =디지털 읽기(ledPin); // 점등 또는 소등 LED 상태를 기억합니다. } // "전원"을 켜거나 끕니다(대기 모드) if (key =='P') { digitalWrite(blPin, !digitalRead(blPin)); power_state =디지털 읽기(blPin); if (power_state ==0) { lcd.enableSleep(); 디지털 쓰기(LED 핀, LOW); } 그렇지 않으면 lcd.disableSleep(); 볼륨 =2; 메뉴 =1; } if (키 =='1' &&power_state ==1) { 스위치(memdisplay) { 경우 0:주파수 =mem.readInt(110); 클리어RDS(); 부서지다; 사례 1:mem.writeInt(110, 빈도); 메모리 디스플레이 =0; 부서지다; } } if (키 =='2' &&power_state ==1) { 스위치(memdisplay) { 경우 0:주파수 =mem.readInt(120); 클리어RDS(); 부서지다; 경우 1:mem.writeInt(120, 빈도); 메모리 디스플레이 =0; 부서지다; } } if (키 =='3' &&power_state ==1) { 스위치(memdisplay) { 경우 0:주파수 =mem.readInt(130); 클리어RDS(); 부서지다; 사례 1:mem.writeInt(130, 빈도); 메모리 디스플레이 =0; 부서지다; } } if (키 =='4' &&power_state ==1) { 스위치(memdisplay) { 경우 0:주파수 =mem.readInt(140); 클리어RDS(); 부서지다; 사례 1:mem.writeInt(140, 빈도); 메모리 디스플레이 =0; 부서지다; } } if (키 =='5' &&power_state ==1) { 스위치(memdisplay) { 경우 0:주파수 =mem.readInt(150); 클리어RDS(); 부서지다; 사례 1:mem.writeInt(150, 빈도); 메모리 디스플레이 =0; 부서지다; } } if (키 =='6' &&power_state ==1) { 스위치(memdisplay) { 경우 0:주파수 =mem.readInt(160); 클리어RDS(); 부서지다; 사례 1:mem.writeInt(160, 빈도); 메모리 디스플레이 =0; 부서지다; } } if (키 =='m' &&power_state ==1) { mempress =1; } else { 멤프레스 =0; } if (키 =='나' &&power_state ==1) { dspl =1; } 부서지다; }}
    신호 강도 기호C/C++
    #if defined(__AVR__) #include  #define imagedatatype const uint8_t#elif defined(__PIC32MX__) #define PROGMEM #define imagedatatype const unsigned char#elif defined(__arm__) #define PROGMEM #define imagedatatype const unsigned char#endifimagedatatype signal5[] PROGMEM={0xC1, 0xC2, 0xC4, 0xFF, 0xC4, 0xC2, 0xC1, 0xC0, 0xE0, x10, 0xC0, 0xF0, 0xC0, 0xF0, 0xC0, 00xF8 , }; 이미지 데이터 유형 신호4[] PROGMEM={0xC1, 0xC2, 0xC4, 0xFF, 0xC4, 0xC2, 0xC1, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, // 픽셀 0xF0, 0xC0, 0xF8, 0x0xC };이미지 데이터 유형 신호3[] PROGMEM={0xC1, 0xC2, 0xC4, 0xFF, 0xC4, 0xC2, 0xC1, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, // 0xF0, 0xC0, }픽셀;이미지 데이터 유형 신호2[] PROGMEM={0xC1, 0xC2, 0xC4, 0xFF, 0xC4, 0xC2, 0xC1, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0xC0, 0xC0, 0) 픽셀 imagedatatype signal1[] PROGMEM={0xC1, 0xC2, 0xC4, 0xFF, 0xC4, 0xC2, 0xC1, 0xC0, 0xE0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, // 0x0010 (16) 픽셀0xC0, };

    회로도


    제조공정

    1. 라디오
    2. 집적 회로
    3. JX 웨이브 생성기
    4. 모션센스
    5. 퍼즐박스
    6. 샤워 조절기
    7. 무선 IR 온도 스캐너
    8. WalaBeer 탱크
    9. 마이크로컨트롤러 연구실
    10. MOSMusic