nCube:Thyme for Arduino Application : nCube Aqua (Korean) - IoTKETI/nCube-Thyme-Arduino GitHub Wiki

nCube:Thyme for Arduino - Application : nCube-Aqua

๊ฐœ๋ฐœํ™˜๊ฒฝ ์„ค์ •

IDE installation & nCube:Thyme for Arduino Libraries Download

Json & MQTT & Temperature & Adafruit_NeoPixel & OneWire Libraries for Arduino ๋‹ค์šด๋กœ๋“œ

์•„๋ž˜์— ๋งํฌ๋œ github ํŽ˜์ด์ง€๋ฅผ ํ†ตํ•ด์„œ ArduinoJson, PubSubClient, DallasTemperature, Adafruit_NeoPixel, OneWire ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋‹ค์šด๋กœ๋“œ ๋ฐ›๋Š”๋‹ค.

๋‹ค์šด๋กœ๋“œ ๋ฐ›์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์„ ์•„๋ž˜์˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด nCube:Thyme for Arduino ํ”„๋กœ์ ํŠธ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํด๋”๋กœ ๋ณต์‚ฌํ•œ๋‹ค.

pubsubclient/src ๋””๋ ‰ํ† ๋ฆฌ ์•„๋ž˜์˜ PubSubClient.h ํŒŒ์ผ์„ ์—ด๊ณ , MQTT_MAX_PACKET_SIZE ๋ณ€์ˆ˜์˜ ๊ฐ’์„ 400์œผ๋กœ ๋ฐ”๊พธ์–ด ์ค€๋‹ค.

ํ•˜๋“œ์›จ์–ด

์žฌ๋ฃŒ ๋ชฉ๋ก

  • Adafruit Feather M0 WiFi with uFL 1๊ฐœ
  • 2.4GH Mini Flexible WiFi Antenna with uFL Connector 1๊ฐœ
  • Fish feeder for Open Aquarium 1๊ฐœ
  • Adafruit NeoPixel Digital RGBW LED Strip 1๊ฐœ
  • Vertical Liquid Level Sensor 1๊ฐœ
  • Gravity: Analog pH Sensor / Meter Kit For Arduino 1๊ฐœ
  • DS18B20 - Water Temperature Sensor 1๊ฐœ
  • Adafruit Power Relay FeatherWing 1 ๊ฐœ
  • Capacitor 1000uF, 6.3V 1๊ฐœ
  • 470ฮฉ, 10kฮฉ ์ €ํ•ญ ๊ฐ๊ฐ 1๊ฐœ์”ฉ
  • Bread Board 1๊ฐœ
  • Jumper Cable M/M ํ•œ ์„ธํŠธ
  • USB Type-A to Micro-B Cable 1๊ฐœ
  • 5V 2A USB Micro-B Power Adaptor 1๊ฐœ
  • ์•„ํฌ๋ฆดํŒ(LED ๋ถ€์ฐฉ์šฉ) 1๊ฐœ
  • ๋„ค์˜ค๋””์›€ ์ž์„(LED ๋ถ€์ฐฉ์šฉ ์•„ํฌ๋ฆดํŒ ๊ณ ์ •์šฉ) 4๊ฐœ
  • Switch Box 12512575mm 1๊ฐœ
  • ์ผ€์ด๋ธ” ๊ทธ๋žœ๋“œ 3๊ฐœ
  • ์–ดํ•ญ ์—ฌ๊ณผ๊ธฐ 1๊ฐœ

  • Cortex M0 processor
  • SPI, I2C, UART ํ†ต์‹  ์ง€์›
  • 802.11bgn์„ ์ง€์›ํ•˜๋Š” Atmel WINC1500 WiFi chip

  • cooking hacks์—์„œ ์ œ๊ณตํ•˜๋Š” Open Aquarium์— ํŒจํ‚ค์ง• ๋˜์–ด์žˆ๋Š” ํ’ˆ๋ชฉ์ด๋‹ค.
  • ์ „์›์œผ๋กœ 3.3V๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, ํฌ๊ธฐ๋Š” 116.510.7cm ์ด๋‹ค.
  • ๋ฐฐ์ถœ๋˜๋Š” ๋ฌผ๊ณ ๊ธฐ ๋จน์ด์˜ ์–‘์„ ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ๋‹ค.

  • DFROBOT์—์„œ ์ œ๊ณตํ•˜๋Š” ์ œํ’ˆ์œผ๋กœ, ADC(Analog-Digital-Converter)๊ฐ€ ๋‚ด์žฅ๋œ ๋ณด๋“œ๊ฐ€ ํฌํ•จ๋˜์–ด์žˆ์–ด ์•„๋‘์ด๋…ธ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๊ธฐ์— ํŽธ๋ฆฌํ•˜๋‹ค.
  • ์ „์›์œผ๋กœ 5V๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, ์ „์›์ด ์ธ๊ฐ€๋˜์—ˆ์„ ๋•Œ LED๊ฐ€ ์ ๋“ฑ๋œ๋‹ค.
  • ์ธก์ • ๊ฐ€๋Šฅํ•œ PH๊ฐ’์˜ ๋ฒ”์œ„๋Š” 1~14 ์ด๋‹ค.

