', { cookie_domain: 'auto', cookie_flags: 'max-age=0;domain=.tistory.com', cookie_expires: 7 * 24 * 60 * 60 // 7 days, in seconds }); 'Making' 카테고리의 글 목록 :: MakerLee's Workspace
728x90
반응형

 

집에 있던 소형 태양광 패널을 이용해서 작은 박스를 만들고 베란다에 걸어서 한달가량 확인을 해 봤습니다. 
결론적으로 말하면 전압이 거의 떨어지질 않습니다. 
물론 연결되는 노드가 없어서 전파 송수신이 없다는 상황이 있긴 합니다
그래도 대기상태로는 충전 없이도 18650 1개(2400mAh)로 최소 2-3주 가까이 노드 연결을 확인할 수 있고,
여기에 손바닥만한 태양전지 하나만 붙여도 전압 하강을 볼 수 없을 정도라는건
제가 생각했던 것보다 전력 소모가 상당히 적다는 것입니다. 






 

 

아예 방전시켜서 바깥에 걸어놓으면 배터리가 핸드폰 고속충전마냥 올라가는 것을 볼 수 있습니다. 

 

 

 

 


중국 커뮤니티에서 제작한 GAT562라는 장비를 하나 구매해 봤는데
이쪽은 진짜 작은 패널을 붙여놨네요. 이정도로도 기본전력을 감당할 수 있다는 거겠죠


손바닥만한 패널로도 기본적인 외부운영은 충분히 가능하지 않을까 추측합니다. 

728x90
반응형
728x90
반응형

테스트용 회로를 만들어서 시험을 하는 건 좋은데 영 진도가 나가질 않고 있었습니다. 

테스트 회로를 만들어 작동시험을 해도 영 작동이 애매한 부분이 많았거든요. 

 

 

 

 

 

 

VFD는 필라멘트 전압보다 그리드/세그먼트가 높은 전위를 갖게 되면 전자의 방출로 인해 세그먼트가 빛나게 되는건 파워 서플라이를 연결해서 확인했습니다. 

하지만 PT6315등의 VFD 드라이버는 음전압을 사용하는게 기준으로 되어 있죠. 

대신 필라멘트에 음전압의 바이어스 전압을 걸어 전위를 낮추고 gnd 가 되면 전위가 높아져 빛나는 구조고요. 

그래서 음전압을 만들어 사용하다보니 테스트과정에 문제가 있더군요.

해당 소자가 빛나는게 소프트 문제인지 하드 문제인지 파악하기가 매우 힘듭니다. 

단순하게 소자에 gnd를 연결한다고 빛나는것도 아니라서 좀 더 제대로 된 테스트 장비가 없으면 회로 디버깅이 어려워요. 

 

 

 

그래서 가격문제로 접어두고 있던 MAX6921을 사용하기로 하고 회로를 다시 만들었습니다. 

PT6315는 4~500원 꼴인데 MAX6921은 개당 3천원이라고 아꼈는데 몇천원갖고 이 고생하느니 편하게 가는게 좋을 것 같습니다. 

 

그리고 파워 부분은 아예 모듈화시켜서 쓰기로 했습니다.

드라이버 보드마다 별도로 납땜하느니 별도 보드를 만들어서 올려버리는게 훨씬 편하겠더군요.

 

 

 

 

 

 

 

728x90
반응형
728x90
반응형

틈나는대로 하나씩 하나씩 구매하다 보니 VFD가 많이 쌓였습니다. 

문제는 이게 통합 드라이버 같은건 만들기가 매우 힘듭니다.

핀아웃도 모두 다르고 핀 간격도 모두 다릅니다. 

드라이버 보드를 제작하려면 어느 정도 통일성이 있어야 편할텐데 그런 게 없습니다. 

 

 

 

 

 

그래서 아예 범용 테스트 보드를 만들었습니다. 

PT6315와 VFD 사이에는 일일이 점퍼로 연결을 해야 합니다만

일단 갖고 있는 여러개의 VFD를 테스트하고 나면 개별적으로 회로를 만들어 줄 계획입니다

 

 

 

728x90
반응형

'Making > VFD 드라이버' 카테고리의 다른 글

VFD 드라이버 진행상황 정리.  (0) 2025.08.01
VFD 드라이버 - VFD용 전원회로 제작  (0) 2025.04.22
VFD 자료정리, 재고정리  (0) 2025.03.04
VFD 디스플레이 테스트  (0) 2025.03.03
728x90
반응형

https://github.com/gargomoma/fakeTec_pcb

 

GitHub - gargomoma/fakeTec_pcb: A low-cost nrf52 device.

A low-cost nrf52 device. Contribute to gargomoma/fakeTec_pcb development by creating an account on GitHub.

github.com

NRF52840 Super mini 보드와 별도의 SX1262 기판을 납땜해서 Meshtastic 기기로 사용할 수 있는 FakeTec 프로젝트입니다. 

손땜했더니 블루투스 연결이 잘 안 되길래 그냥 홧김에 PCB 거버를 다운받아서 바로 JLCPCB에 주문했습니다. 

 

 

 

 

 

 

nrf52840 supermini 보드는  2~3$, SX1262 모듈은 4~5$ 선에서 구매 가능하고

PCB는 10개 3~5$ 정도입니다. 1개 기준으로 1만원도 안 들죠.
다만 PCB 송료가 12~30$까지 들기 때문에 한두개만 제작할 경우에는 비용이 많이 상승합니다. 

 

 

 

 

 

 

 

NRF52840기기를 2개 구매했는데 하나는 뭐가 잘못됐는지 제대로 작동을 안 하고 하나는 블루투스 연결해서 설정을 바꾸거나 하면 1~2분씩 먹통이 됩니다. 기기 문제인지 뭔지 모르겠더라고요. 

 

 

 

 

 

 

그래서 새 PCB를 주문... 
하는김에 다른 프로젝트 하던것도 급히 마무리해서 한번에 넘겼습니다. 

 

 

 

기존 PCB형태는 되게 좁게 되어 있어서 왜 그런가 했더니

Heltec 제품과 동일 사이즈로 만들어서 케이스 등을 그대로 사용할 수 있게 한 거였습니다.

저는 직접 설계해서 맞추면 되기 때문에 딱히 욕심이 없어서 좀 더 제작과 수정이 쉽게 편집해서 재주문했습니다. 

 

 

 

 

 

작동은 잘 됩니다. 
다만 블루투스 문제는 다른것도 마찬가지더군요. 설정할때마다 1~2분씩 걸립니다.
다른 NRF52840 보드는 안 그런데 왜 이것만 오래 걸리는지 모르겠습니다만

아예 안되는게 아니고 그냥 좀 더 오래 걸리기만 하는거라 이대로 쓰면 될 것 같습니다.

728x90
반응형
728x90
반응형

'

 

 

 

 

 

 

뚜르비옹 설계 수정했다.
첫번째 버전은 만들고 보니 생각보다 크기가 컸고 부품간 상관관계를 생각하지 않고 만들어서 수정도 애매했다.
이제 크기도 많이 줄였고 스케치에서 수정하면 전체적으로 잘 조정된다.

728x90
반응형

'Making > 탈진기 설계와 제작' 카테고리의 다른 글

탈진기 수정 마무리와 공구 제작.  (0) 2024.07.02
두번째 설계한 탈진기 테스트  (0) 2024.04.16
새 탈진기 설계와 조정.  (0) 2024.04.04
탈진기 첫 테스트.  (0) 2024.03.01
포크와 롤러 설계  (0) 2024.02.25
728x90
반응형

 

 

 

 

 

https://heltec.org/project/mesh-node-t114/

 

Mesh Node T114 (Rev. 2.0), nRF52840 + SX1262 LoRa Node +GPS, Meshtastic and LoRaWAN Compatible

Widely welcomed nRF52840 + SX1262 LoRa Node, Meshtastic and LoRaWAN Compatible, with a 1.14-inch TFT display and GPS extension port.

heltec.org

 

NRF52840 기반 보드를 찾다 보니 심플하고 괜찮아 보여 구매했습니다. 

옵션에서 디스플레이와 케이스, GPS와 케이스 까지 선택할 수 있습니다. 

 

리튬 배터리와 솔라 패널 연결 커넥터가 있습니다. 

많은 다른 기기들과 마찬가지로 충전 칩은 TP4056계열이라 5V이상 가는 태양광 패널은 사용 불가능합니다. 

 

 

 

 

 

 

 

 

만듦새는 매우 깔끔하고 소형이며 휴대가 편리합니다만 현재 치명적 버그가 있습니다. 

GPS 모듈이 필요시에만 켜지지 않고 항상 활성화되어 있어 전력이 누설되는 문제가 있어 아직 해결되지 않고 있는데요. 

펌웨어 수정으로 해결이 가능할지 여부도 아직 확실하지 않습니다. 

728x90
반응형
728x90
반응형

 

wisblock 홈페이지를 보면 한국에서 전파인증을 받은 사실을 알 수 있습니다. 

 

 

한국에서 쓸 수 있는 KC 인증된 LoRa 모듈은 여러 가지가 있지만 Meshtastic 펌웨어를 지원하는 모듈은 한정되어 있는데요.

개인이 기기를 1대씩 구매해서 전파인증 면제를 받는 방법이 있긴 합니다. 

다만 이 경우 합법적 사용을 위해서는 같은 기기를 반복 구매하면 안되고 다른 기기를 구매해야 하죠. 

 

 

 

 

 

 

 

meshtastic 지원 보드는 종류가 많기 때문에 그냥 종류별로 구매하면 노드 대여섯개를 합법적으로 사용할 수 있습니다. 

하지만 이런 편법은 운용 측면에서 문제가 많죠. 

 

 

 

 

검색을 하다 보니 Wisblock RAK 모듈을 판매하는 곳이 있긴 하더군요.

https://tosscore.com/product/rak-wisduo-lpwan-kr920-lora-sx1262-x-ble-nrf52840-ipex-%ED%83%80%EC%9E%85-%EB%AA%A8%EB%93%88-rak4630-k/1314/category/43/display/1/

 

토스코어(TossCore)

KORE한국총판/ 2.4Ghz무선통신/ 지그비모듈/ lora모듈/ 블루투스모듈/ 데이터로거/ 시리얼장비/ 멀티미터/ 교육용키트

tosscore.com

 

다만 아쉽게도 코어 보드 형태인 RAK4631을 판매하는 게 아니고 그 위의 모듈인 RAK4630을 판매합니다. 

베이스 보드도 판매하지 않고 RAK3172 모듈과 세트로만 판매를 하더군요. 

그리고 펌웨어가 RUI 버전이 들어있어 meshtastic 펌웨어를 업로드하려면 별도의 JLink가 필요합니다. 

 

 

 

 

 

RAK4631과 어떤 차이냐 하면 RAK4630은 저 사진의 초록색 부분이고요. 

아래쪽의 인터페이스 보드가 납땜된 것을 RAK4631로 부릅니다. 

 

 

어쨋건 저 PCB 만 확인하면 한국에서 구매한 RAK4630 코어를 사용할 수 있을 것 같아 홈페이지를 뒤져봤습니다. 

의외로 4631 코어 PCB의 내용은 별거 없고 USB가 바로 커넥터로 빠지게 되어 있네요

그래서 다시 베이스 보드의 데이터쉬트를 확인해 봤습니다. 

 

 

 

 

 

 

이쪽도 마찬가지네요. ESD 보호회로 정도만 있고 나머지는 충전 및 전원과 관련된 보호회로 정도입니다.

그렇다는 건 그냥 USB만 납땜해도 쓸 수 있다는 얘기죠. 

Jlink를 구매해서 펌업하고 테스트해 볼 예정입니다. 

 

 

 

 

 

 

** 디스코드 서버를 열었습니다. **

 

https://discord.gg/KxCcbDT3am

커뮤니티 없이 meshtastic 프로젝트를 하는건 많이 힘듭니다.

 

한국 meshtastic 유저 커뮤니티 Discord 서버에 가입하세요!

Meshtastic 한국 사용자 커뮤니티입니다. LoRa 메쉬 네트워크 관련 정보를 나누고 소통합니다. | 멤버 18명

discord.com

 

모여서 같이 정보를 나누고 서로 도움이 되었으면 좋겠습니다. 

728x90
반응형
728x90
반응형

노드 운용 실패후 NRF52840칩을 사용하는 보드를 구매하면서 ESP32보드와의 전력 사용량 차이를 측정해 보기로 했습니다. 

이미 많이 알려진 wisblock 의 RAK4631+RAK19007 콤보(위쪽)와
TTGO의 ESP32 Lora meshtastic(아래쪽) 보드입니다. 


우측의 seeed studio제품은 나중에 추가할 예정입니다. 

 

 

 

 

