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

50년 ​​동안 지속되는 생일 알림

구성품 및 소모품

Arduino Nano R3
ATmega168P-AU가 있는 Nano 또는 Mini의 중국 복제품
× 1
Intersil ISL1208 RTC
× 1
Renata CR2450N 코인 셀
× 1
CP2102 USB-직렬 모듈
× 1
USBasp 프로그래머
× 1
32.768KHz 크리스탈
× 1
SPST 스위치
× 1
SMD LED
× 1
투명 LED 돔
× 1
4" x 4" 스위치 박스
또는 인클로저를 3D로 인쇄할 수 있습니다.
× 1
Perfboard
× 1
Berg 커넥터(M 및 F 모두)
× 1
저항 4.75k 옴
× 3
저항 10k 옴
× 2

필요한 도구 및 기계

드레멜
납땜 인두(일반)

앱 및 온라인 서비스

ProgISP
퓨즈와 플래시를 프로그래밍합니다.
Arduino IDE

이 프로젝트 정보

네, 제목을 정확히 읽으셨습니다. 생일을 잊어버린 적이 있습니까? 다른 사람이 생일을 상기시켜 줄 필요가 있습니까? 또는 사랑하는 사람에게 50번 생일을 축하해줄 기기를 선물할 수 있다면 어떨까요? ? 농담이 아닙니다. 이 간단한 Arduino 기반 생일 알람 단일 CR2450 코인 셀에서 실행 배터리가 다 떨어지기 전에 50년 동안 사랑하는 사람(또는 자신)의 생일을 축하할 수 있습니다.