DS18B20 Temperature Sensor

  • ์ „์›์œผ๋กœ 3~5.5V๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, ์˜จ๋„ ์ธก์ • ๋ถ€์œ„๋Š” ๋ฌผ๊ณผ ์ง์ ‘์ ์œผ๋กœ ์ ‘์ด‰ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฉ์ˆ˜๊ธฐ๋Šฅ์ด ํฌํ•จ๋˜์–ด์žˆ๋‹ค.
  • -55~125โ„ƒ์˜ ํ™˜๊ฒฝ์—์„œ -10~85โ„ƒ๋ฒ”์œ„์˜ ์˜จ๋„๋ฅผ ์ธก์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

Vertical Liquid Level Sensor

  • cooking hacks์—์„œ ์ œ๊ณตํ•˜๋Š” Open Aquarium์— ํŒจํ‚ค์ง• ๋˜์–ด์žˆ๋Š” ํ’ˆ๋ชฉ์ด๋‹ค.
  • ์ˆ˜์œ„๊ฐ€ ๋‚ฎ์•„์ง€๋ฉด Data ์„ ์˜ ์ „์œ„๊ฐ€ GND ์„ ์˜ ์ „์œ„์™€ ์ผ์น˜ํ•˜๊ฒŒ ๋œ๋‹ค.

Adafruit NeoPixel Digital RGBW LED Strip

  • Red, Green, Blue, White 4๊ฐ€์ง€์˜ ๋น›์„ ๋‚ผ ์ˆ˜ ์žˆ๋‹ค.
  • ์ „์›์œผ๋กœ 5V๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, LED Strip์˜ ๊ธธ์ด์— ๋”ฐ๋ผ 1m ์ผ ๋•Œ 2A๊ฐ€, 4m ์ผ ๋•Œ 4A๊ฐ€ ๊ณต๊ธ‰๋˜์–ด์•ผ ํ•œ๋‹ค.
  • ํ•„์š”์— ๋”ฐ๋ผ ์ž˜๋ผ์„œ ํ•„์š”ํ•œ ๊ธธ์ด๋กœ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

nCube-Aqua ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ๊ฐœ๋ฐœ

ํ•˜๋“œ์›จ์–ด ์—ฐ๊ฒฐ

์•„๋ž˜์˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด Adafruit Feather M0์™€ ์„ผ์„œ๋“ค์„ ์—ฐ๊ฒฐํ•œ๋‹ค.

Adafruit board ์„ธ๋ถ€ ์—ฐ๊ฒฐ ์œ„์น˜