아두이노로 전류미터를 만들다가 타오바오에서 주문한 물건이 도착하여 만들던 건 치워두고 이 제품을 사용했습니다. 
신뢰도는 잘 모르겠는데 일단 간단하게 확인한 결과로는 쓸만한 것 같습니다. 

 

 

 

 

 

시험조건은 간단합니다. 

그냥 기본펌웨어 상태로 켠 다음 핸드폰과 연결된 노드로 살아있는지 확인해둔 상태로 그냥 방치했습니다. 

 

[테스트 노드] <---LoRa---> [ 연결용 기기 ] <----블루투스---> [핸드폰]

상태입니다. 

 

 

 

 

이대로 3일 넘게 두었고 사용된 전류를 기록후 다시 TTGO의 제품으로 변경 후 며칠간 전류를 측정했습니다. 

 

 

 

 

 

 

 

 

 

결과는 생각보다 격차가 매우 컸는데요

 

 

RAK4631(NRF52840)은 

평균 4.36mAh 를 사용하는 것으로 측정되었고

 

TTGO Lora(ESP32)는 

평균 49mAh를 소모하는 것으로 측정되었습니다. 

 

TTGO 제품이 OLED가 달려있는 등의 차이를 감안해도 10배가 넘는 수치는 엄청나네요. 

전력관리에 주의해야 하는 설치형 노드는 NRF52840칩을 사용하는 제품을 써야할 것 같습니다. 

 

 

----------------------------------------6/9 추가---------------------------------------

Seeed Studio의 Xiao NRF52840 kit 의 전류 소모량은 평균 4.09mAh

 

728x90
반응형
728x90
반응형

오픈채팅은 수다떨긴 좋지만 글이 올라가 버리면 찾기도 힘들고 다른 커뮤니티는 그냥 없네요. 

디스코드 열어보는건 처음인데 아직 카테고리 설정과 멤버 관리를 끝마치진 못했지만 조금씩 수정해나가려 합니다. 

 

https://discord.gg/KxCcbDT3am

 

한국 meshtastic 유저 커뮤니티 Discord 서버에 가입하세요!

Meshtastic 한국 사용자 커뮤니티입니다. LoRa 메쉬 네트워크 관련 정보를 나누고 소통합니다. | 멤버 18명

discord.com

 

728x90
반응형
728x90
반응형

지난번 회로는 수정후 설치했더니 노드가 또 바로 죽는 바람에 ㅜㅜ 

더이상 집에서 떨어진 곳에 노드를 설치할 생각을 버렸습니다. 

테스트는 역시 가까운 곳에서 해야겠어요. 

 

회로를 또 수정했습니다.

태양광 패널을 여기저기서 한개씩 구매했더니 스펙이 다 달라서 그걸 사용하기 좀 편하도록 다시 수정하고

부품 배치를 좀 바꾸고 등등... 

 

 

 

 

 

 

이젠 이런 장비가 없으면 납땜이 힘듭니다. 

 

 

 

 

 

 

 

 

테스트기를 2대 제작해 실외주차한 차량위에 1대, 실내 대쉬보드에 1개 올려놨습니다. 

배터리는 18650 1100mAh정도 되는것을 2개 병렬로 놓아 용량은 대략 2200mAh가 될 거고요.

3.4V까지 방전시킨 상태로 시작했습니다. 

 

 

 

 

 

 

 

이렇게 하니 방안에서 모니터링도 가능하고 좋네요. 배터리 전압이 잘 올라가고 있군요

진작 이렇게 할걸 1년간 괜한 뻘짓을 한 것 같습니다. 

 

 

 

 

 

 

차량이 위치한 곳은 대략 위와 같은 느낌의 주차장이었습니다. 

보시다시피 햇빛이 들긴 하지만, 각도에 따라 나무 그림자가 생기기도 하고요. 

 

 

 

 

 

 

 

이틀이 지나 확인해 보니 전압 그래프가 위와 같이 나왔습니다.
그래프가 직선으로 나온 부분은 핸드폰 연결이 끊어져 그런 것이고 전체적으로 그냥 꾸준히 방전하는 모습입니다. 

제가 사용한 태양광 패널은 6W로 표기가 되어 있습니다. 

사전 조사했을 때 대략 5W 급이면 meshtastic 기기의 전력량을 감당한다고 알게 되어 사용한 것인데요. 

환경적으로 완벽하지가 않다 보니 이 용량으로는 부족한 것 같습니다. 

 

다음 테스트는 2배 이상으로 12~20W 정도로 해 봐야 할 것 같습니다. 

 

 

 

 

 

 

 

 



 

** 디스코드 서버를 열었습니다. **

https://discord.gg/KxCcbDT3am

 

한국 meshtastic 유저 커뮤니티 Discord 서버에 가입하세요!

Meshtastic 한국 사용자 커뮤니티입니다. LoRa 메쉬 네트워크 관련 정보를 나누고 소통합니다. | 멤버 18명

discord.com

 

 

커뮤니티 없이 meshtastic 프로젝트를 하는건 많이 힘듭니다.

모여서 같이 정보를 나누고 서로 도움이 되었으면 좋겠습니다. 

728x90
반응형
728x90
반응형

https://www.youtube.com/watch?v=8vqKecG5FtU

 

포스팅 정리하다가 보니 블로그에 마무리하지 않은 프로젝트들이 있어서 정리중입니다. 

728x90
반응형

'Making > USB 오토릴' 카테고리의 다른 글

USB 오토릴 #4 - PCB 제작.  (0) 2023.08.24
USB 오토릴 #3 - 수정본 테스트  (0) 2023.08.09
USB 오토릴 #2 - 첫번째 테스트  (0) 2023.07.31
USB 오토릴 #1 - 구상.  (1) 2023.01.01
728x90
반응형

타오바오에서 VFD 디스플레이를 많이 구매한 김에 드라이버를 제작해 보기로 했습니다. 

 


LCD라던가 LED 매트릭스라던가 디지털 구동만 하는 물건을 쓰다가

아날로그 구동을 하는 물건을 쓰려 하니 어려운 부분이 많더군요. 

이론은 아래 링크를 참조했습니다. 

https://www.noritake-elec.com/technology/general-technical-information/vfd-operation

 

A Guide to Fundamental VFD Operation - NORITAKE U.S.A., INC. Electronics Division

Learn about the technology behind Noritake VFDs (Vacuum Fluorescent Display). Explore display construction, signal timings, and the grid and anode power supply.

www.noritake-elec.com

 

 

https://www.youtube.com/watch?v=gZIRPJt69sM

 


그리드와 애노드를 이용하면 가로세로로 전기를 넣어 매트릭스 구조로 불을 밝힐 수 있습니다.

여태 써왔던 LED 매트릭스와 다를 게 없지만 쓰이는 전기가 단순히 5V레벨로 가능한 게 아니었습니다. 

애노드와 그리드는 20V 전후의 직류전압이 필요하고, 필라멘트는 2~3V 정도의 교류전압이 필요합니다. 

 

 

 

 

 

 

 

그리드와 애노드는 일단 미뤄놓고, 필라멘트부터 보겠습니다. 

단순히 2~3V를 필라멘트 양단에 걸면 일단 전자가 나오긴 하고 그리드를 지나 애노드에 닿아 빛이 나죠. 

그런데 위와 같이 양쪽의 전압차로 인한 불균형으로 휘도가 달라지는 문제가 생깁니다. 

 

 

그래서 교류를 만들어서 걸어야 합니다. 

 

 

 

 

 

 

 

 

이론은 그렇다 치고, 문제는 AC 전원을 어떻게 만들어야 하는지 모르겠다는 것이었습니다. 

한참의 시간과, ChatGPT의 도움과, 오픈소스 회로도의 도움을 얻어 몇 가지 힌트를 얻었습니다. 

일단 논리 게이트 중 7404 인버터 게이트를 이용해서 PWM 신호를 얻습니다. 

그리고 이걸 h 브릿지 회로 또는 DC모터 드라이버에 입력해서 출력을 얻어내면 됩니다. 

 

 

 

다만 이 회로는 AC주파수 조정이 어렵더군요. 

그리고 캐패시터와 저항 등 값이 뭔가 맞지 않으면 결과가 이상하게 나옵니다. 

 

 

몇가지 테스트후 이건 포기하고 555타이머를 써서 출력을 얻기로 했습니다. 

https://visual555.tardate.com/ 

온라인 555타이머 시뮬레이터를 사용하면 간단하게 어떤 부품을 쓰면 어떤 출력이 나오는지 알 수 있습니다. 
astable / monostable 모드의 차이 등은 GPT에게 물어보니 자세히 가르쳐 주더군요. 

다만 일반적인 555 타이머는 저전압 구동이 어려울 수 있어 TLC555 타이머를 사용했습니다. 

TLC555는 1.8v부터 사용이 가능한 555타이머 칩입니다. 

 

 

 

 

 

회로는 위와 같습니다.  PWM 신호를 모터 드라이버로 입력할 때 n-mosfet을 통해 신호를 서로 반전되게 들어가게 합니다. 

그러면 OUTA, OUTB에서 번갈아가며 LOW / HIGH 가 나오며 AC 출력이 생성되는 구조입니다. 

 

출력은 아주 깔끔합니다.

주파수만 조정하면 되는데 555 시뮬레이터에서 계산된 거의 그대로 나오니 캐패시터만 살짝 조정하면 될 것 같습니다. 

 

 

이제 그리드와 애노드용 전압을 생성합니다. 

남들이 만들어 놓은 회로도를 보다 보니 주로 음전압을 많이 쓰더군요. 

옛날엔 소자 문제로 음전압 생성이 더 쉬워서 VFD용 전압을 음전압을 많이 썼지만 최근에는 필요 없다고 합니다. 

그런데 왜 최근 회로들도 음전압을 생성했을까 하고 알아보니 또 복잡한 문제가 있었습니다. 

그리드와 애노드의 전압보다 필라멘트의 AC전압이 더 높은 준위에 있어야 안정적으로 전자 흐름이 이어진다는군요. 

이를 위해 바이어스 전압(?) 이라는 게 필요해서 음전압을 쓴다는 거였습니다. 

솔직히 이해가 쉽지는 않았습니다만 일단 만들어진 회로를 이용해서 따라해 봅니다. 

 

 

 

 

MC34063A를 이용해 -24V의 음전압을 생성하고,

이를 필라멘트 회로와 연결해 필라멘트 전압이 상대적으로 고준위에 있게 합니다. 

 

 

 

 

 

음전압은 잘 나옵니다. 이제 다음번에는 VFD에 불을 밝혀봐야 겠군요

어떤 회로에서는 필라멘트가 더 저준위에 있어야 한다고도 하는데.. 제가 뭘 잘못 이해한건지 모르겠습니다. 

728x90
반응형

'Making > VFD 드라이버' 카테고리의 다른 글

VFD 드라이버 진행상황 정리.  (0) 2025.08.01
VFD 드라이빙 테스트회로 제작.  (0) 2025.07.19
VFD 자료정리, 재고정리  (0) 2025.03.04
VFD 디스플레이 테스트  (0) 2025.03.03
728x90
반응형

P

 

 

 

https://github.com/ccy-studio/CCY-VFD-7BT317NK

 

GitHub - ccy-studio/CCY-VFD-7BT317NK: VFD屏幕7-BT-317NK驱动程序,主控ESP8266

VFD屏幕7-BT-317NK驱动程序,主控ESP8266. Contribute to ccy-studio/CCY-VFD-7BT317NK development by creating an account on GitHub.

github.com

 

7-BT-317NK
재고20
필라멘트 전압 : 2v

애노드/그리드 전압 : 12v

Grid 7 - Anode 20

PT6315/PT6311

핀 간격 1.75mm(드물다)

전체 핀수(간격포함) 37핀 

 

 

 

 

재고 24

HL-D812D
파란색 vfd

필라멘트 전압 2.5~3 내외

애노드 전압 20v 이상. 
밝기와의 상관관계가 필라멘트 전압이 연관된듯 하나 정확하게는 실험해 봐야 할 듯

Grid 8 - Anode 16

https://oshwhub.com/yc_chen/hl-d812d-vfd-qu-dong-ban 참조

PT6315

핀 간격 2mm

전체 핀 수(간격포함)29

 

 

 

 

 

 

 

 

 

 

재고4

 

HL-D1589W

필라멘트 전압 2.5~3 내외

애노드 전압 20v 이상. 

핀 간격 2.54

전체 핀 수(간격포함)31

 

 

 

 

 

 

 

 

 

 

 

 

VFD29-0707N

재고 18

HL-D1091WD하( 재고  9 )고 똑같이 생겼다. 

 

필라멘트 3.5

드라이브 15V 

라고 하지만 필라멘트 더 낮춰도 될듯?

 

Grid 7 - Anode 16

PT6312/PT6315