비슷한 프로젝트를 검색했지만 아무것도 찾지 못했기 때문에 누군가가 이렇게 생일 알람을 만드는 것은 이번이 처음인 것 같습니다. 이 프로젝트는 내 개인 프로젝트 웹사이트(https://www.vishnumaiea.in/projects/hardware/birthday-reminder-device-that-will-run-for-50-years-on-a-coin- 셀

Hackaday Coin Cell Challenge의 일환으로 이것을 구축했습니다. 이 생일 알람이 내 마음에 떠올랐고 우리가 동전 전지에서 무언가를 실행할 수 있는 기간을 조사하기 시작했습니다. 나는 이전에 어떤 마이크로컨트롤러의 절전 모드도 사용한 적이 없습니다. 그래서 MCU를 미친듯이 낮은 전류에서 실행하고 세포의 모든 에너지를 절약하는 방법에 대한 모든 것을 배워야 했습니다. 정말 도전이었습니다! ATmega168P를 마이크로컨트롤러로 사용(실제로는 전압 레귤레이터, USB 브리지 등 원치 않는 구성 요소를 모두 제거하여 ATmega168P가 있는 Arduino Nano를 수정했습니다)하고 Arduino IDE를 사용하여 펌웨어를 개발했습니다.

USB를 통해 직렬 모니터를 통해 시간과 생일 날짜를 프로그래밍할 수 있습니다. 시간과 알람이 설정되면 MCU는 절전 모드로 전환됩니다. 현재 RTC 시간이 매년 생일과 일치하면 LED가 1분 동안 깜박이고 직렬 모니터에 생일 축하 메시지를 인쇄합니다. 평균 전류 소비는 약 1.2uAh(자체 방전 포함)로 CR2450(540mAh) 리튬 코인 셀에서 50년 이상 사용할 수 있습니다.

기능

<울>
  • 1.22 uAh 셀 자체 방전을 포함한 평균 전류 소비(608nA 셀 CR2450N에서 전류계로 측정한 자체 방전을 고려하지 않음)
  • 다양한 유형의 리튬 코인 셀에 대한 실제 작동 시간은 다음과 같습니다. >29 CR2023(225mAh)에서 년, >50 CR2450N(540mAh)에서 몇 년 및 >64 CR2477N(950mAh)에서 몇 년. [실제 작동 시간은 해당 기간 동안 배터리의 물리적 및 화학적 상태에 따라 다릅니다.]
  • 생일은 USB를 통해 간단한 명령으로 직렬 모니터 소프트웨어를 통해 설정 및 업데이트할 수 있습니다.
  • 전용 시간 설정 스위치로 원하는 시간을 설정, 확인 및 업데이트할 수 있습니다.
  • 소프트웨어 시간 설정은 컴퓨터에서 실행되는 앱으로 매우 정확하게 설정할 수 있음을 의미합니다(처리 기반 시간 설정/동기화 소프트웨어 개발 중)
  • 오픈 소스 - 모든 디자인 파일과 소프트웨어 코드는 자세한 문서 및 고해상도 이미지와 함께 다운로드할 수 있습니다.
  • 이제 이것을 구축하는 방법에 대한 지침을 안내하고 실제 전류 소비 테스트를 보여드리겠습니다.

    1단계:Arduino Nano 수정

    이 프로젝트의 경우 베어 마이크로컨트롤러를 사용하거나 Arduino Nano를 사용할 수 있습니다. 또는 미니 무대. 필요한 것은 내부 발진기(1MHz)와 전체 1.8~5V 작동 범위에서 실행해야 한다는 것입니다. CR2450 또는 이와 유사한 리튬 셀의 공칭 전압은 3V이므로 전압 조정기를 사용하지 않고 MCU를 실행할 수 있습니다. 중국 클론이나 Nano 및 Mini는 칩 가격으로 구입할 수 있는 매우 저렴합니다! CH340G USB에서 직렬 브리지로. 아래는 제가 사용한 것입니다.

    나는 ATmega168과 328 버전을 모두 가지고 있었습니다. 몇 년 전에 실수로 168 버전을 구입했습니다(지금은 용도를 찾았습니다). 이 특정 보드에서 제거해야 합니다.

    <울>
  • USB 대 직렬 브리지 IC인 CH340G입니다.
  • USB 5V에 연결된 Shchottky 다이오드.
  • CH340G의 TX 및 RX 핀에 연결된 2개의 1K 저항
  • RX, TX 및 PWR LED(SMD)
  • AMS1117 5V 전압 조정기.
  • 디버깅을 위해 13번 핀의 LED를 메인 플래셔로 사용했기 때문에 제거하지 않았습니다. 커패시터는 노이즈 감쇠에 도움이 되므로 제거할 필요가 없습니다. 레귤레이터를 제거한 후에는 이미지와 같이 전압 레귤레이터의 패드를 단락시켜야 합니다. 이는 PCB 설계에 사용된 라우팅 때문입니다. 퓨즈 비트를 변경하는 데 필요하므로 MCU의 수정 발진기를 아직 제거하지 마십시오. MCU에는 외부 16MHz 수정에서 실행되도록 하는 기본 Arduino 부트 로더 및 퓨즈 설정이 있습니다. 내부 OSC를 사용하도록 퓨즈를 설정하기 전에 수정을 제거하면 ISP 프로그래머로 칩을 프로그래밍할 수 없습니다. 아래는 Arduino Nano의 수정된 버전입니다.

    2단계:ATmega168P의 퓨즈 비트 변경

    일반적으로 Arduino 보드의 칩은 Arduino 부트로더 및 퓨즈 비트와 함께 제공됩니다. 저전력 모드에서 MCU를 실행하려면 이것을 변경해야 합니다. 이를 달성하기 위해서는 다음이 필요합니다.

    <울>
  • MCU를 1MHz에서 실행합니다. 내부 발진기를 활성화하고 "8로 나누기" 비트를 활성화하여 8MHz에서 1MHz 클록을 생성할 수 있습니다. 클럭 속도가 낮을수록 전력 소비가 줄어듭니다. 여기서는 숫자를 계산하지 않을 것이므로 1MHz이면 충분합니다.
  • 브라운아웃 감지(BOD) 모듈을 비활성화합니다.
  • ADC, 타이머 등과 같은 모든 내부 모듈을 비활성화합니다. 소프트웨어에서 이 작업을 수행합니다.
  • 워치독 타이머(WDT)를 비활성화합니다.
  • 핀 13, 2, 3을 제외한 모든 IO 핀을 입력하고 LOW로 설정합니다.
  • 위는 ATmega168P의 퓨즈 설정입니다. ATmega 칩에는 피코 전원 기능이 있기 때문에 "P" 버전이 필요합니다. 일반 버전(비 P)은 이러한 추가 절전 모드를 지원하지 않습니다. 따라서 P 버전을 얻으십시오. 이제 내가 328 대신 168을 사용하는 이유가 궁금할 것입니다. 그 이유는 내가 회로를 테스트할 때 328이 동일한 코드에 대해 약 30uA를 소비하는 것처럼 보였고 168에 사용했던 설정은 약 2uA만 소비했기 때문입니다. 왜 그런지 모르겠습니다. 아까도 말했지만 딥슬립 같은 절전 모드를 만지작거리고 있는 건 이번이 처음이다. 그래서 내가 뭔가를 놓치고 있을지도 몰라. 그것에 대해 아는 것이 있으면 댓글로 알려주십시오.

    퓨즈 비트를 변경하려면 ISP 프로그래머가 필요합니다. 많은 ISP 프로그래머와 호환 소프트웨어가 있습니다. USBasp를 사용했습니다. 프로그래머 및 ProgISP 프로그래밍 소프트웨어로. 내가 사용한 ATega168P-AU의 칩 ID 또는 서명은 1E940B입니다. . 버전에 따라 달라질 수 있습니다. 퓨즈 비트를 변경하려면:

    <울>
  • USBasp를 Nano에 연결합니다. 일반적으로 USBasp에는 10핀 커넥터가 있지만 Nano에는 6핀 ISP 헤더가 있습니다. 그래서 간단한 10핀-6핀 어댑터를 만들었습니다. 비슷한 것을 만들거나 케이블을 찾아야 할 수도 있습니다.
  • 목록에서 MCU 모델을 선택하고 RD로 서명을 확인합니다. 버튼.
  • 아래 이미지와 같이 확인란과 퓨즈 비트를 설정하고 자동 버튼 또는 쓰기 퓨즈 설정 창의 버튼을 눌러 퓨즈 비트를 업데이트합니다.
  • 성공하면 콘솔에 메시지가 인쇄됩니다. 이제부터 MCU를 플래시하려면 ISP가 필요합니다. 아래는 제가 사용한 USBasp입니다.

    3단계:컴파일 및 업로드

    이제 마이크로컨트롤러의 퓨즈 비트를 변경했으므로 Arduino IDE 내에서 코드를 올바르게 컴파일할 수 있도록 변경 사항을 Arduino 소프트웨어와 컴파일러에 알려야 합니다. 이를 수행하는 방법은 "boards.txt"에 사용자 정의 보드 정의를 추가하는 것입니다. 일반적으로 <설치된 위치>/Arduino/hardware/arduino/avr/boards.txt"에 있는 Arduino 설치 디렉토리에 있는 파일 Windows 시스템에서. 사용 중인 OS 또는 IDE 버전에 따라 다를 수 있습니다. IDE 버전 1.8.5를 사용하고 있습니다.

    boards.txt 파일을 찾으면 새 Arduino Pro Mini의 사용자 정의 정의를 추가해야 합니다. 판자. 라인 655 주변에서 기존 Pro Mini 보드 정의가 시작됩니다. 많은 버전의 보드가 있을 것입니다. 따라서 새로운 변형을 추가해야 합니다. 여기에 다음 정의를 추가하고 저장합니다.

    ## Arduino Pro 또는 Pro Mini(3.3V, 1MHz) w/ ATmega168 ## ------------------------- ---------------------- pro.menu.cpu.1MHzatmega168=ATmega168(3.3V, 1MHz) pro.menu.cpu.1MHzatmega168.upload .maximum_size=14336 pro.menu.cpu.1MHzatmega168.upload.maximum_data_size=1024 pro.menu.cpu.1MHzatmega168.upload.speed=19200 pro.menu.cpu.1MHzatmega168.bootloader.low_fuse .bootloader.high_fuses=0xDF pro.menu.cpu.1MHzatmega168.bootloader.extended_fuses=0xF9 pro.menu.cpu.1MHzatmega168.bootloader.file=atmega/ATmegaBOOT_168_pro_8MHz.hex pro.menu. .menu.cpu.1MHzatmega168.build.f_cpu=1000000L  

    그리고 여기 스크린샷이 있습니다.

    Arduino가 실행되지 않는 동안 boards.txt를 편집해야 합니다. 새 boards.txt 파일을 저장하고 Arduino IDE를 다시 시작하면 목록에 방금 추가한 새 보드가 표시됩니다. 아래 스크린샷을 살펴보세요.

    이제 새 보드용 Arduino 코드를 컴파일할 준비가 되었습니다. Arduino 부트로더(BL)를 사용하지 않기 때문에 , 프로그램의 16진수 파일을 만들고 USBasp 및 ProgISP를 사용하여 마이크로 컨트롤러를 플래시해야 합니다. "컴파일된 바이너리 내보내기"를 사용하여 이 작업을 수행할 수 있습니다. IDE의 스케치 메뉴에서 옵션을 선택하거나 Ctrl + Alt + S를 누르십시오. . 그렇게 하면 두 개의 hex 파일 (인텔 형식)은 스케치가 있는 동일한 디렉토리에 생성됩니다. 하나의 hex 파일은 BL이 있고 다른 하나는 BL이 없습니다.

    16진수 파일이 있으면 ProgISP에서 플래시 로드를 선택합니다. MCU를 플래시할 16진수 파일을 로드하는 옵션을 선택한 다음 자동을 누릅니다. 단추. 업로드에 성공하면 ProgISP의 콘솔에 인쇄됩니다.

    4단계:Intersil ISL1208 I2C RTC

    Intersil ISL1208 I2C 인터페이스가 있는 저전력 RTC 칩입니다. 외부 32.768KHz 크리스털을 사용하여 시간을 추적합니다. 월-일-시-분-초 알람 레지스터가 있습니다. VBAT 작동에서 약 400nA만 소비하고 VDD에서 최대 1.2uA를 소비합니다. 작동 전압은 1.8V ~ 5.5V입니다. 이것을 좋은 후보로 만드는 것은 전력 소비와 월-일 알람 기능입니다. DS1307과 같은 일반 RTC에는 알람 레지스터에 월 설정이 없으므로 매년 생일 알람을 생성할 수 없습니다. 250mS를 생성하는 인터럽트 출력 핀이 있습니다. 현재 시간이 알람 날짜 및 시간과 일치할 때 활성 LOW 신호. 이것을 사용하여 MCU를 절전 모드에서 깨우겠습니다. 이에 대해서는 아래에서 자세히 설명하겠습니다.

    ISL1208의 기능

    <울>
  • 실시간 시계/달력
  • -시간, 분, 초 단위로 시간 추적
  • - 요일, 일, 월, 연도
  • 15개의 선택 가능한 주파수 출력
  • 단일 알람
  • - 초, 분, 시, 요일, 일 또는 월로 설정 가능
  • - 단일 이벤트 또는 펄스 인터럽트 모드
  • 배터리 또는 슈퍼 커패시터에 자동 백업
  • 정전 감지
  • 온칩 발진기 보정
  • 2바이트 배터리 지원 사용자 SRAM
  • I2C 인터페이스
  • - 400kHz 데이터 전송 속도
  • 400nA 배터리 공급 전류
  • ST M41Txx 및 Maxim DS13xx 장치와 동일한 핀 출력
  • ISL1208의 SMD 버전이 있었기 때문에 메인 보드에 연결하기 위해 브레이크아웃 보드를 만들어야 했습니다. 아래는 제가 만든 것입니다.

    5단계:CR2450N 코인 셀

    사양

    <울>
  • 화학 시스템 - Li / MnO2(IEC 60086에 따름)
  • 공칭 전압 - 3V
  • 정격 용량 - 540mAh
  • 표준 방전 전류 - 0.8mA
  • 최대. 계속 방전 전류 - 3.0mA
  • 평균 무게 - 5.9g
  • 작동 온도* - -40 - +85°C
  • 23°C에서 자체 방전 - <1%/년
  • 유효 기간 - 최대 10년
  • 6단계:회로도

    위의 회로도를 사용하여 perfboard에 모듈을 납땜하십시오. 2개의 4.7K 저항은 I2C 풀업입니다. . 값의 범위는 3.3K에서 5.6K 이상입니다. R2 및 R3은 인터럽트 핀용 풀업입니다. Arduino Nano에는 두 개의 하드웨어 인터럽트 핀(디지털 핀 3과 2)이 있습니다. 디지털 핀 2는 RTC의 알람 깨우기 인터럽트에 사용되고 디지털 핀 3은 시간을 설정해야 할 때 MCU를 깨우는 데 사용됩니다. 아래는 CP2102입니다. 내가 사용한 USB-to-Serial 모듈.

    USB-to-Serial 모듈은 직렬 모니터를 통해 통신하는 데 사용됩니다. CP2102의 RX 및 TX 핀은 각각 Nano의 RX 및 TX 핀에 연결됩니다. USB의 +5V를 주 VCC 전압에 연결하면 안 됩니다.

    7단계:작동 원리는 무엇입니까?

    장치의 작동은 실제로 간단합니다. 주요 알고리즘이 어떻게 작동하는지 봅시다.

    <울>
  • 시리얼 모니터를 통해 RTC의 현재 시간을 설정합니다.
  • RTC에서 알람 시간과 날짜를 설정합니다.
  • MCU는 타이머와 ADC를 포함한 내부 주변 장치를 비활성화하여 시간과 알람을 설정한 후 절전 모드로 들어갑니다.
  • 현재 시간이 알람 날짜 및 시간(MM, DD, hh, mm, ss, p)과 일치하면 RTC가 생성 및 인터럽트하고 MCU를 절전 모드에서 깨웁니다.
  • 깨어나면 MCU가 필요한 내부 주변 장치를 활성화하고 직렬 모니터에 생일 축하 메시지를 인쇄합니다. 돔 내부의 LED도 일정한 패턴으로 깜박입니다.
  • 생일 축하 인사 후 MCU는 다시 절전 모드로 전환되어 내년 생일에만 깨어납니다.
  • 하지만 시간 업데이트 스위치를 돌려 시간을 확인하고 필요할 때마다 업데이트할 수 있습니다. 켜짐.
  • 처음 전원을 켰을 때 모든 RTC 레지스터는 0이 되며 처음 쓰기 전까지는 증가하지 않습니다. RTC에서 시간을 설정하려면

    <울>
  • 시간 업데이트 스위치를 켜십시오(디지털 핀 3을 GND에 연결). 3번 핀을 LOW로 당기지 않고는 시간을 설정할 수 없습니다.
  • 먼저 USB 케이블을 사용하여 장치를 컴퓨터에 연결합니다. 통신을 위해 PC에 COM 포트가 설정됩니다.
  • 장치 관리자에서 장치의 COM 포트를 찾습니다.
  • 기기의 COM 포트로 직렬 모니터 소프트웨어 또는 Arduino 직렬 모니터를 엽니다.
  • MCU는 시리얼 모니터에 아래 메시지를 출력합니다.

    일련 설정됨. 시간을 업데이트할 준비가 되었습니다. 
    <울>
  • "t" 보내기 명령은 현재 시간을 인쇄합니다. "a" 알람 날짜와 시간을 인쇄하고 "c" 6초 후에 시간 설정 작업을 취소하고 MCU를 절전 모드로 전환합니다.
  • 아래 표시된 형식으로 현재 시간을 보내야 합니다.
  • TYYMMDDhhmmssp# 

    어디에:

    <울>
  • =시간 정보를 나타냅니다.
  • YY =연도의 최하위 숫자(예:2018년의 경우 18, 범위는 00~99)
  • MM =월(예:1월의 경우 01, ​​범위는 01~12)
  • DD =날짜(예:24, 범위는 01~31)
  • =시간(예:06, 범위는 12시간 형식의 경우 01~12)
  • mm =분(예:55, 범위는 00~59)
  • =초(예:30, 범위는 00~59)
  • p =12시간 형식의 하루 중 기간(0 =AM, 1 =PM)
  • # =구분자
  • 예를 들어 시간과 날짜를 "08:35:12 AM, 05-01-2018"로 설정하려면 다음을 보내야 합니다.

    T1801050835120# 

    장치:

    <울>
  • T =시간 정보를 나타냅니다.
  • 18 =2018년
  • 01 =1월 월
  • 05 =날짜
  • 08 =시간
  • 35 =분
  • 12 =초
  • 0 =오전
  • # =구분자
  • 작업이 성공하면 MCU는 수신된 시간을 콘솔에 다음과 같이 인쇄합니다.

    시간 업데이트 수신 =T1801050835120날짜 및 시간은 오전 8:35:12, 5-1-18 

    입력한 시간 문자열이 유효하지 않은 경우 아래 메시지가 출력됩니다.

    잘못된 시간 입력 - <원래 문자열>, <원본 문자열 길이> 

    시간을 성공적으로 설정하면 RTC가 전원을 사용할 수 있는 한 계속해서 시간을 추적합니다. "t"를 전송하여 방금 설정한 시간을 확인할 수 있습니다. 명령. 알람 설정은 데이터 형식이 다르다는 점을 제외하고는 이와 유사합니다. 알람을 설정하려면 다음과 같이 보내야 합니다.

    AMMDDhhmmssp# 

    어디에:

    <울>
  • A =알람 정보를 나타냅니다.
  • MM =월
  • DD =날짜
  • =시간
  • mm =분
  • =초
  • p =기간(0 =오전, 1 =오후)
  • # =구분자
  • 알람 문자열에는 연도 정보가 없습니다. 분명히 필요하지 않기 때문입니다. 예를 들어 내 생일을 "08:00:00 AM, 28-08"로 설정하려면 다음을 보내야 합니다.

    A08240800000# 

    "a" 명령으로 언제든지 알람 시간을 확인할 수 있습니다. . 알람 시간과 날짜가 설정되면 MCU를 절전 모드로 전환해야 합니다. 따라서 장치는 다음 메시지를 인쇄합니다.

    모든 것이 설정되었습니다. 지금 시간 설정 핀을 비활성화하십시오. 

    이제 시간 설정 스위치를 꺼야 합니다. 즉, 디지털 핀 3을 HIGH로 당겨야 합니다(10K 풀업이 그렇게 할 것입니다). 이 작업을 수행할 때까지 시스템이 절전 모드로 전환되지 않습니다. 시간 설정 스위치를 OFF로 하면 6초 후에 슬립 모드로 진입하고 그 전에 아래 메시지를 출력합니다.

    잘했습니다! 6초만에 잠.. 

    그래서 시간과 알람을 설정합니다. 이제 시간을 확인하거나 업데이트해야 할 때마다 타이머 설정 스위치를 켜면 시스템이 깨어나 직렬 통신을 설정하고 시간을 보내라는 메시지를 표시합니다. 깨어나면 다음 메시지가 출력됩니다.

    일련 설정됨.시간 업데이트 깨우기. 시간 업데이트 준비 완료. 

    시간이 정확한지 확인하는 중이고 아무 것도 변경하지 않으려면 "c"를 보내세요. 명령을 실행하여 작업을 취소하고 시스템을 다시 절전 모드로 전환합니다. 이때 시간 설정 스위치도 비활성화해야 합니다.

    현재 시간이 알람 시간과 일치할 때 ie. 생일에 RTC는 Nano의 디지털 핀 2에 250mS 인터럽트 신호를 생성합니다. 이 신호는 시스템을 깨울 것입니다. 깨어나면 장치가 생일임을 인식하고 직렬 통신을 설정하고(USB가 연결된 경우에만) 다음 메시지를 인쇄합니다.

    따다! 당신의 생일입니다! 해피 비데이 <이름> :) 다음 생일에 만나요! TC. 안녕!6초 후에 자.. 

    또한 디지털 핀 13에 연결된 LED가 깜박입니다. 다음은 시스템을 테스트하는 동안 Arduino 직렬 모니터의 스크린샷입니다.

    이것이 바로 이 장치를 작동하는 방법입니다. 코드 수준에서 이것을 이해하려면 다음 섹션을 읽으십시오.

    8단계:코드

    이 프로젝트는 완전히 오픈 소스이므로 MIT 라이선스에 따라 GitHub(https://github.com/vishnumaiea/Birthday-Alarm/)에 펌웨어 소스 코드를 게시했습니다. 제한 없이 자유롭게 수정, 수정 및 재배포할 수 있습니다. 수정한 프로젝트에서 이 프로젝트에 대한 백링크를 추가해 주시면 감사하겠습니다. 코드에 주석을 철저히 달았고 가능한 한 간단하게 만들었습니다.

    코드에는 총 13개의 함수/프로시저가 있습니다. 그들은:

    <사전><코드>1. 무효 설정()

    이것은 모든 것을 초기화하고 ISl1208 RTC의 구성 레지스터를 설정하는 Arduino의 설정 기능입니다.

    <사전><코드>2. 무효 루프()

    메인 루프 기능입니다.

    <사전><코드>3. 무효 sleepNow()

    이 기능은 모든 통신을 종료하고 MCU의 내부 주변 장치를 비활성화하고 인터럽트를 디지털 핀 3과 2에 연결하고 시스템을 딥 슬립 모드로 전환합니다. 인터럽트 발생 시 프로그램 실행은 sleep_mode() 이후 행에서 계속됩니다. . 이 정상적인 프로그램 실행이 재개되기 전에 MCU는 alarmInterrupt()인 인터럽트 핀과 관련된 인터럽트 서비스 루틴을 완료했을 것입니다. 및 timeUpdateInterrupt()

    <사전><코드>4. 무효 alarmInterrupt()

    INT0과 연결된 ISR 디지털 핀 2의 인터럽트

    <사전><코드>5. 무효 timeUpdateInterrupt()

    INT1과 연결된 ISR 디지털 핀 3의 인터럽트

    <사전><코드>6. 무효 fetchTime()

    fetchTime() RTC의 시간 레지스터를 읽고 현재 시간을 콘솔에 인쇄합니다.

    <사전><코드>7. 무효 깜박임LED()

    LED를 분명히 깜박입니다.

    <사전><코드>8. 부울 설정 직렬()

    USB-to-Serial 모듈의 도움으로 직렬 통신을 설정합니다.

    <사전><코드>9. 부울 endSerial()

    시리얼 통신을 종료합니다.

    <사전><코드>10. 바이트 bcdToDec(바이트)

    BCD 허용 (Binary Coded Digits) 값을 변환하고 해당 10진수 값으로 변환합니다. RTC 레지스터는 BCD 값만 저장하고 수락하기 때문에 이것이 필요합니다. 따라서 때때로 BCD로 또는 BCD에서 변환해야 합니다.

    <사전><코드>11. 바이트 decToBcd(바이트)

    10진수 값을 허용하고 해당 BCD 값으로 변환합니다.

    <사전><코드>12. 무효 printTime()

    "t"일 때 RTC 시간 레지스터를 읽고 현재 시간을 콘솔에 인쇄합니다. 명령이 수신되었습니다.

    <사전><코드>13. 무효 printAlarmTime()

    RTC 알람 레지스터를 읽고 "a" 명령이 수신되었습니다.

    9단계:테스트

    이것은 내가 어떻게 코인 셀에서 50년 동안 작동하는 장치를 만들게 되었는지 알게 될 이 프로젝트의 가장 흥미로운 부분일 것입니다! 먼저 브레드보드에서 전체 회로의 프로토타입을 만들고 설계를 마무리했습니다. 새 코인 셀을 저장하기 위해 테스트 목적으로 리튬 이온 배터리(3.6V)를 사용했습니다. Fluke 87 True RMS를 사용했습니다. 현재 측정을 위한 멀티미터. 0.1uA가 있습니다. 마이크로 암페어 범위의 정밀도.

    Atmega168P를 최대 절전 모드로 전환하고 전류 소비를 크게 줄이는 방법을 살펴보겠습니다.

    noInterrupts(); //일시적으로 인터럽트 비활성화 set_sleep_mode(SLEEP_MODE_PWR_DOWN); // 선호하는 절전 모드를 선택합니다. sleep_enable(); // 슬립 활성화(SE) 비트 설정:ADCSRA =0; //ADC 비활성화 power_all_disable(); //모든 모듈 비활성화 digitalWrite(LED_PIN, LOW); // 슬립 인터럽트를 나타내기 위해 LED를 끕니다(); // 인터럽트 재활성화 sleep_mode(); //잠자기 상태로 전환  

    이전에 말했듯이 마이크로컨트롤러(MCU)에서 절전 모드를 사용한 것은 이번이 처음입니다. AVR 절전 모드와 관련된 대부분의 정보는 이 포럼 스레드와 AVR 라이브러리 문서에서 찾을 수 있습니다.

    ATmega168P에는 5가지 절전 모드가 있습니다.

    <울>
  • SLEEP_MODE_IDLE – 전력 절약 최소화
  • SLEEP_MODE_ADC
  • SLEEP_MODE_PWR_SAVE
  • SLEEP_MODE_STANDBY
  • SLEEP_MODE_PWR_DOWN – most power savings
  • More info on the sleep modes can be found here and in this video. We're using the SLEEP_MODE_PWR_DOWN mode as you can see there. At this mode, the current consumption at 3.6V is only around 0.2 uA See the below graph from the ATmega168PA datasheet that shows the relation between active current vs supply voltage and power down current vs supply voltage.

    Here's the actual reading of the current consumed by sleeping ATmega168P @1MHz.

    The value hops between 0.1 uA and 0.2 uA due to the lack of precision. But such a precise measurement isn't necessary but would've been interesting to see.

    The power consumption of ISL1208 RTC at max is 1.2 uA . So if we add this with the power down mode current consumption of the MCU we get 1.2 + 0.2 =1.4 uA . My meter measured between 1.4 uA and 1.6 uA which justifies the calculations. The variations is only due to the lack of precision and our approximation or rounding of numbers.

    Here's an unlisted video from my YouTube channel where I show the testing.

    Now let's do the simple math to find how long we can the system on a coin cell. The CR2450N from Reneta has a nominal capacity of 540mAh . I have two red SMD LEDs on the system which consume about 6 mA (even with two LEDs) with when turned ON. So that's the peak current consumption of the device at worst. How long these LEDs light up can be summarized as,

    1. As long as the time setting switch is activated while you're setting the time (but you don't have to do this every year)

    2. The 6 second delay before sleep.

    3. LED flashes on your birthday and stay ON for about 19 seconds.

    Let's not be accurate here but just make an approximation. Let's assume the time setting requires 2 minutes (LEDs will be ON for 2 mins) and and additional 1 minute ON time for other things including the birthday flashing. So it's total 3 minutes or 180 seconds for which the system consumes 3 mA 현재의. Let's take the sleep or idle current as 1.6 uA , though it's lower actually. There's 31557600 seconds in a year of 365.25 days. If LEDs stay ON for 180 seconds in a year and OFF for (31557600 - 180) seconds, then the average current consumption will be,

    Average Current =[((6 x 10^-3) x 180) + ((1.6 x 10^-6) x 31557420))] / 31557600 =(1.08 + 50.491872) / 31557600 =51.571872 / 31557600 =1.634 x 10^-6 =1.634 uAh 

    If the average current consumption is 1.634 uAh, then the 540 mAh cell can run the device for:

    Time Span (approx) =(540 x 10^-3) / (1.634 x 10^-6) =330477.3562 hours =13769.88 days =37.699 years 

    Note than this approximation is do not consider self-discharge of the battery. It'll be taken into account later. You can also use the ElectroDroid app to calculate battery life. Here's a screenshot of the calculations we just did.

    BUT WAIT...

    Can we reduce the current consumption further ? YES WE CAN! I made further optimizations to my design to limit the average current consumption to 0.6 uA , yes I did that. Not let's see what optimizations I did,

    1. To remove the extra red SMD LED to reduce the current when the system is active/running. Before it was 6 mA at max with two LEDs. So with one LED, it'll be reduced to half, ie 3 mA.

    2. To reduce the current consumption of RTC, we need to disconnect the VDD pin of the ISL1208 RTC from the VBAT pin. Previously the VDD pin was connected to the VBAT pin where I supplied the 3V from the cell (you can see this in the schematic). In that configuration, I also had the LOW_POWER mode bit (LPMOD ) of the RTC set to 1 activating the low power mode. So now you might think if the low power mode is set, then the chip might be consuming the lowest current. But that's not the case when we have the VDD tied to VBAT. Because low power mode bit is only useful if we have VDD> VBAT all the time. At such situation, the RTC's internal power switch will select VBAT as power source reducing the current further by 600 nA when VDD>=VBAT (from typical 1.2 uA which I've mentioned before). But if we can run the RTC in VBAT only with VDD =0, the current consumption can be reduced to the minimum ie, 400 nA as per the datasheet. So what I did is, first I disabled the low power mode by setting LPMOD to 0. Then added a jumper to the RTC breakout board to disconnect the VDD pin from VBAT when I don't need it. Why need the jumper is because, the VDD pin must be greater than or equal to VBAT in order for the I2C to work. So I can connect the jumpers when I need I2C while I'm setting the time, and can disconnect it after. This will let the RTC to consume the targeted 400 nA current. Tada! We did it!

    Now that we have reduced the current consumption of the RTC from 1.2 uA to 0.4 uA (400 nA), we can do the math again!

    System Active Current =3 mAh max

    System Sleep Mode Current =0.4 uA (RTC) + 0.2 uA (MCU) =0.6 uAh

    System ON time =60 s (time setting) + 19 s (birthday flashing) + 6 s (before sleep) =85 seconds

    System Sleeping Time =31557600 s - 85 s =31557515 seconds

    Total time in a year =31557600 seconds

    Battery capacity =540 mAh

    Here's the current consumption test video after the optimizations and mods.

    If we put those new values to the ElectroDroid's battery life calculator, we get, 101 years and 136 days. A theoretical operating time of more than a century! The average current consumption is now only 608 nA . Here's the screenshot.

    Okay, What's the actual operating time ?

    Batteries aren't perfect, nor anything we design. So let's also consider the 1% self discharge of the cell into account.

    1% of initial capacity of 540 mAh CR2450N =5.4 mAh

    Self-discharge current =5.4 mA per year or 616.4 nAh (5.4 mA / hours in a year)

    Adding this 616.4 nAh with the 600 nAh sleep current =1.216 uAh

    Expected operating time with average current of 1.224 uAh =50 years, and 131 days.

    That's the actual operating time if the cell will be fine

    Here's a table of actual operating times of different types of coin cells with the 1% self-discharge of initial capacity every year.

    The main practical concerns associated with running the device for such long periods are,

    1. Will the battery retain the charge and voltage for that long ?

    2. The effects of environmental variations on the circuit and battery performance.

    3. And you screwing up things! XD (don't drop it, chew it, sit on it, run your car through it or launch it into space!)

    Coin cells are usually made to last for 10 years, which is their shelf life , and some even last longer than that. But that doesn't mean they'll start to disintegrate to an useless state after that. If the cell is physically fine, it can still power things. As per Renata datasheet, the self-discharge rate of CR2450N is less than 1% of the capacity every year. As per this datasheet from Energizer, that 1% figure is of the fresh capacity. Below is a chart that shows the standard discharge time in years (this doesn't consider the self-discharge or other exceptions). It clearly shows the theoretical expected operating time is way too longer than 10 years.

    Self-discharging not only reduces the capacity but also reduces the voltage. Both ATmega168P and ISL1208 are designed to be operated fine at voltages as low as 1.8V. So the reduction in voltage might not be a problem. You can learn more about running systems with coin cells here.

    To ensure long operating span, we must make sure the device is properly concealed against much of the environmental changes such as temperature, humidity, corrosion etc. These are some things you can do to protect your circuits,

    1. Coat the PCB with long lasting conformal coating.

    2. Place a pack of silica gel inside the enclosure.

    3. Seal the enclosure with less temperature conductive materials and make it air tight.

    4. Place it somewhere safe from naughty hands!

    Step 10:Building

    I used a perfboard to solder everything as per the schematic. I used berg connectors for the battery, switch and LED so that it'll be easy to remove them if needed. Below are the some images of the PCB.

    To build the enclosure I used a 4" x 4" switch box which I bought from an electrical shop. I made two rectangular holes for the switch and USB. You can 3D print an enclosure if you want; sadly I don't have one. The dome was snatched from a cheap LED light and used super glue to fix it on the box. I painted it with silver spray paint.

    Use your ingenuity to build it.

    What missing is some decorations . I'm not good at decorating things. If you are going to gift this to someone, you know what to do.

    The final output is satisfying to the extend of my hardwork. I might find someone else to decorate it.

    Step 11 :Improvements

    항상 개선의 여지가 있습니다. Some of my suggestions are,

    1. Using a Nokia 5110 LCD with or instead of the LED bulb. The LCD controller only consumes a couple of 100 uA at normal operating modes without the LED backlighting of course. Monochrome LCDs only consume extremely low currents. So using it would be better than a flashing LED, where you can actually print the happy birthday message on the screen itself. I might do this in future because I have couple of them lying around here.

    2. A software that runs on the computer that'll set/sync the time accurately and automatically. I'm thinking of developing a simple one using Processing.

    3. Flashing the LEDs to indicate the current age - for example if it's your 5th birthday (OMG are you're reading this ?!), it'll flash a sequence for 5 times. Currently you can not set the current age in the system. You may add this.

    4. Designing a dedicated PCB in eagle (planned).

    5. If blinking LED isn't your thing you can actually make this more exciting with for example using an opto-coupler you can turn on an AC alarm, music player, lights or anything you want to blink, move and scream on the birthday of the one you wish. You can even exclude the microcontroller and only use the interrupt from the RTC. Everything's possible!

    So what are you waiting for ? Make one, decorate it with stickers, color papers, glitter or anything and gift to your loved ones or even yourself! And tell them to wait for this magical device to wish them happy birthday.

    What you see here is actually a prototype of a device that'll refine and release in future. So stay tuned. Please feel free to share if you have found any errors with this documentation or have any improvement suggestions. Happy making :)

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

    코드

    Birthday Alarm
    https://github.com/vishnumaiea/Birthday-Alarm

    회로도

    Schematic of Arduino clone.

    제조공정

    1. Industry 4.0 및 IoT:향후 몇 년 동안의 시장 동향
    2. 귀하의 애플리케이션에 완벽한 스위치를 찾기 위한 10가지 요소
    3. NVIDIA:모든 AI 모델을 실행하는 CUDA-X AI 컴퓨터
    4. Kontron:열악한 환경에서 사용하기 위한 40 기가비트 이더넷 스위치
    5. 그 방향을 잡지 마십시오! 콜드 장착에 대한 적절한 지침
    6. 사이버 범죄자에게 COVID는 계속 주는 선물입니다
    7. 발전기 업그레이드를 위한 7가지 신호
    8. 모터 되감기 시간을 나타내는 3가지 신호
    9. 완벽한 PCB 조립을 설명하는 관행
    10. 그것을 위한 로봇이 있습니다!