nCube-Aqua๋ฅผ ์ด์šฉํ•œ ์ˆ˜์กฐ ๊พธ๋ฏธ๊ธฐ

์•„๋ž˜์˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ์™ธ๋ถ€ ์—ฌ๊ณผ๊ธฐ๋ฅผ ์„ค์น˜ํ•œ๋‹ค.

์•„๋ž˜์˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ์ˆ˜์กฐ์— ์˜จ๋„์„ผ์„œ, pH์„ผ์„œ, ์ˆ˜์œ„์„ผ์„œ, feeder์™€ LED๋ฅผ ์„ค์น˜ํ•˜๊ณ ,

Switch Box์— Adafruit Feather M0์™€ Bread Board๋ฅผ ๋„ฃ์–ด ์ •๋ฆฌํ•œ๋‹ค.

Mobius์™€ ์—ฐ๋™ํ•˜๊ธฐ

์•„๋ž˜ ๊ทธ๋ฆผ์€ ๋ชจ๋น„์šฐ์Šค์™€ ์•„์ฟ ์•„๋ฆฌ์›€์— ๋Œ€ํ•œ ์ „์ฒด ๊ตฌ์กฐ๋„์ด๋‹ค.

nCuba-Aqua Arduino sketch

์•„๋ž˜์˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด lib/oneM2MClient/examples/nCube-Aquarium ๋””๋ ‰ํ† ๋ฆฌ์— ์žˆ๋Š” nCube-Aqua.ino Arduino sketch ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ src ๋””๋ ‰ํ† ๋ฆฌ์— ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค.

TasAquarium.h ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ถ”๊ฐ€์‹œํ‚ค๊ณ , Aqua ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
AE-ID๋Š” SAqua5๋กœ AE-NAME์€ aqua5๋กœ ํ•ฉ๋‹ˆ๋‹ค. (์‚ฌ์šฉ์ž๋ณ„๋กœ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ)

sensing_interval๊ฐ’์„ ํ†ตํ•ด ์„ผ์„œ๋“ค์˜ ๋ฐ์ดํ„ฐ ์—…๋กœ๋“œ ์ฃผ๊ธฐ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ๋“ค์–ด, temp๋Š” 60์ดˆ๋กœ ์„ค์ •๋˜์–ด์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ ์„ผ์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  Container๊ฐ€ 5๊ฐœ ํ•„์š”ํ•˜๋ฏ€๋กœ buildResource() ํ•จ์ˆ˜์˜ ์ฝ”๋“œ๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ๋ฐ”๊ฟ”์ค๋‹ˆ๋‹ค.
Container์˜ ์ด๋ฆ„์€ ๊ฐ ์„ผ์„œ๋ช…(temp, ph, waterlevel, feeder, led)์œผ๋กœ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.

feeder, led ์ œ์–ด ๋ฐ์ดํ„ฐ๋ฅผ noti ํ•˜์—ฌ์ค„ sub๋ฅผ ๊ฐ๊ฐ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
Subscription ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ถ€๋ถ„์—์„œ to๊ฐ’์˜ ํ•˜์œ„ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ’์„ feeder๋Š” nCube.resource[5].rn,
led๋Š” nCube.resource[6].rn ๋กœ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.

noti_callback() ํ•จ์ˆ˜ ๋‚ด์˜ if์กฐ๊ฑด๋ฌธ ๋‚ด์—์„œ ์•ž์„œ ์ˆ˜์ •ํ•œ ๋ฆฌ์†Œ์Šค ๊ตฌ์กฐ์— ๋งž์ถฐ
nCube.resource[8]๊ณผ nCube.resource[9]๋กœ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.
control_flag๋ฅผ ํ†ตํ•ด feeder์™€ led๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

setup() ํ•จ์ˆ˜ ๋‚ด์—์„œ LED, Temp, WaterLevel, Feeder๊ฐ’์„ ์ดˆ๊ธฐํ™” ํ•ด์ฃผ๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