전체 핀(간격포함) 32

핀 간격 2mm

 

 

 

 

 

 

 

 

 

SVA 11SS03

재고 9

Grid 11 - Anode 10

PT6312/PT6315

핀 간격 2.54mm

전체 핀 수(간격포함)37

필라멘트 전압 4v 세그먼트 전압 15v

 

 

 

 

 

 

BJ655JK

재고9

그리드 17 애노드 37

핀 간격 1.785 mm(드물다)

전체 핀 수(간격포함)68

 

6312불가

6315불가

6311불가

 

 

 

BJ504GK

재고 5

그리드 3 애노드 52

 

 

 

 

FHD75X21-0812C

핀 간격1.785mm

미분류

재고 20

필라멘트 전압  2V 애노드 전압 20v 

 

 

 

 

 

VFD16-1002B

미분류

재고10

핀 간격 2mm

필라멘트 전압 2  애노드 전압25

 

공백포함 전체핀 수 40핀

 

 

 

 

 

 

 

https://github.com/ccy-studio/CCY-VFD-7BT317NK

 

 

GitHub - ccy-studio/CCY-VFD-7BT317NK: VFD屏幕7-BT-317NK驱动程序,主控ESP8266

 

VFD屏幕7-BT-317NK驱动程序,主控ESP8266. Contribute to ccy-studio/CCY-VFD-7BT317NK development by creating an account on GitHub.

 

github.com

 

 

7-BT-317NK

재고20

필라멘트 전압 : 2v

 

애노드/그리드 전압 : 12v

 

Grid 7 - Anode 20

 

PT6315/PT6311

 

핀 간격 1.75mm(드물다)

 

전체 핀수(간격포함) 37핀 

 

 

 

 

 

 

 

 

 

재고 24

 

HL-D812D

파란색 vfd

 

필라멘트 전압 2.5~3 내외

 

애노드 전압 20v 이상. 

밝기와의 상관관계가 필라멘트 전압이 연관된듯 하나 정확하게는 실험해 봐야 할 듯

 

Grid 8 - Anode 16

 

https://oshwhub.com/yc_chen/hl-d812d-vfd-qu-dong-ban 참조

 

PT6315

 

핀 간격 2mm

 

전체 핀 수(간격포함)29

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

재고4

 

 

 

HL-D1589W

 

필라멘트 전압 2.5~3 내외

 

애노드 전압 20v 이상. 

 

핀 간격 2.54

 

전체 핀 수(간격포함)31

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

VFD29-0707N

 

재고 18

 

HL-D1091WD하( 재고 9 )고 똑같이 생겼다. 

 

 

 

필라멘트 3.5

 

드라이브 15V 

 

라고 하지만 필라멘트 더 낮춰도 될듯?

 

 

 

Grid 7 - Anode 16

 

PT6312/PT6315

 

전체 핀(간격포함) 32

 

핀 간격 2mm

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

SVA 11SS03

 

재고 9

 

Grid 11 - Anode 10

 

PT6312/PT6315

 

핀 간격 2.54mm

 

전체 핀 수(간격포함)37

 

필라멘트 전압 4v 세그먼트 전압 15v

 

 

 

 

 

 

 

 

 

 

 

 

 

BJ655JK

 

재고9

 

그리드 17 애노드 37

 

핀 간격 1.785 mm(드물다)

 

전체 핀 수(간격포함)68

 

 

 

6312불가

 

6315불가

 

6311불가

 

 

 

 

 

 

 

BJ504GK

 

재고 5

 

그리드 3 애노드 52

 

 

 

 

 

 

 

FHD75X21-0812C

 

핀 간격1.27mm

 

미분류

 

재고 20

 

필라멘트 전압 2V 애노드 전압 20v 

 

 

 

 

 

 

 

 

 

 

 

VFD16-1002B

 

미분류

 

재고10

 

핀 간격 2mm

 

필라멘트 전압 2 애노드 전압25

 

 

 

32핀+8핀

 

 

 

 

 

728x90
반응형
728x90
반응형

자료를 찾아봐도 동작 원리는 알겠는데 실제로 동작시키려면 어떻게 해야하는건지 아리송하던 VFD 디스플레이. 
전원을 직접 넣어보니 감이 잡히네요. 

 

연결 핀은 필라멘트, 그리드, 애노드로 구성되는데

필라멘트는 그냥 양전자 발생원이라 별도로 켜두면 되는거고요. 
그리드가 자릿수, 애노드가 개별소자 라고 생각하면 LED 매트릭스와 비슷한 구조가 됩니다. 

다만 LED 매트릭스와는 달리 그리드 애노드 모두 동시에 양전압(+)이 가해져야 해당 소자에 불이 들어온다는 차이가 있네요 

문제는 필라멘트 구동은 2~3V AC, 그리드와 애노드는 20V 내외이고 그리드는 애노드보다 다소 낮은 전압을 가해야 구동이 원활하다는 것이네요. 

한동안 아날로그 전압회로 한참 뒤져봐야 할 듯 합니다. 

728x90
반응형
728x90
반응형

기존 데이터를 모두 갈아엎고 - 조금 작성했다 다시 갈아엎고 를 반복하다가 

다시 원점에서부터 시작했습니다. 

 

1. 과도한 chatGPT 의존. 

제가 코드와 구성을 잘 모르는 채로 대충 맡기니 문제가 있어도 원인을 찾기 어렵고 결과가 제가 원하는 형식대로 나오질 않네요. 구성은 제가 짜고 세부 항목만 따로 물어보면서 코드를 구성해야 할 것 같네요

 

2. 너무 긴 휴식과 너무 짧은 작업시간

 제가 이 프로젝트만 하는게 아닌데다 다른 작업도 하고 가끔 이 프로젝트를 하다 보니 연속성이 없어 자꾸 같은자리에서 맴돌게 됩니다. 코드를 문서화시키고 버전관리를 확실히 해야 할 필요가 있더군요.

 

3. 문서화 부족. 

 위에도 썼지만 어느정도 진행된 코드를 나중에 보면 뭔소린지 모르겠습니다. 문서화의 중요성을 다시 한번 느낍니다.

 

 

다시 문서를 보고 찬찬히 정리해 봅니다. 

 

 

 

 

 

단기예보 API

API이름 API 설명  입력 데이터 출력 데이
getUltraSrtNcst 초단기실황조회 serviceKey, numOfRows, pageNo, dataType, base_date, base_time, nx, ny baseDate, baseTime, category, obsrValue, nx, ny
getUltraSrtFcst 초단기예보조회 serviceKey, numOfRows, pageNo, dataType, base_date, base_time, nx, ny baseDate, baseTime, category, fcstDate, fcstTime, fcstValue, nx, ny
getVilageFcst 단기예보조회 serviceKey, numOfRows, pageNo, dataType, base_date, base_time, nx, ny baseDate, baseTime, category, fcstDate, fcstTime, fcstValue, nx, ny
getFcstVersion 예보버전조회 serviceKey, numOfRows, pageNo, dataType, ftype, basedatetime version, filetype, numOfRows, pageNo, totalCount, resultCode, resultMsg

 

 

 

 

 

 

입력 데이터와 출력 데이터 설명

 

단기예보 입출력 데이터

입력 데이터 설명 출력 데이터  설명
serviceKey 공공데이터포털에서 발급받은 인증키 (URL 인코딩 필요). baseDate 발표일자.
numOfRows 한 페이지 결과 수 (기본값: 10). baseTime 발표시각.
pageNo 페이지 번호 (기본값: 1). category 자료 구분 코드 (TMP, PTY, SKY 등).
dataType 응답 자료 형식 (XML 또는 JSON). obsrValue 실황 값 (초단기 실황조회에서 사용).
base_date 발표일자 (YYYYMMDD). fcstDate 예보일자.
base_time 발표시각 (HHMM, 초단기 실황: 40분 이후, 초단기/단기 예보: 정각 기준). fcstTime 예보시간.
nx, ny 예보지점 좌표 (격자 X/Y 좌표). fcstValue 예보 값 (해당 코드에 따른 값).
ftype 파일 구분 (ODAM, VSRT, SHRT, 예보버전조회에 사용). version 예보 버전 (예보버전조회에서 사용).
basedatetime 발표 일시 (예보버전조회에 사용, YYYYMMDDHHMM). filetype 파일 구분 (ODAM, VSRT, SHRT).

 

 

 

 

 

 

중기예보 API

API 이름 API 설명 입력 데이터 출력 데이터
getMidFcst 중기전망조회 serviceKey, numOfRows, pageNo, dataType, stnId, tmFc wfSv (기상전망), numOfRows, pageNo, totalCount, resultCode, resultMsg
getMidLandFcst 중기육상예보조회 serviceKey, numOfRows, pageNo, dataType, regId, tmFc regId, rnSt3Am, rnSt3Pm, wf3Am, wf3Pm (날씨/강수 확률 3~10일치 데이터)
getMidTa 중기기온조회 serviceKey, numOfRows, pageNo, dataType, regId, tmFc regId, taMax3, taMin3, ... (최고/최저 기온 데이터, 3~10일치 데이터)
getMidSeaFcst 중기해상예보조회 serviceKey, numOfRows, pageNo, dataType, regId, tmFc regId, wf3Am, wf3Pm (3~10일치 해상 날씨 및 파고 데이터)

 

 

중기예보 입출력 데이터

 

입력 데이터 설명 출력 데이터 설명
serviceKey 공공데이터포털에서 발급받은 인증키 (URL 인코딩 필요). wfSv 중기전망 기상 정보.
numOfRows 한 페이지 결과 수 (기본값: 10). regId 예보구역코드.
pageNo 페이지 번호 (기본값: 1). rnSt3Am, rnSt3Pm 3일 후 오전/오후 강수 확률.
dataType 응답 자료 형식 (XML 또는 JSON). wf3Am, wf3Pm 3일 후 오전/오후 날씨 예보.
regId 예보 구역 코드 (중기 육상, 기온, 해상 예보에 사용). taMax3, taMin3 3일 후 최고/최저 기온.
tmFc 발표 시각 (YYYYMMDDHHMM, 중기 예보 데이터 기준). wf6Am, wf6Pm 6일 후 오전/오후 해상 날씨 예보.
stnId 지점 번호 (중기전망조회에 사용). taMax10, taMin10 10일 후 최고/최저 기온.

 

 

 

보다시피 데이터가 상당히 많은데, 저는 다양한 크기의 전자잉크를 갖고 있기에 나중에 데이터를 정리하더라도 일단은 모든 데이터를 긁어오도록 할 계획입니다. 

 

단기예보 조회
getUltraSrtNcst 초단기실황조회
getUltraSrtFcst 초단기예보조회
getVilageFcst 단기예보조회
getFcstVersion 예보버전조회

중기예보 조회
getMidFcst 중기전망조회
getMidLandFcst 중기육상예보조회
getMidTa 중기기온조회
getMidSeaFcst 중기해상예보조회

 

모두 호출 형태가 다르고, 호출된 데이터도 다릅니다. 

단기예보 발표시간 - baseDate, baseTime

중기예보 발표시간 - tmFc 

 

 

 

초단기 실황조회
http://apis.data.go.kr/1360000/VilageFcstInfoService_2.0/getUltraSrtNcst
http://apis.data.go.kr/1360000/VilageFcstInfoService_2.0/getUltraSrtNcst?serviceKey=3BXdtOYTQgwY%2FncPf6kCtZiX8FDuzXs8Pd66HbbAcSpsYrF%2BRz3gmttlkhF3oCOyESziNpJ5kCeBNk%2Bg1%2BC1pA%3D%3D&numOfRows=10&pageNo=1&dataType=JSON&base_date=20241201&base_time=0500&nx=61&ny=127
http://apis.data.go.kr/1360000/VilageFcstInfoService_2.0/getUltraSrtNcst?serviceKey=3BXdtOYTQgwY%2FncPf6kCtZiX8FDuzXs8Pd66HbbAcSpsYrF%2BRz3gmttlkhF3oCOyESziNpJ5kCeBNk%2Bg1%2BC1pA%3D%3D&numOfRows=10&pageNo=1&dataType=JSON&base_date=20241201&base_time=1600&nx=61&ny=127

http://apis.data.go.kr/1360000/VilageFcstInfoService_2.0/getVilageFcst?serviceKey=3BXdtOYTQgwY%2FncPf6kCtZiX8FDuzXs8Pd66HbbAcSpsYrF%2BRz3gmttlkhF3oCOyESziNpJ5kCeBNk%2Bg1%2BC1pA%3D%3D&numOfRows=10&pageNo=1&dataType=JSON&base_date=20241201&base_time=0800&nx=61&ny=127



http routing error 04
https://redfox.tistory.com/154
https://www.data.go.kr/bbs/dnb/selectDeveloperNetworkView.do?reqestSn=QUES_000000000002570


01 - APPLICATION ERROR
요청 파라미터 오류.

02 - DB ERROR
데이터베이스 문제.

03 - NO DATA
데이터 없음.

04 - HTTP ROUTING ERROR
잘못된 URL/라우팅 문제.

05 - SERVICE KEY IS NOT REGISTERED
잘못된/등록되지 않은 서비스 키.

10 - INVALID REQUEST PARAMETER
잘못된 파라미터 형식.

20 - NO MANDATORY PARAMETERS
필수 파라미터 누락.

22 - DEPRECATED OPENAPI
지원 종료된 API 사용.

30 - SERVICE ACCESS DENIED
접근 권한 없음.

728x90
반응형
728x90
반응형

 

기존 노드가 제대로 작동하지 않던 이유는 단순했습니다. 

충전이 되지 않더군요...

원인을 찾기 힘들어서 18650 승압을 제거하고 약간 단순화시킨 회로를 새로 만들었습니다. 

그리고 작은 태양전지와 슈퍼 캐패시터를 달아 확인해 봤는데 여전히 충전이 안 됩니다. 

 

 

 

 

 

 

 

 

하나하나 점검해 보니 P-FET(AOD413A)가 문제였습니다.

어찌된건지 풋프린트가 반전되어 게이트/소스가 반전되어 연결되었더군요.

점검도 하지 않고 그냥 그대로 썼으니 되겠지 하고 넘어갔던 자신을 반성해야 할 것 같습니다. 

 

 

 

 

 

 

다른 MOSFET으로 교체하고 태양광 패널에 스탠드를 쬐어 보니 서서히 캐패시터가 충전되는 것을 확인할 수 있었습니다. 

 

 

 

 

 

 

 

 

 

 

 

혹시몰라 18650을 한시간 정도 물려봤는데 충전이 되네요. 

 

 

 

다시 조립해서 장착해야 할텐데 이제 겨울이라 또 언제 할지 모르겠습니다. 

회로 한번 잘못 만들었다가 몇달을 그냥 보내는군요

 

 

 

 

 

 

 



 

** 디스코드 서버를 열었습니다. **

https://discord.gg/KxCcbDT3am

 

한국 meshtastic 유저 커뮤니티 Discord 서버에 가입하세요!

Meshtastic 한국 사용자 커뮤니티입니다. LoRa 메쉬 네트워크 관련 정보를 나누고 소통합니다. | 멤버 18명

discord.com

 

커뮤니티 없이 meshtastic 프로젝트를 하는건 많이 힘듭니다.

모여서 같이 정보를 나누고 서로 도움이 되었으면 좋겠습니다. 

728x90
반응형
728x90
반응형

 

배터리 만충후 이틀이 지나 설치하게 되었습니다. 

배터리 용량은 7500mAh 정도. 설치일은 10/27 오후 3시 30분. 

 

 

 

 

 

 

설치 위치는 서초 인근이고요. 

설치 후 이동하며 테스트를 해 봤습니다. 

대략 1.5km 정도까진 건물 음영에 따라 가끔 끊기지만 통신은 원활한 느낌.

2km 에서는 가끔 운좋으면 연결이 되는군요. 

 

평지 도심 기준이라 거리상으로는 나쁘지 않은 것 같습니다. 

어디 건물 옥상에 올려두면 참 좋을텐데 기술에 관심많은 건물주님 보시면 연락주세요 :)

 

 

--------------------------------추가---------------------------------

하루만에 연결이 끊겨서 조만간 다시 확인하러 가야 할 것 같습니다. ㅜㅜ

 

 

 

 

 



 

** 디스코드 서버를 열었습니다. **

 

https://discord.gg/KxCcbDT3am
커뮤니티 없이 meshtastic 프로젝트를 하는건 많이 힘듭니다.

 

한국 meshtastic 유저 커뮤니티 Discord 서버에 가입하세요!

Meshtastic 한국 사용자 커뮤니티입니다. LoRa 메쉬 네트워크 관련 정보를 나누고 소통합니다. | 멤버 18명

discord.com

 

모여서 같이 정보를 나누고 서로 도움이 되었으면 좋겠습니다. 

728x90
반응형
728x90
반응형

3달 하고도 보름만의 meshstatic 포스팅이네요

 

원래는 사실 6월 말에 기기를 설치하고 테스트를 해 보려 했습니다. 

 

그런데.. 설치하자 마자 기기가 먹통이 되었네요?

이미 더위에 접어들어 땀을 줄줄 흘리면서 한시간 동안 고생했는데 저걸 다시 떼낼 엄두가 안 나더라고요

그래서 날이 시원해지면 다시 작업해야 겠다 하고 미뤘습니다. 

 

그런데 날이 시원해지기까지 3달이 넘어갈 줄은 몰랐죠

 

 

 

 

 

 

 

 

 

원래는 걸어서 20분 정도의 거리인데 이번에는 복구한 전동 킥보드로 쓩 하고 다녀왔습니다. 

 

 

 

 

 

 

 

 

겉의 먼지를 제외하면 내부는 깨끗하고 문제가 없었습니다. 

 

 

 

 

 

 

배터리도 별 문제 없군요.

 

 

 

 

 

 

 

 

고장 원인을 찾아보니 어이없게도 전원 스위치의 불량이었네요.

몇년씩 묵은 오래 된 스위치다 보니 내부 접점이 산화된 것 같습니다. 

스위치를 제거하고 납땜으로 연결해보니 문제없이 잘 켜집니다. 

이제 다시 조립해서 도로 설치하면 본격적으로 테스트를 할 수 있을 것 같습니다. 

 

 

 

 

 



 

** 디스코드 서버를 열었습니다. **

https://discord.gg/KxCcbDT3am


 

한국 meshtastic 유저 커뮤니티 Discord 서버에 가입하세요!

Meshtastic 한국 사용자 커뮤니티입니다. LoRa 메쉬 네트워크 관련 정보를 나누고 소통합니다. | 멤버 18명

discord.com

 

커뮤니티 없이 meshtastic 프로젝트를 하는건 많이 힘듭니다.

모여서 같이 정보를 나누고 서로 도움이 되었으면 좋겠습니다. 

728x90
반응형
728x90
반응형

기존 설계의 문제는 힘이 가해졌을 때 이스케이프 휠에 팰릿이 잠겨서 움직이지 않기 때문에 밸런스 휠을 손으로 한번 흔들어 줘야 움직임이 시작된다는 것이었습니다. 

 

 

 

그러던 중 팔로우하고 있던 일본 작가분의 작품을 보게 되었는데요

https://x.com/BellTreeNursing

이 작품을 출력해서 움직여 보니 제것과 달리 힘만 주면 바로 작동을 하더군요

 

 

 

 

 

원인을 찾다 보니 펠릿 쥬얼의 각도가 문제였습니다. 

기계식 시계에서는 진짜 쥬얼을 쓰지만 제 물건은 그냥 플라스틱 덩어리일 뿐이라 마찰계수가 달라서 작동을 하지 않는 거였습니다. 

각도를 수정해 가며 여러 번 출력해 가며 부드럽게 움직이는 각도를 찾았습니다. 

 

 

 

 

 

밸런스 휠과 스프링도 약간 수정했습니다. 

 

 

 

 

https://www.youtube.com/watch?v=SOrmzYx_KAM

이게 그 결과입니다. 

 

 

 

 

 

 

탈진기의 중심 부분은 어느정도 완성이 된 것 같아 주변 기어와 태엽을 추가하려고 계속 작업중입니다. 

주변에 기어와 축이 많이 추가되다 보니 축의 길이를 정밀하게 절단해야 할 일이 많더군요.

 

 

 

 

 

3d 프린트 뚜르비옹을 만들었던 유튜브의 @mechanistic3d 의 작업중 좋아 보이는 것이 있어 따라했습니다. 

 

https://www.youtube.com/watch?v=iwKXmwjGt9U

 

 

 

절단작업을 해 보니 훨씬 편리하긴 한데 좀 더 정밀한 작업을 위해선 수정할 부분이 있네요. 

 

 

 

 

 

 

728x90
반응형

'Making > 탈진기 설계와 제작' 카테고리의 다른 글

새 탈진기 설계.  (0) 2025.06.29
두번째 설계한 탈진기 테스트  (0) 2024.04.16
새 탈진기 설계와 조정.  (0) 2024.04.04
탈진기 첫 테스트.  (0) 2024.03.01
포크와 롤러 설계  (0) 2024.02.25
728x90
반응형

OLED 통합한다고 해놓고 한참 걸렸네요.

부품 수급과 드라이버 회로 테스트하고 이것저것 하다보니 많이 늦었습니다. 

 

처음 만든 회로는 실패하는 바람에 다시 한번 관련 자료를 찾아 회로를 수정하고 부품을 수급하고 테스트 과정을 거쳤습니다. 

관련 포스팅 : https://pashiran.tistory.com/1375

 

 

 

 

 

 

 

 

 

 

 

 

실크스크린을 이용해 납을 올리고 핀셋으로 하나하나 부품을 올려줍니다. 

 

 

 

 

 

저는 오븐이 아니라 핫 플레이트를 사용하는지라 앞면에 부품이 납땜된 후에 뒷면에 부품을 올리기 어렵습니다. 

그래서 급하게 솔리드웍스에서 지그 설계를 하고 출력해 사용했습니다. 

 

 

 

 

 

 

이후 뒷면은 히팅 건으로 가열해서 마무리를 해 줍니다. 

 

 

 

 

 

 

아두이노 부트로더를 올려줍니다. 

 

 

 

 

아두이노 나노를 베이스로 삼았기 때문에 위와 같이 세팅하고 부트로더를 올려주면 됩니다.

저는 아두이노에 arduino as isp 스케치를 올려 프로그래머로 사용하기에 [Programmer :"Arduino as ISP"] 를 선택했습니다. 

 

 

 

 

부트로더가 올라간 보드에 간단하게 blink 스케치를 약간 편집해 넣었습니다.

업로드해서 테스트해보면 잘 되는 것을 볼 수 있습니다. 

 

 

 

 

U8glib 예제를 넣어봤습니다. OLED도 잘 되는군요. 

점검해 보니

1. USB 커넥터를 Bottom으로 보내야 겠고

2. Reset 스위치를 제거했더니 쓰기가 불편해서 다시 넣어야 할 것 같습니다. 

3. OLED 위치도 약간 조정이 필요하네요.

 

 

 

[진짜진짜_마지막_최종] 수정 버전의 PCB를 주문했습니다. 

주문한 PCB가 올 때까지는 기존 보드를 사용하면서 스케치를 수정하려 합니다. 

728x90
반응형
728x90
반응형

여느 때처럼 타오바오 중고물품 순회를 하다가 이런 걸 발견했습니다. 

 

 

 

 

 

도착한 물건을 조립해 보니 괜찮아 보입니다. 

태양광 패널의 고정이 확실치 않아 바람이 세게 불면 돌아갈 것 같긴 한데요. 

 

 

 

 

 

 

 

볼트 너트가 포함이긴 한데 와셔를 추가하고 렌치볼트를 쓰는 등 갖고 있던 재료로 업그레이드를 했습니다. 

 

 

 

 

 

 

 

배터리는 무려 10Ah.

충방전도 잘 됩니다. 

문제는 리튬인산철 배터리란 거죠.

 

 

 

 

 

 

 

제가 스무개나 만들어 놓은 충방전 회로는 리튬이온 용인데 말이죠

 

 

 

 

 

 

이 문제는 일단 넘어가고

분해해 보니 방수 패킹도 잘 되어있고 공간도 나쁘지 않아 보입니다. 

LED 패널은 필요없으니 제거합니다. 

 

 

 

 

 

 

 

태양광 패널도 10W 라 나쁘지 않아 보이네요

 

 

 

 

 

 

 

 

안테나 케이블을 상단에 설치하려 구멍을 뚫었는데 뚜껑을 닫아보니 높이가 살짝 높아서 안 닫히는군요. 

하단으로 옮겼습니다. 

 

 

 

 

 

 

 

배터리를 넣고 위쪽에 회로를 넣으면 딱 맞을 것 같습니다. 

 

 

 

 

 



 

** 디스코드 서버를 열었습니다. **

 

https://discord.gg/KxCcbDT3am

 

한국 meshtastic 유저 커뮤니티 Discord 서버에 가입하세요!

Meshtastic 한국 사용자 커뮤니티입니다. LoRa 메쉬 네트워크 관련 정보를 나누고 소통합니다. | 멤버 18명

discord.com

 

 

커뮤니티 없이 meshtastic 프로젝트를 하는건 많이 힘듭니다.

모여서 같이 정보를 나누고 서로 도움이 되었으면 좋겠습니다. 

728x90
반응형
728x90
반응형