loop() ํ•จ์ˆ˜ ๋‚ด์—์„œ Aqua.loop() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
Aqua.loop() ํ•จ์ˆ˜๋Š” ๊ณ„์†ํ•ด์„œ Feeder ์ƒํƒœ(on/off)๋ฅผ ์ฒดํฌํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

temp๊ฐ€ create_cin ์ผ ๊ฒฝ์šฐ Temperature ๊ฐ’์„ ์ฝ์–ด์™€ con ๋ณ€์ˆ˜์— ๋„ฃ๊ณ  ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

ph๊ฐ€ create_cin ์ผ ๊ฒฝ์šฐ PHSensor ๊ฐ’์„ ์ฝ์–ด์™€ con ๋ณ€์ˆ˜์— ๋„ฃ๊ณ  ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

waterlevel๊ฐ€ create_cin ์ผ ๊ฒฝ์šฐ WaterLevel ๊ฐ’์„ ์ฝ์–ด์˜จ ๋’ค
levelstatus๊ฐ€ HIGH(1)์ผ ๊ฒฝ์šฐ Full, LOW(0)์ผ ๊ฒฝ์šฐ Empty๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

loop() ํ•จ์ˆ˜ ๋‚ด์— control_flag ์กฐ๊ฑด๋ฌธ์— ๋”ฐ๋ผ Mobius๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ noti๊ฐ’์— ๋”ฐ๋ผ feeder์™€ led๊ฐ€ ๋™์ž‘๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
if(control_flag == 2)๊ฒฝ์šฐ feeder๋ฅผ ์ œ์–ดํ•˜๋ฉฐ, noti_con์ด 1์ผ ๊ฒฝ์šฐ feedFish(1)๊ฐ€ ๋™์ž‘๋ฉ๋‹ˆ๋‹ค.
if(control_flag == 3)๊ฒฝ์šฐ led๋ฅผ ์ œ์–ดํ•˜๋ฉฐ, noti_con์ด 1์ผ ๊ฒฝ์šฐ showLED()๊ฐ€ ๋™์ž‘๋˜๊ณ ,
1์ด์™ธ์— ๊ฐ’์ด๋ผ๋ฉด stopLED()๊ฐ€ ๋˜์–ด LED๊ฐ€ ๊บผ์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

nCube-Aqua Arduino sketch ์—…๋กœ๋“œ & ์‹คํ–‰


USB ์ผ€์ด๋ธ”์„ ์‚ฌ์šฉํ•˜์—ฌ Adafruit Feather M0 ๋ณด๋“œ์™€ PC๋ฅผ ์—ฐ๊ฒฐํ•œ๋‹ค.


nCube-Aqua.ino Arduino sketch ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผ ๋ฐ ์—…๋กœ๋“œ ํ•˜๊ธฐ์œ„ํ•ด PlatformIO ํˆด๋ฐ”์—์„œ Upload ๋ฒ„ํŠผ์„ ํด๋ฆญํ•œ๋‹ค.


nCube-Aqua ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ์‹คํ–‰ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์‹œ๋ฆฌ์–ผ ๋ชจ๋‹ˆํ„ฐ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
PlatformIO ํˆด๋ฐ”์—์„œ ์‹œ๋ฆฌ์–ผ ๋ชจ๋‹ˆํ„ฐ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•œ๋‹ค.


๋…ธํŠธ๋ถ ๋˜๋Š” ์Šค๋งˆํŠธํฐ์˜ WiFi๋ฅผ ์ด์šฉํ•˜์—ฌ ์‹œ๋ฆฌ์–ผ ๋ชจ๋‹ˆํ„ฐ์— ํ‘œ์‹œ๋œ 'wifi101-XXXX' (different name for each Adafruit Feather M0 board)์— ์—ฐ๊ฒฐํ•œ๋‹ค.