기존 회로는 CN3791 을 사용한 것이었는데 이 회로는 리튬이온 배터리 전용입니다. 

그래서 갖고있던 다른 리튬인산철 배터리 사용을 할 수 없어 약간 아쉬웠는데요

같은 제조사에서 리튬인산철 충전도 가능한 칩이 있을 것 같아 확인해 보니 있었습니다. 

 

 

 

 

 

이름은 CN3795 이고 리튬계열 배터리를 모두 충전 가능합니다. 

다른 스펙은 거의 비슷하네요.

 

 

 

 

 

 

배터리 전압은 Feedback 핀으로 받아들이는 전압에 의해 결정이 나는데 위와 같은 공식에 의해 결정이 납니다. 

바이어스 전류 Ib 는 60nA 이고 Ib*R1 만큼의 오차가 생길 수 있다고 하는데 R1이 100K 면 약 6mV의 오차가 생기니 무시해도 될만한 값인 것 같네요.

 

Vreg 를 리튬이온 배터리의 4.2V 로 잡았을 때

R1 = 82k, R2 = 33k 라 하면

1.205*(1+R1/R2) = 1.205*(1+2.48) = 4.199

 

리튬인산철의 3.5V로 잡았을 때

R1 = 22k, R2 = 12k 라 하면

1.205*(1+R1/R2) = 1.205*(1+1.83) =  3.41 정도가 됩니다. 

 

보다 3.5V에 가깝게 맞추고 싶으면 R1을 직렬로 구성해서 22K 에다 1K 이하의 저항을 붙이면 될 것 같네요. 

 

 

 

 

저항은 부품값에 별 영향을 끼치지 않으므로 이와 같이 병렬 구성해서 상황에 따라 점퍼로 선택할 수 있도록 만들었습니다. 

MPPT 전압도 이렇게 하면 좋을 것 같은데 태양광 전압은 보통 어떤 전압이 제일 흔하게 나오는지 알 수 없어 일단은 넘어가야 할 것 같고요.

 

 

 

 

 

데이터쉬트를 훑어보니 나머지 부품은 그대로 써도 될 것 같아 마무리를 했습니다. 

보드 제작은 현재로선 딱히 계획은 없습니다. 리튬이온 배터리용으로 만들어 놓은게 너무 많아서요.

 

 

 

 

 

** 디스코드 서버를 열었습니다. **

 

https://discord.gg/KxCcbDT3am

 

한국 meshtastic 유저 커뮤니티 Discord 서버에 가입하세요!

Meshtastic 한국 사용자 커뮤니티입니다. LoRa 메쉬 네트워크 관련 정보를 나누고 소통합니다. | 멤버 18명

discord.com

 

커뮤니티 없이 meshtastic 프로젝트를 하는건 많이 힘듭니다.

모여서 같이 정보를 나누고 서로 도움이 되었으면 좋겠습니다. 

728x90
반응형
728x90
반응형

태양전지의 Pmax 전압에 맞춰 보드의 MPPT 전압을 조정해 줘야 하는데요

 

 

 

 

 

 

 

지난 포스팅에서 언급한 R8과 R9 저항으로 전압 분배를 해 주면 됩니다. 

1.205V가 되게 맞춰 줘야 합니다.

 

 

 

 

 

 

 

간단한 저항 분배를 통해 목표 전압을 맞춰 준 후 납땜을 해 줬습니다. 

 

 

 

 

 

 

 

 

먼저 구멍을 뚫고 끼워넣은 안테나 커넥터는 배터리를 집어 넣으려 하니 절묘하게 걸리적 거리는 바람에 또 옮겨야 했습니다. 

 

 

 

 

 

 

 

 

 

상단의 홈을 사용해서 딱 맞게 집어넣긴 했는데 케이스 외부에 요철은 갈아내야 나사를 조일 수 있더군요.

 

 

 

 

 

 

 

 

 

 

 

쓸모없어진 구멍은 3D 프린터 출력물로 막아줬습니다. 

 

 

 

 

 

 

 

 

 

배터리는 만충 상태가 아닌 3.7V 스토리지 전압 상태였던 리튬이온 전지를 그냥 사용했습니다. 

며칠간 설치해 보고 배터리 전압 변화도 확인해 보면 좋겠네요. 

 

 

 

 

 

 

 

 

누전만 안 될 정도로 고정은 대충대충 해 줬습니다. 

 

 

 

 

 

** 디스코드 서버를 열었습니다. **

 

https://discord.gg/KxCcbDT3am

 

한국 meshtastic 유저 커뮤니티 Discord 서버에 가입하세요!

Meshtastic 한국 사용자 커뮤니티입니다. LoRa 메쉬 네트워크 관련 정보를 나누고 소통합니다. | 멤버 18명

discord.com

 

 

커뮤니티 없이 meshtastic 프로젝트를 하는건 많이 힘듭니다.

모여서 같이 정보를 나누고 서로 도움이 되었으면 좋겠습니다. 

728x90
반응형
728x90
반응형

노드를 하나 외부에 설치할 계획을 세우고 나니 더욱 많은 문제가 있습니다. 

 

1. 기술적 문제

-노드는 태양광으로 자체적으로 돌아가야 합니다. 

태양광 패널과 충전 시스템, 배터리로 구동되며 방수 케이스에 넣어져 환경으로부터 보호되어야 하죠. 

기술적 문제들은 스스로 해결할 수 있긴 하지만, 각각에 대해 추가 비용이 들어간다는 점은 상당히 부담이 됩니다. 

 

2. 환경적 문제

-태양광 패널은 그림자가 지지 않는 노출된 곳에 설치되어야 합니다. 

개인이 접근할 수 있는 곳에서 이런 위치를 찾기는 쉽지 않습니다. 

-또한 전파의 특성상 가능한한 높은 곳에 설치되어야 합니다. 

 

3. 법적 문제

위와 같은 사항을 따르려 하면 고층 빌딩을 여러 개 갖고 있는 엄청난 건물주가 아닌 이상, 

서울의 야산 등에서 적당한 설치 위치를 찾아야 합니다. - 다른 방법이 있다면 알려주세요

공유지에 개인 물건을 설치하는 것은 당연히 법적 문제가 따릅니다. 

 

동네 야산의 휴게 위치 등에는 동네 주민들의 물건들도 놓여진 경우가 많아 크게 문제가 되진 않을 것 같습니다만, 

엄밀하게 따지자면 경범죄에 속할 수밖에 없는 게 사실이겠죠.

 

허가를 얻는 것도 방법입니다만, 사업자도 아니고 개인이 이런 물건을 설치하겠다고 하면 과연 허가가 날까요?

 

4. 기타 문제

설치 위치를 시뮬레이션 해 보면 손이 닿는 높이(1.5m정도) 에 설치하는 것은 시각적으로 문제가 될 수 있습니다. 

적어도 2~2.5m의 높이에 설치해야 위화감이 없을 것 같습니다. 

결론적으로 동네 야산을 사다리까지 짊어지고 올라가야 하며, 사다리 구매 비용은 별도라는 문제가 있습니다. 

 

 

 

 



 

** 디스코드 서버를 열었습니다. **

https://discord.gg/KxCcbDT3am

 

한국 meshtastic 유저 커뮤니티 Discord 서버에 가입하세요!

Meshtastic 한국 사용자 커뮤니티입니다. LoRa 메쉬 네트워크 관련 정보를 나누고 소통합니다. | 멤버 18명

discord.com

 

커뮤니티 없이 meshtastic 프로젝트를 하는건 많이 힘듭니다.

모여서 같이 정보를 나누고 서로 도움이 되었으면 좋겠습니다. 

728x90
반응형
728x90
반응형

아무래도 제 개인의 코딩 능력을 많이 벗어난 데이터셋 정리 등이 필요하다 보니 ChatGPT에게 도움을 청했습니다. 

한동안 이녀석과 질답을 주고받으며 코드를 많이 쌓긴 했습니다

하지만 대화가 길어지면 점점 버벅대고 결과가 산으로 가기도 하네요.

 

그래서 일단 단계별로 진행하고 코드 내용을 따로 기록하기로 합니다.

 

#include <WiFi.h>
#include <HTTPClient.h>
#include <NTPClient.h>
#include <WiFiUdp.h>
#include "GetLocate.h"
#include <Arduino_JSON.h>

// Wi-Fi 설정
const char* ssid = "ssid";
const char* password = "password";

const char* apiKey = "API_KEY";
const long utcOffsetInSeconds = 3600 * 9; // 한국 표준시 (UTC+9)

// 타임서버 설정
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org", utcOffsetInSeconds);

// 업데이트 간격 (예: 10분)
unsigned long updateInterval = 600000;
unsigned long previousMillis = 0;

void setup() {
  Serial.begin(115200);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi...");
  }
  Serial.println("Connected to WiFi");

  // 타임서버 연결
  timeClient.begin();
  timeClient.update();

  // 위치 정보 가져오기
  Location loc = getLocation();
  Serial.print("Location - Country: "); Serial.print(loc.country);
  Serial.print(", Region: "); Serial.print(loc.regionName);
  Serial.print(", City: "); Serial.println(loc.city);

  // 초기 날씨 정보 업데이트
  getWeatherUpdate();
}

void loop() {
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= updateInterval) {
    previousMillis = currentMillis;

    // 타임서버 업데이트
    timeClient.update();

    // 현재 시간 출력
    Serial.print("Current time: ");
    Serial.println(timeClient.getFormattedTime());

    // 날씨 정보 업데이트
    getWeatherUpdate();
  }
}

// 날씨 정보를 업데이트하는 함수
void getWeatherUpdate() {
  Location loc = getLocation();
  if (WiFi.status() == WL_CONNECTED) {
    HTTPClient http;
    String weatherURL = "http://apis.data.go.kr/1360000/VilageFcstInfoService_2.0/getUltraSrtFcst";
    weatherURL += "?serviceKey=" + String(apiKey);
    weatherURL += "&numOfRows=60&pageNo=1&base_date=" + getCurrentDate();
    weatherURL += "&base_time=0630&nx=" + String(loc.nx) + "&ny=" + String(loc.ny);
    weatherURL += "&dataType=JSON"; // JSON 형식으로 요청

    http.begin(weatherURL);
    int httpCode = http.GET();

    if (httpCode > 0) {
      String payload = http.getString();
      Serial.println("Weather Data: ");
      
      // 특수문자 및 따옴표 제거 및 줄바꿈 출력
      String formattedPayload = formatPayload(payload);
      Serial.println(formattedPayload);
    } else {
      Serial.print("Error on HTTP request: ");
      Serial.println(httpCode);
    }
    http.end();
  }
}

// 날씨 API의 응답 데이터를 포맷하는 함수
// 이 함수는 JSON 응답에서 불필요한 특수문자와 따옴표를 제거하고,
// 쉼표를 기준으로 줄바꿈을 추가하여 가독성을 높인다.
String formatPayload(String payload) {
  payload.replace("{", ""); // '{' 제거
  payload.replace("}", ""); // '}' 제거
  payload.replace("[", ""); // '[' 제거
  payload.replace("]", ""); // ']' 제거
  payload.replace("(", ""); // '(' 제거
  payload.replace(")", ""); // ')' 제거
  payload.replace("\"", ""); // '"' 제거
  payload.replace(",", ",\n"); // ',' 뒤에 줄바꿈 추가
  return payload;
}

// 현재 날짜를 YYYYMMDD 형식으로 반환하는 함수
// 이 함수는 NTPClient를 사용하여 현재 시간을 가져오고,
// tm 구조체를 사용하여 로컬 시간으로 변환한 후, strftime 함수를 사용하여
// 날짜를 문자열 형식으로 반환한다.
String getCurrentDate() {
  time_t now = timeClient.getEpochTime(); // 현재 epoch 시간 가져오기
  struct tm* timeinfo = localtime(&now); // epoch 시간을 로컬 시간으로 변환
  char buffer[11]; // 날짜를 저장할 버퍼
  strftime(buffer, sizeof(buffer), "%Y%m%d", timeinfo); // 날짜를 YYYYMMDD 형식으로 포맷팅
  return String(buffer); // 문자열로 반환
}

이게 메인 코드이고요

 

 

 

#include <WiFi.h>
#include <HTTPClient.h>
#include <Arduino_JSON.h>

// Grid 구조체 정의
struct Grid {
  int x;
  int y;
};

// dfs_xy_conv 함수 선언
Grid dfs_xy_conv(const char* code, double v1, double v2);

// Location 구조체 정의
struct Location {
  String country;
  String regionName;
  String city;
  int nx;
  int ny;
};

Location getLocation() {
  HTTPClient http;
  Location loc;
  http.begin("http://ip-api.com/json");
  int httpCode = http.GET();

  if (httpCode > 0) {
    String payload = http.getString();
    JSONVar doc = JSON.parse(payload);

    if (JSON.typeof(doc) != "undefined" && strcmp((const char*)doc["status"], "success") == 0) {
      loc.country = (const char*)doc["country"];
      loc.regionName = (const char*)doc["regionName"];
      loc.city = (const char*)doc["city"];
      float lat = (double)doc["lat"];
      float lon = (double)doc["lon"];

      // 좌표를 NX, NY로 변환
      auto grid = dfs_xy_conv("toXY", lat, lon);
      loc.nx = grid.x;
      loc.ny = grid.y;
    } else {
      Serial.println("Failed to parse location data");
    }
  } else {
    Serial.println("Failed to retrieve location data");
  }
  http.end();
  return loc;
}

// dfs_xy_conv 함수 정의
Grid dfs_xy_conv(const char* code, double v1, double v2) {
  const double RE = 6371.00877;
  const double GRID = 5.0;
  const double SLAT1 = 30.0;
  const double SLAT2 = 60.0;
  const double OLON = 126.0;
  const double OLAT = 38.0;
  const double XO = 43;
  const double YO = 136;

  const double DEGRAD = M_PI / 180.0;
  const double RADDEG = 180.0 / M_PI;

  double re = RE / GRID;
  double slat1 = SLAT1 * DEGRAD;
  double slat2 = SLAT2 * DEGRAD;
  double olon = OLON * DEGRAD;
  double olat = OLAT * DEGRAD;

  double sn = tan(M_PI * 0.25 + slat2 * 0.5) / tan(M_PI * 0.25 + slat1 * 0.5);
  sn = log(cos(slat1) / cos(slat2)) / log(sn);
  double sf = tan(M_PI * 0.25 + slat1 * 0.5);
  sf = pow(sf, sn) * cos(slat1) / sn;
  double ro = tan(M_PI * 0.25 + olat * 0.5);
  ro = re * sf / pow(ro, sn);

  Grid rs = {0, 0};
  if (strcmp(code, "toXY") == 0) {
    double ra = tan(M_PI * 0.25 + (v1) * DEGRAD * 0.5);
    ra = re * sf / pow(ra, sn);
    double theta = v2 * DEGRAD - olon;
    if (theta > M_PI) theta -= 2.0 * M_PI;
    if (theta < -M_PI) theta += 2.0 * M_PI;
    theta *= sn;
    rs.x = floor(ra * sin(theta) + XO + 0.5);
    rs.y = floor(ro - ra * cos(theta) + YO + 0.5);
  }
  return rs;
}

 

이건 GetLocate.h 코드입니다.

Wifi 주소를 추적해서 현재 위치를 파악하고, 그 위치정보를 기상청 API에서 요구하는 그리드 격자정보로 변환합니다.
https://gist.github.com/fronteer-kr/14d7f779d52a21ac2f16
의 코드를 참조하도록 했습니다. 

 

 

이 코드를 실행한 결과는 다음과 같습니다.

Connecting to WiFi...
Connecting to WiFi...
Connected to WiFi
Location - Country: South Korea, Region: Gyeonggi-do, City: Seongnam-si
Weather Data: 
response:header:resultCode:00,
resultMsg:NORMAL_SERVICE,
body:dataType:JSON,
items:item:baseDate:20240529,
baseTime:0630,
category:LGT,
fcstDate:20240529,
fcstTime:0700,
fcstValue:0,
nx:62,
ny:122,
baseDate:20240529,
baseTime:0630,
category:LGT,
fcstDate:20240529,
fcstTime:0800,
fcstValue:0,
nx:62,
ny:122,
baseDate:20240529,
baseTime:0630,
category:LGT,
fcstDate:20240529,
fcstTime:0900,
fcstValue:0,
nx:62,
ny:122,
baseDate:20240529,
baseTime:0630,
category:LGT,
fcstDate:20240529,
fcstTime:1000,
fcstValue:0,
nx:62,
ny:122,
baseDate:20240529,
baseTime:0630,
category:LGT,
fcstDate:20240529,
fcstTime:1100,
fcstValue:0,
nx:62,
ny:122,
baseDate:20240529,
baseTime:0630,
category:LGT,
fcstDate:20240529,
fcstTime:1200,
fcstValue:0,
nx:62,
ny:122,
baseDate:20240529,
baseTime:0630,
category:PTY,
fcstDate:20240529,
fcstTime:0700,
fcstValue:0,
nx:62,
ny:122,
baseDate:20240529,
baseTime:0630,
category:PTY,
fcstDate:20240529,
fcstTime:0800,
fcstValue:0,
nx:62,
ny:122,
baseDate:20240529,
baseTime:0630,
category:PTY,
fcstDate:20240529,
fcstTime:0900,
fcstValue:0,
nx:62,
ny:122,
baseDate:20240529,
baseTime:0630,
category:PTY,
fcstDate:20240529,
fcstTime:1000,
fcstValue:0,
nx:62,
ny:122,
baseDate:20240529,
baseTime:0630,
category:PTY,
fcstDate:20240529,
fcstTime:1100,
fcstValue:0,
nx:62,
ny:122,
baseDate:20240529,
baseTime:0630,
category:PTY,
fcstDate:20240529,
fcstTime:1200,
fcstValue:0,
nx:62,
ny:122,
baseDate:20240529,
baseTime:0630,
category:RN1,
fcstDate:20240529,
fcstTime:0700,
fcstValue:媛뺤닔?놁쓬,
nx:62,
ny:122,
baseDate:20240529,
baseTime:0630,
category:RN1,
fcstDate:20240529,
fcstTime:0800,
fcstValue:媛뺤닔?놁쓬,
nx:62,
ny:122,
baseDate:20240529,
baseTime:0630,
category:RN1,
fcstDate:20240529,
fcstTime:0900,
fcstValue:媛뺤닔?놁쓬,
nx:62,
ny:122,
baseDate:20240529,
baseTime:0630,
category:RN1,
fcstDate:20240529,
fcstTime:1000,
fcstValue:媛뺤닔?놁쓬,
nx:62,
ny:122,
baseDate:20240529,
baseTime:0630,
category:RN1,
fcstDate:20240529,
fcstTime:1100,
fcstValue:媛뺤닔?놁쓬,
nx:62,
ny:122,
baseDate:20240529,
baseTime:0630,
category:RN1,
fcstDate:20240529,
fcstTime:1200,
fcstValue:媛뺤닔?놁쓬,
nx:62,
ny:122,
baseDate:20240529,
baseTime:0630,
category:SKY,
fcstDate:20240529,
fcstTime:0700,
fcstValue:1,
nx:62,
ny:122,
baseDate:20240529,
baseTime:0630,
category:SKY,
fcstDate:20240529,
fcstTime:0800,
fcstValue:1,
nx:62,
ny:122,
baseDate:20240529,
baseTime:0630,
category:SKY,
fcstDate:20240529,
fcstTime:0900,
fcstValue:1,
nx:62,
ny:122,
baseDate:20240529,
baseTime:0630,
category:SKY,
fcstDate:20240529,
fcstTime:1000,
fcstValue:1,
nx:62,
ny:122,
baseDate:20240529,
baseTime:0630,
category:SKY,
fcstDate:20240529,
fcstTime:1100,
fcstValue:1,
nx:62,
ny:122,
baseDate:20240529,
baseTime:0630,
category:SKY,
fcstDate:20240529,
fcstTime:1200,
fcstValue:1,
nx:62,
ny:122,
baseDate:20240529,
baseTime:0630,
category:T1H,
fcstDate:20240529,
fcstTime:0700,
fcstValue:17,
nx:62,
ny:122,
baseDate:20240529,
baseTime:0630,
category:T1H,
fcstDate:20240529,
fcstTime:0800,
fcstValue:19,
nx:62,
ny:122,
baseDate:20240529,
baseTime:0630,
category:T1H,
fcstDate:20240529,
fcstTime:0900,
fcstValue:21,
nx:62,
ny:122,
baseDate:20240529,
baseTime:0630,
category:T1H,
fcstDate:20240529,
fcstTime:1000,
fcstValue:23,
nx:62,
ny:122,
baseDate:20240529,
baseTime:0630,
category:T1H,
fcstDate:20240529,
fcstTime:1100,
fcstValue:24,
nx:62,
ny:122,
baseDate:20240529,
baseTime:0630,
category:T1H,
fcstDate:20240529,
fcstTime:1200,
fcstValue:25,
nx:62,
ny:122,
baseDate:20240529,
baseTime:0630,
category:REH,
fcstDate:20240529,
fcstTime:0700,
fcstValue:75,
nx:62,
ny:122,
baseDate:20240529,
baseTime:0630,
category:REH,
fcstDate:20240529,
fcstTime:0800,
fcstValue:70,
nx:62,
ny:122,
baseDate:20240529,
baseTime:0630,
category:REH,
fcstDate:20240529,
fcstTime:0900,
fcstValue:65,
nx:62,
ny:122,
baseDate:20240529,
baseTime:0630,
category:REH,
fcstDate:20240529,
fcstTime:1000,
fcstValue:60,
nx:62,
ny:122,
baseDate:20240529,
baseTime:0630,
category:REH,
fcstDate:20240529,
fcstTime:1100,
fcstValue:50,
nx:62,
ny:122,
baseDate:20240529,
baseTime:0630,
category:REH,
fcstDate:20240529,
fcstTime:1200,
fcstValue:45,
nx:62,
ny:122,
baseDate:20240529,
baseTime:0630,
category:UUU,
fcstDate:20240529,
fcstTime:0700,
fcstValue:-0.8,
nx:62,
ny:122,
baseDate:20240529,
baseTime:0630,
category:UUU,
fcstDate:20240529,
fcstTime:0800,
fcstValue:-0.4,
nx:62,
ny:122,
baseDate:20240529,
baseTime:0630,
category:UUU,
fcstDate:20240529,
fcstTime:0900,
fcstValue:0.5,
nx:62,
ny:122,
baseDate:20240529,
baseTime:0630,
category:UUU,
fcstDate:20240529,
fcstTime:1000,
fcstValue:1.6,
nx:62,
ny:122,
baseDate:20240529,
baseTime:0630,
category:UUU,
fcstDate:20240529,
fcstTime:1100,
fcstValue:2.2,
nx:62,
ny:122,
baseDate:20240529,
baseTime:0630,
category:UUU,
fcstDate:20240529,
fcstTime:1200,
fcstValue:2.6,
nx:62,
ny:122,
baseDate:20240529,
baseTime:0630,
category:VVV,
fcstDate:20240529,
fcstTime:0700,
fcstValue:0.5,
nx:62,
ny:122,
baseDate:20240529,
baseTime:0630,
category:VVV,
fcstDate:20240529,
fcstTime:0800,
fcstValue:0.9,
nx:62,
ny:122,
baseDate:20240529,
baseTime:0630,
category:VVV,
fcstDate:20240529,
fcstTime:0900,
fcstValue:1.1,
nx:62,
ny:122,
baseDate:20240529,
baseTime:0630,
category:VVV,
fcstDate:20240529,
fcstTime:1000,
fcstValue:1.1,
nx:62,
ny:122,
baseDate:20240529,
baseTime:0630,
category:VVV,
fcstDate:20240529,
fcstTime:1100,
fcstValue:0.8,
nx:62,
ny:122,
baseDate:20240529,
baseTime:0630,
category:VVV,
fcstDate:20240529,
fcstTime:1200,
fcstValue:0.6,
nx:62,
ny:122,
baseDate:20240529,
baseTime:0630,
category:VEC,
fcstDate:20240529,
fcstTime:0700,
fcstValue:118,
nx:62,
ny:122,
baseDate:20240529,
baseTime:0630,
category:VEC,
fcstDate:20240529,
fcstTime:0800,
fcstValue:151,
nx:62,
ny:122,
baseDate:20240529,
baseTime:0630,
category:VEC,
fcstDate:20240529,
fcstTime:0900,
fcstValue:204,
nx:62,
ny:122,
baseDate:20240529,
baseTime:0630,
category:VEC,
fcstDate:20240529,
fcstTime:1000,
fcstValue:236,
nx:62,
ny:122,
baseDate:20240529,
baseTime:0630,
category:VEC,
fcstDate:20240529,
fcstTime:1100,
fcstValue:250,
nx:62,
ny:122,
baseDate:20240529,
baseTime:0630,
category:VEC,
fcstDate:20240529,
fcstTime:1200,
fcstValue:257,
nx:62,
ny:122,
baseDate:20240529,
baseTime:0630,
category:WSD,
fcstDate:20240529,
fcstTime:0700,
fcstValue:1,
nx:62,
ny:122,
baseDate:20240529,
baseTime:0630,
category:WSD,
fcstDate:20240529,
fcstTime:0800,
fcstValue:1,
nx:62,
ny:122,
baseDate:20240529,
baseTime:0630,
category:WSD,
fcstDate:20240529,
fcstTime:0900,
fcstValue:1,
nx:62,
ny:122,
baseDate:20240529,
baseTime:0630,
category:WSD,
fcstDate:20240529,
fcstTime:1000,
fcstValue:2,
nx:62,
ny:122,
baseDate:20240529,
baseTime:0630,
category:WSD,
fcstDate:20240529,
fcstTime:1100,
fcstValue:2,
nx:62,
ny:122,
baseDate:20240529,
baseTime:0630,
category:WSD,
fcstDate:20240529,
fcstTime:1200,
fcstValue:3,
nx:62,
ny:122,
pageNo:1,
numOfRows:60,
totalCount:60

 