๊ทธ๋ฆฌ๊ณ  ์›น ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์—ด์–ด, URL ์ฃผ์†Œ์ฐฝ์— 'http://wifi101.local'๋ฅผ ์ž…๋ ฅํ•œ๋‹ค.
Network Name ์•„๋ž˜์—๋Š” ์—ฐ๊ฒฐํ•  AP์˜ SSID๋ฅผ ์ž…๋ ฅํ•˜๊ณ , Pass phrase ์•„๋ž˜์—๋Š” AP์˜ ํŒจ์Šค์›Œ๋“œ๋ฅผ ์ž…๋ ฅํ•œ ํ›„ connect ๋ฒ„ํŠผ์„ ํด๋ฆญํ•œ๋‹ค.


WiFi๋ฅผ ์—ฐ๊ฒฐํ•˜๋ฉด nCube-Aqua๊ฐ€ ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์„ผ์„œ์˜ ์„ผ์‹ฑ ๊ฐ’์„ ์—…๋กœ๋“œํ•œ๋‹ค. ๊ฒฐ๊ณผ๋Š” ์‹œ๋ฆฌ์–ผ ๋ชจ๋‹ˆํ„ฐ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

nCube-Aqua ์„ผ์„œ ๋ฐ์ดํ„ฐ ์กฐํšŒ

์„ผ์„œ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๊ธฐ ์œ„ํ•ด, Mobius Resource Monitor๋ฅผ ์—ฐ๋‹ค.


์œ„ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด Resource Path์— ๋ณ€์ˆ˜ AE_NAME์˜ ๊ฐ’์„ ์ž…๋ ฅํ•˜๊ณ  Start ๋ฒ„ํŠผ์„ ํด๋ฆญํ•œ๋‹ค.


์œ„ ๊ทธ๋ฆผ์€ ์กฐํšŒ๋œ nCube-Aqua ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ๋ฆฌ์†Œ์Šค ๊ตฌ์กฐ์ด๋‹ค.


Container(cnt)์— nCube-Aqua๊ฐ€ ์–ดํ•ญ์˜ ์„ผ์„œ๋ฅผ ํ†ตํ•ด ์ธก์ •ํ•œ ๊ฐ’์ด ์—…๋กœ๋“œ๋œ๋‹ค.

nCube-Aqua Feeder & LED Control

Feeder์™€ LED๋ฅผ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ๊ฐ feeder, led cnt์— Content-Instance(cin)์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.


๋จผ์ € feeder cnt ์œ„์— ๋งˆ์šฐ์Šค๋ฅผ ์˜ฌ๋ ค๋‘๊ณ  ์˜ค๋ฅธ์ชฝ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์—ฌ Create๋ฅผ ํด๋ฆญํ•œ๋‹ค.


Content(con)์— ์ˆซ์ž 1์„ ์ž…๋ ฅํ•˜๊ณ  Create ๋ฒ„ํŠผ์„ ํด๋ฆญํ•œ๋‹ค.


์–ดํ•ญ์— ์žฅ์ฐฉ๋œ Feeder์˜ ๋จน์ดํ†ต์ด 1ํšŒ ํšŒ์ „ํ•˜๋ฉฐ ๋จน์ด๋ฅผ ๋ฐฐ์ถœํ•œ๋‹ค.


LED๋ฅผ ์ผœ๊ธฐ ์œ„ํ•ด led cnt ์œ„์— ๋งˆ์šฐ์Šค๋ฅผ ์˜ฌ๋ ค๋‘๊ณ  ์˜ค๋ฅธ์ชฝ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์—ฌ Create๋ฅผ ํด๋ฆญํ•œ๋‹ค.


Content(con)์— ์ˆซ์ž 1์„ ์ž…๋ ฅํ•˜๊ณ  Create ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด LED๊ฐ€ ์ผœ์ง€๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

โš ๏ธ **GitHub.com Fallback** โš ๏ธ