현재 위치정보는 성남시로 나오는데요.

핸드폰 핫스팟으로 접속했더니 현재 위치정보가 좀 많이 어긋나네요. 

이건 급한게 아니니 천천히 수정하려고 합니다. 

 

 

항목설명

baseDate 예보 발표 날짜 (YYYYMMDD 형식)
baseTime 예보 발표 시각 (HHMM 형식)
category 예보 항목 코드
fcstDate 예보 날짜 (YYYYMMDD 형식)
fcstTime 예보 시각 (HHMM 형식)
fcstValue 예보 값
nx 예보 지점의 X 좌표
ny 예보 지점의 Y 좌표

 

코드 (category)설명

LGT 낙뢰 가능성
PTY 강수 형태
RN1 1시간 강수량
SKY 하늘 상태
T1H 1시간 기온
REH 습도
UUU 동서바람성분
VVV 남북바람성분
VEC 풍향
WSD 풍속

 

 

모든 코드와 자료정리는 ChatGPT가 했습니다. 
다음은 이 데이터를 간결하게 정리해서 저장하는 부분을 추가하려고 합니다. 

728x90
반응형
728x90
반응형

*아두이노 기상청 등으로 검색이 많이 들어오는데, 잘 정리된 블로그 링크를 걸어놓겠습니다. 

관련 프로젝트를 하시는 분들은 아래 링크를 참조하세요. 

https://postpop.tistory.com/86

 

아두이노 - ESP01 모듈, 기상청 / 오픈웨더맵 API 날씨 정보 받기

아두이노에서 날씨 정보를 받기 위해서는 기상 서비스 사이트의 API KEY가 있어야 합니다. 한국의 경우 공공데이터포털, 외국 사이트는 OpenWeatherMap에서 회원가입한 뒤 KEY를 할당받아 코딩해 주어

postpop.tistory.com

 

 

 

날씨 예보를 받는 서비스는 오픈웨더맵 외에 '공공 데이터 포털'을 들 수 있습니다. 

이곳에서는 단기예보와 중기예보, 미세먼지 데이터 등 한국 상황에 훨씬 더 잘 맞는 데이터들을 얻을 수 있죠. 

https://www.data.go.kr/

 

공공데이터 포털

국가에서 보유하고 있는 다양한 데이터를『공공데이터의 제공 및 이용 활성화에 관한 법률(제11956호)』에 따라 개방하여 국민들이 보다 쉽고 용이하게 공유•활용할 수 있도록 공공데이터(Datase

www.data.go.kr

 

 

 

 

공공데이터를 이용하려면 일단 인증키를 발급받아야 하는데요

메뉴를 조금만 찾아보시면 쉽게 인증키 신규발급 메뉴를 찾으실 수 있습니다.

발급받은 인증키는 마이페이지 메뉴에서 바로 확인 가능합니다. 

 

 

 

그리고 나서 이제 원하는 API 사용신청을 하면 됩니다. 

보통 간단한 날씨예보는 "단기예보" 를 확인하면 오늘의 시간별 날씨와 3일간의 날씨를 확인할 수 있습니다. 

[데이터찾기] - [데이터목록] 을 클릭하고 "단기예보"를 입력해 검색합니다. 

 

 

 

 

 

 

 

그리고 창을 약간 내려서 오픈API 탭을 클릭하면 "기상청_단기예보 ((구)_동네예보) 조회서비스" 가 나옵니다. 

"활용신청" 버튼을 클릭합니다. 

 

신청 메뉴에는 사용 목적 등을 간단하게 적으면 되며, 신청 즉시 사용이 가능합니다. 

 

 

 

개발용 계정은 즉시 승인되어 바로 사용할 수 있습니다.

단기예보는 하루에 10000건, 대기오염정보는 500건 제한이 있긴 한데 개인용으로 쓰기엔 전혀 문제없는 용량이죠.

 

 

 

 

 

자세한 활용방법을 알고 싶으면 조회서비스를 들어가서 하단의 .zip 파일을 다운받으면 내용을 확인할 수 있습니다. 

 

 

 

 

 

 

728x90
반응형
728x90
반응형

제가 뭐 주변지역으로 노드를 쫙 깔거나 그런 것 까지는 생각을 안했지만요. 

테스트를 하건 뭐건 적어도 주변에 고정 노드는 하나 있어야 뭔가를 하기 쉽겠더군요.

설치 위치가 고민인데 서울 도심에서 설치하는 것도 난관이고 무엇보다 자체전원을 갖춰야 한다는 것도 문제입니다.




https://austinmesh.org/#building-a-solar-powered-repeater

 

Austin Mesh

Austin Mesh is a community group working to build a mesh network of solar-powered meshtastic radios in Austin. This network acts like a city-wide text messaging system, allowing people to communicate publicly or privately with anyone on the network. All of

austinmesh.org

검색해 보니 외국의 리피터 설치 경험담이 있는데요.

텍사스 오스틴(위도 30.2672N) 에서 소형 5W 급 태양전지 등을 사용했다가 몇달만에 자꾸 노드가 죽어 몇번씩 장비를 교체한 내용들이 있습니다. 

 

이것저것 고민해보니 소형 태양광 전지를 쓰더라도 장비만 그럭저럭 가동되면 테스트는 가능할 것 같습니다. 

RAK wisblock 장비가 그나마 전력 소모가 적다고 하니 그 장비를 기준으로 할까 하는데요.

검색해 보니 이것도 태양광이 적어 전압이 불안정하면 애매하게 죽어서 복구가 안 되는 경우가 있는 듯 하더군요. 

 

그렇다면 애초에 저전압 컷 기능이 있는 태양광 충전기는 없나? 하고 또 알아보게 되었습니다.

그리고 우리의 멋진 GreatScott 형님의 과거 동영상을 보게 되었죠.
https://www.youtube.com/watch?v=kEttqWJrdww

 


내용을 몇번씩 검토해 봤는데 원하는 기능을 완벽하게 구현해 놓아 그대로 써도 될 것 같습니다.

과충전 / 과방전 / 과전류 보호에 5V 출력 부스트, MPPT까지 모두 돌아가는 충전 및 보호회로입니다.

 

 

 

 

 

다행히 회로도를 제공해 주셔서 그대로 쓰면 될 것 같지만

 

 

 

 

 

 

좀 깔끔하게 정리를 했고요. 

BOM 을 뽑아서 LCSC에 넘겨보니 재고가 없는 부품들이 있어서 대체 부품으로 다시 넣었습니다. 

 

 

 

 

 

 

 

 

 

재고없는 제품, 재고 모자란 제품 등등이 섞여서 BOM 정리하고 주문하는 게 PCB 제작보다 오래 걸렸네요

 

 

 

 

 

부품이 도착하고 납땜을 했습니다. 

일단 배터리 입력에 18650을 하나 연결하고 출력단 전압을 체크해보니 승압이 잘 되고 있습니다. 

이후 배터리 대신 파워 서플라이를 연결하고 전압을 오르락 내리락 해보니 2.5V에서 전압이 컷오프 되는 것을 볼 수 있었습니다. 

다만 다시 전압을 올리면 출력이 되지 않고 스위치를 off/on 해야 다시 출력이 나오더군요. 

만약 배터리가 위험전압까지 떨어진다면 수동으로 스위치를 껐다 켜야만 할 것 같습니다. 

 

 

 

아직 R8, R9은 납땜하지 않았는데 이는 태양전지 MPPT 전압에 맞춰야 하기 때문입니다. 
위의 GreatScott 영상에서는 9:20초쯤부터 나옵니다. 

전압분배를 이용해서 MPPT 핀에 1.205V 가 입력되도록 하면 된다는군요

 

 

태양전지의 MPPT는 잘 알지 못하므로 GPT에게 물어봤습니다. 

 

 

회로 자체는 검증된 것이라 작동에는 문제가 없을 듯 하고요.

적당한 태양전지 판을 구해서 테스트를 해 봐야 할 것 같습니다.

 

 

 

 

 

 

** 디스코드 서버를 열었습니다. **

 

https://discord.gg/KxCcbDT3am

커뮤니티 없이 meshtastic 프로젝트를 하는건 많이 힘듭니다.

 

한국 meshtastic 유저 커뮤니티 Discord 서버에 가입하세요!

Meshtastic 한국 사용자 커뮤니티입니다. LoRa 메쉬 네트워크 관련 정보를 나누고 소통합니다. | 멤버 18명

discord.com

 

모여서 같이 정보를 나누고 서로 도움이 되었으면 좋겠습니다. 

728x90
반응형
728x90
반응형

Openweathermap에서 날씨를 받아와 사용하려 했는데 데이터 변환 과정에서 골치아픈 부분이 있었습니다. 

차후 4.2" 전자잉크 등 보다 화면이 넓은 기기를 사용하기 위해서 당일의 온도변화, 7일치의 날씨변화 등도 있었으면 했고요.

무엇보다 현재 날씨는 알 수 있는데 당일 날씨나 최저, 최고 온도 등 우리가 흔히 쓰는 기준으로 데이터를 얻기가 힘들더군요.

 

 

그리고 이 모든 것을 ChatGPT4.0 에게 맡겼습니다. 

 

 

 

 

 

 

 

 

저는 그냥 이렇게 해줘, 저렇게 해줘, 여기 틀렸잖아

를 반복하다 보니 코드는 손도 안대고 좋은 결과가 나오더군요

 

 

금일 온도 / 최저 / 최고온도 / 체감온도/ 구름 / 풍속 / 강수량 / 강설량 등이 잘 정리되어 출력된 것을 볼 수 있습니다. 

5일간 날씨 데이터도 마찬가지로 정리되어 나오고 있고요

 

 

 

아래는 이 코드입니다.

#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <HTTPClient.h>
#include <Arduino_JSON.h>

// WiFi 설정
const char* ssid = "Yourssid";
const char* password = "yourPW";

// OpenWeatherMap API 키
String openWeatherMapApiKey = "YourAPI";

// 서울의 도시명과 국가 코드
String city = "Seoul";
String countryCode = "KR";

// 업데이트 주기 설정 (15초)
unsigned long lastTime = 0;
unsigned long timerDelay = 15000; 

void setup() {
  Serial.begin(115200); // 시리얼 모니터 시작
  Serial.println("serial start"); // 디버깅 메시지 추가
  WiFi.begin(ssid, password); // WiFi 연결 시작
  Serial.println("Connecting to WiFi");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("\nConnected to WiFi");
  Serial.print("IP Address: ");
  Serial.println(WiFi.localIP());

  // 즉시 첫 번째 API 호출을 위해 lastTime 초기화
  lastTime = millis() - timerDelay;
}

void loop() {
  // 타이머가 만료되었을 때 데이터 요청
  if ((millis() - lastTime) > timerDelay) {
    if (WiFi.status() == WL_CONNECTED) {
      // API 요청 URL 구성 - 3시간 간격의 5일 예보 데이터
      String serverPath = "https://api.openweathermap.org/data/2.5/forecast?q=" + city + "," + countryCode + "&appid=" + openWeatherMapApiKey + "&units=metric";
      
      // 데이터 요청 및 수신
      String weatherData = httpGETRequest(serverPath.c_str());
      if (weatherData != "{}") { 
        parseWeatherData(weatherData); // 수신된 데이터 파싱
      }
      lastTime = millis();
    } else {
      Serial.println("WiFi Disconnected");
    }
  }
}

// HTTP GET 요청 함수
String httpGETRequest(const char* serverName) {
  WiFiClientSecure client; 
  client.setInsecure();    // SSL 인증서 검증 무시
  HTTPClient http;
  http.begin(client, serverName); // HTTPS 연결 시작
  Serial.println("Requesting URL: " + String(serverName));

  int httpResponseCode = http.GET();
  
  String payload = "{}";
  if (httpResponseCode == 200) {
    Serial.print("HTTP Response code: ");
    Serial.println(httpResponseCode);
    payload = http.getString();
  } else {
    Serial.print("Error code: ");
    Serial.println(httpResponseCode);
    payload = http.getString(); 
    Serial.println("Error response: " + payload);
  }
  http.end();
  return payload;
}

// 타임스탬프를 한국 표준시(KST)로 변환하는 함수
String convertUnixTimeToKST(long unixTime) {
  unixTime += 9 * 3600; // UTC+9 시간대 보정
  time_t t = unixTime;
  struct tm *tmStruct = localtime(&t);
  char buffer[30];
  strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", tmStruct);
  return String(buffer);
}

// 날씨 데이터 파싱 함수
void parseWeatherData(String json) {
  JSONVar myObject = JSON.parse(json);
  if (JSON.typeof(myObject) == "undefined") {
    Serial.println("Parsing failed!");
    return;
  }

  // 오늘 날씨 데이터 파싱 및 출력
  Serial.println("Today's Weather Data:");
  JSONVar list = myObject["list"];

  // 하루 동안의 데이터에서 최저/최고 온도 계산
  float dayMinTemp = 1000;
  float dayMaxTemp = -1000;
  for (int i = 0; i < 8; i++) { // 24시간 내의 3시간 간격 데이터
    JSONVar data = list[i];
    float temp_min = (float)(double)data["main"]["temp_min"];
    float temp_max = (float)(double)data["main"]["temp_max"];
    if (temp_min < dayMinTemp) dayMinTemp = temp_min;
    if (temp_max > dayMaxTemp) dayMaxTemp = temp_max;
  }
  JSONVar todayData = list[0];
  float temp = (float)(double)todayData["main"]["temp"];
  float feels_like = (float)(double)todayData["main"]["feels_like"];
  const char* weather_description = (const char*)(todayData["weather"][0]["description"]);
  float humidity = (float)(double)todayData["main"]["humidity"];
  float clouds = (float)(double)todayData["clouds"]["all"];
  float wind_speed = (float)(double)todayData["wind"]["speed"];
  float rain = todayData.hasOwnProperty("rain") ? (float)(double)todayData["rain"]["3h"] : 0;
  float snow = todayData.hasOwnProperty("snow") ? (float)(double)todayData["snow"]["3h"] : 0;

  Serial.print("Temp: ");
  Serial.println(temp);
  Serial.print("Min Temp: ");
  Serial.println(dayMinTemp);
  Serial.print("Max Temp: ");
  Serial.println(dayMaxTemp);
  Serial.print("Feels Like: ");
  Serial.println(feels_like);
  Serial.print("Humidity: ");
  Serial.println(humidity);
  Serial.print("Clouds: ");
  Serial.println(clouds);
  Serial.print("Weather: ");
  Serial.println(weather_description);
  Serial.print("Wind Speed: ");
  Serial.println(wind_speed);
  Serial.print("Rain Volume (3h): ");
  Serial.println(rain);
  Serial.print("Snow Volume (3h): ");
  Serial.println(snow);
  Serial.println("-------");

  // 5일간 날씨 데이터 파싱 및 출력
  Serial.println("5 Days Weather Data:");
  for (int day = 0; day < 5; day++) {
    float minTemp = 1000;
    float maxTemp = -1000;
    float avgHumidity = 0;
    float avgClouds = 0;
    float avgWindSpeed = 0;
    float totalRain = 0;
    float totalSnow = 0;
    int count = 0;
    String weatherDescriptions = "";

    for (int i = day * 8; i < (day + 1) * 8 && i < list.length(); i++) {
      JSONVar dayData = list[i];
      float temp_min = (float)(double)dayData["main"]["temp_min"];
      float temp_max = (float)(double)dayData["main"]["temp_max"];
      float humidity = (float)(double)dayData["main"]["humidity"];
      float clouds = (float)(double)dayData["clouds"]["all"];
      float wind_speed = (float)(double)dayData["wind"]["speed"];
      float rain = dayData.hasOwnProperty("rain") ? (float)(double)dayData["rain"]["3h"] : 0;
      float snow = dayData.hasOwnProperty("snow") ? (float)(double)dayData["snow"]["3h"] : 0;
      const char* weather_description = (const char*)(dayData["weather"][0]["description"]);

      if (temp_min < minTemp) minTemp = temp_min;
      if (temp_max > maxTemp) maxTemp = temp_max;
      avgHumidity += humidity;
      avgClouds += clouds;
      avgWindSpeed += wind_speed;
      totalRain += rain;
      totalSnow += snow;
      weatherDescriptions = String(weather_description);
      count++;
    }
    avgHumidity /= count;
    avgClouds /= count;
    avgWindSpeed /= count;

    long date = (long)list[day * 8]["dt"];
    Serial.print("Date: ");
    Serial.print(convertUnixTimeToKST(date));
    Serial.print(", Min Temp: ");
    Serial.print(minTemp);
    Serial.print(", Max Temp: ");
    Serial.print(maxTemp);
    Serial.print(", Humidity: ");
    Serial.print(avgHumidity);
    Serial.print(", Clouds: ");
    Serial.print(avgClouds);
    Serial.print(", Wind Speed: ");
    Serial.print(avgWindSpeed);
    Serial.print(", Rain Volume (3h): ");
    Serial.print(totalRain);
    Serial.print(", Snow Volume (3h): ");
    Serial.print(totalSnow);
    Serial.print(", Weather: ");
    Serial.println(weatherDescriptions);
    Serial.println("-------");
  }
}

 

 

그렇지만 이 모든 걸 갈아엎게 되는데.. 다음 포스팅에 이어서 쓰겠습니다.

728x90
반응형
728x90
반응형

검색해 보면 날씨정보를 받아오는 방법은 여러 가지입니다.

기상청이나 여타 날씨관련 사이트 등에서도 가능하지만 여러 모로 알아본 결과 openweathermap 이 편리할 것 같더군요




1. 오픈웨더맵 가입 - api 를 생성합니다.

 

 

이후 

http://api.openweathermap.org/data/2.5/weather?q=yourCityName,yourCountryCode&APPID=yourUniqueAPIkey

위 텍스트에서 yourCityName / yourCountryCode / yourUniqueAPIkey를 수정해야 하는데요.

 

 

 

 

서울을 예로 들면

검색하면 이렇게 나오는데 yourCityName 은 Seoul, yourCountryCode 은 KR 을 넣으면 됩니다

그리고 마지막 yourUniqueAPIkey 를 처음 발급받은 API 를 복사해서 수정하면 전체 주소가 완성됩니다.

 

 

 

 

 

 

그 주소를 인터넷 창에 입력해보면 다음과 같이 날씨 데이터가 표시되는 것을 알 수 있습니다

 

 

 

이제 이 API 주소를 이용해 ESP32C3 에서 날씨 데이터를 받아와 보겠습니다.

맨 먼저 날씨 데이터가 JSON 형식으로 나오기 때문에 이를 처리할 Arduino_JSON 라이브러리를 설치해 줬습니다.

 

 

 

 

 

 

이번에는 초기 코드를 99% 이상 ChapGPT 4.0에게 맡겼습니다. 

예전보다 훨씬 뛰어나져서 원하는 대로 코드를 깔끔하게 짜 주네요.

저는 세부 사항 몇가지를 조정하고 두세번 다시 물어보는 정도로 코드를 완성할 수 있었습니다. 

 

 

 

전체 코드는 아래와 같습니다.

#include <WiFi.h>
#include <HTTPClient.h>
#include <Arduino_JSON.h>

const char* ssid = "YourWifiID";
const char* password = "YourWifiPassword";

// Your Domain name with URL path or IP address with path
String openWeatherMapApiKey = "YourAPI";

// Replace with your country code and city
String city = "Seoul";
String countryCode = "KR";

// Timer set to 15 seconds for demonstration
unsigned long lastTime = 0;
unsigned long timerDelay = 15000;

String jsonBuffer;

void setup() {
  Serial.begin(115200);
  WiFi.begin(ssid, password);
  Serial.println("Connecting");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to WiFi network with IP Address: ");
  Serial.println(WiFi.localIP());
  Serial.println("Timer set to 15 seconds (timerDelay variable), it will take 15 seconds before publishing the first reading.");
}

void loop() {
  if ((millis() - lastTime) > timerDelay) {
    if (WiFi.status() == WL_CONNECTED) {
      String serverPath = "http://api.openweathermap.org/data/2.5/weather?q=" + city + "," + countryCode + "&APPID=" + openWeatherMapApiKey;
      jsonBuffer = httpGETRequest(serverPath.c_str());
      JSONVar myObject = JSON.parse(jsonBuffer);

      if (JSON.typeof(myObject) == "undefined") {
        Serial.println("Parsing input failed!");
        return;
      }

      Serial.print("Latitude: ");
      Serial.println(myObject["coord"]["lat"]);
      Serial.print("Longitude: ");
      Serial.println(myObject["coord"]["lon"]);
      
      Serial.println("Weather Details:");
      for (int i = 0; i < myObject["weather"].length(); i++) {
        Serial.print("  Weather ID: ");
        Serial.println(myObject["weather"][i]["id"]);
        Serial.print("  Main: ");
        Serial.println(myObject["weather"][i]["main"]);
        Serial.print("  Description: ");
        Serial.println(myObject["weather"][i]["description"]);
        Serial.print("  Icon: ");
        Serial.println(myObject["weather"][i]["icon"]);
      }

      Serial.print("Temperature: ");
      Serial.println(myObject["main"]["temp"]);
      Serial.print("Feels Like: ");
      Serial.println(myObject["main"]["feels_like"]);
      Serial.print("Minimum Temperature: ");
      Serial.println(myObject["main"]["temp_min"]);
      Serial.print("Maximum Temperature: ");
      Serial.println(myObject["main"]["temp_max"]);
      Serial.print("Pressure: ");
      Serial.println(myObject["main"]["pressure"]);
      Serial.print("Humidity: ");
      Serial.println(myObject["main"]["humidity"]);

      Serial.print("Wind Speed: ");
      Serial.println(myObject["wind"]["speed"]);
      Serial.print("Wind Direction (Degrees): ");
      Serial.println(myObject["wind"]["deg"]);
      if (myObject["wind"].hasOwnProperty("gust")) {
        Serial.print("Wind Gust: ");
        Serial.println(myObject["wind"]["gust"]);
      }
      
      if (myObject.hasOwnProperty("rain")) {
        Serial.print("Rain Volume for last hour: ");
        Serial.println(myObject["rain"]["1h"]);
      }
      
      if (myObject.hasOwnProperty("snow")) {
        Serial.print("Snow Volume for last hour: ");
        Serial.println(myObject["snow"]["1h"]);
      }

      Serial.print("Visibility: ");
      Serial.println(myObject["visibility"]);
      
      Serial.print("Cloudiness (%): ");
      Serial.println(myObject["clouds"]["all"]);

      lastTime = millis();
    } else {
      Serial.println("WiFi Disconnected");
    }
  }
}

String httpGETRequest(const char* serverName) {
  WiFiClient client;
  HTTPClient http;
  http.begin(client, serverName);
  int httpResponseCode = http.GET();
  String payload = "{}"; 

  if (httpResponseCode > 0) {
    Serial.print("HTTP Response code: ");
    Serial.println(httpResponseCode);
    payload = http.getString();
  } else {
    Serial.print("Error code: ");
    Serial.println(httpResponseCode);
  }
  http.end();
  return payload;
}

 

 

 

 

 

아래가 출력 결과입니다.

완벽합니다.

 

 

 

 

 

여담이지만 재미있던 것은 제가 출력 반복 간격을 늦추려고 10000(10초)를 15000(15초)로 변경했더니 

바로 다음 질답에서 시리얼 출력의 'Timer set to 10 seconds...' 부분을 'Timer set to 15 seconds...' 로 바꾸더군요

이런 센스(?)까지 발휘하는 모습에 다소 놀랐습니다. 

 

 

728x90
반응형
728x90
반응형

 

 

타오바오에서 너무 많이 사는 바람에 혼자서는 평생 쓰고도 남을 만큼의 전자잉크가 생겨서 사용처를 고민중이었습니다. 

그러다가 마음에 드는 프로젝트를 발견했죠.

 

 

 

 

 

 

 

전기도 많이 먹지 않고, 리프레쉬도 자주 필요 없는 이런 날씨정보 디스플레이 용으로 좋겠더군요.

 

 

 

 

 

 

원래는 전용 드라이버 보드를 제작해서 컨트롤러를 대체하려고 했지만 실패하고..

디버깅 중에 어차피 비용도 비슷하게 들 것 같아 그냥 편한 쪽으로 일단 진행하기로 했습니다. 

 

 

 

 

 

 

 

 

컨트롤러는 ESP32C3 보드를 사용할 예정입니다.

 

 

 

 

 

가격은 무려 2천원대에 블루투스, 와이파이도 되면서 ESP32의 성능을 가져 성능도 부족할 게 없고요.

보다시피 엄청 아담한 사이즈라 사용하기에도 좋습니다. 

728x90
반응형

+ Recent posts