{"id":893,"date":"2022-06-15T20:21:17","date_gmt":"2022-06-15T20:21:17","guid":{"rendered":"https:\/\/sznetwork.systems\/?page_id=893"},"modified":"2022-06-22T19:46:54","modified_gmt":"2022-06-22T19:46:54","slug":"diy-baby-night-light","status":"publish","type":"page","link":"https:\/\/sznetwork.systems\/?page_id=893","title":{"rendered":"DIY Baby Night Light"},"content":{"rendered":"\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"Making night light on Arduino nano with motion sensor, watchdog and dimming function\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube.com\/embed\/KEw6q25_eQ0?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<pre class=\"wp-block-preformatted has-black-color has-cyan-bluish-gray-background-color has-text-color has-background\">Some time ago born my baby boy. And when he sleep, sometimes needed to go to room in night time. Switch light I don't want, and I bought cheap lamp on batteries. But it was not comfortable, every time needed to search switch, and it was so bright. I decided to remake it .\nMain requirements i needed. \n- rechargeable batteries\n- motion sensor\n- light bright control\n- motion activation time control\n\nAfter small research of my shelf with electronic parts i found Arduino pro mini, sensor button, and PIR sensor.\n\nI started remake project.\n\nFirst I decided what main features I need to realize in controller code. They are:\n- Working from batteries or power supply - that means I need to use deep sleep on controller, and use PIR sensor to interrupt sleep and wake up controller.\n- Sensor button to configure brightness and time - why sensor button, I don't want to make additional hole in lamp enclosure.\n- Sensor button power need to be activated only when controller waked up.\n- PIR to waking up controller\n- Saving time and brightness to EEPROM\n- Simple menu on one button to configure time and brightness. - I think it will be done with leds on lamp. First led \"dimming menu\" , second third and fourth brightness value. Last led \"timing menu\", first second and third time interval value.\n\nIn bottom you can find project code, and on top of the page is video of making this light.<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Code<\/h2>\n\n\n\n<pre class=\"wp-block-preformatted has-black-color has-text-color has-background\" style=\"background-color:#9ba1a5\"><strong>SZ_BNightLight.ino<\/strong><\/pre>\n\n\n\n<pre class=\"wp-block-preformatted has-black-color has-cyan-bluish-gray-background-color has-text-color has-background\">#include \"GyverTimer.h\"\n#include &lt;GyverPower.h&gt;\n#include \"GyverButton.h\"\n#include &lt;EEPROM.h&gt;\n\/\/LEDS 4x2\n#define led1 5\n#define led2 6\n#define led3 9\n#define led4 10\n\/\/Inputs\n#define pir 3\n#define sens 8\n#define sens_pwr 12\nGButton sensor(sens);\n\nint menu = 0;\nint isAwake = 0;\nint dimming;\nString dimming_s;\nString timing;\nbool menu_true = true;\nGTimer LedTime(MS);\n\nvoid(* resetFunc) (void) = 0;                       \/\/Reset function\n\nvoid setup() {\n  pinMode(led1, OUTPUT);\n  pinMode(led2, OUTPUT);\n  pinMode(led3, OUTPUT);\n  pinMode(led4, OUTPUT);\n   pinMode(13, OUTPUT);\n   digitalWrite(13, LOW);\n  pinMode(sens_pwr, OUTPUT);\n  pinMode(pir, INPUT_PULLUP);\n  pinMode(sens, INPUT_PULLUP);\n  attachInterrupt(1, isr, FALLING);\n  power.setSleepMode(POWERDOWN_SLEEP);\n\n  \/\/Sensor button settings\n  sensor.setDebounce(100);\n  sensor.setTimeout(500);\n  sensor.setClickTimeout(501);\n  sensor.setType(LOW_PULL);\n  defaultEEPROM();\n  dimming = read_string(3, 1).toInt();\n  timing = read_string(3, 5);\n  \/\/Led lightening interval\n  LedTime.setInterval(timing.toInt() * 1000);\n}\n\nvoid isr() {\n  power.wakeUp();\n}\n\nvoid loop() {\n  digitalWrite(sens_pwr, LOW);\n  power.sleep(SLEEP_FOREVER);\n  digitalWrite(sens_pwr, HIGH);\n  isAwake = 1;\n  LedTime.start();\n  while (true) {\n    switch (isAwake) {\n      case 1: \/\/ Default Function\n        default_f();\n        break;\n      case 2: \/\/Menu\n        menu_f();\n        break;\n      case 3:\/\/Dimming setting\n        dimming_f();\n        break;\n      case 4: \/\/Timing Function\n        timing_f();\n        break;\n    }\n  }\n}\n<\/pre>\n\n\n\n<pre class=\"wp-block-preformatted has-black-color has-text-color has-background\" style=\"background-color:#9ba1a5\"><strong>default_f.ino<\/strong><\/pre>\n\n\n\n<pre class=\"wp-block-preformatted has-black-color has-cyan-bluish-gray-background-color has-text-color has-background\">void default_f() {\n  while (true) {\n    sensor.tick();\n    digitalWrite(sens_pwr, HIGH);\n    analogWrite(led1, dimming);\n    analogWrite(led2, dimming);\n    analogWrite(led3, dimming);\n    analogWrite(led4, dimming);\n    if (sensor.isHolded()) {\n      isAwake = 2;\n      digitalWrite(led1, LOW);\n      digitalWrite(led2, LOW);\n      digitalWrite(led3, LOW);\n      digitalWrite(led4, LOW);\n      break;\n    }\n    if (LedTime.isReady()) {\n      digitalWrite(led1, LOW);\n      digitalWrite(led2, LOW);\n      digitalWrite(led3, LOW);\n      digitalWrite(led4, LOW);\n      digitalWrite(sens_pwr, LOW);\n      power.sleep(SLEEP_FOREVER);\n    }\n  }\n}\n<\/pre>\n\n\n\n<pre class=\"wp-block-preformatted has-black-color has-text-color has-background\" style=\"background-color:#9ba1a5\"><strong>dimming_f.ino<\/strong><\/pre>\n\n\n\n<pre class=\"wp-block-preformatted has-black-color has-cyan-bluish-gray-background-color has-text-color has-background\">void dimming_f() {\n  while (true) {\n    sensor.tick();\n    analogWrite(led1, dimming);\n    if (dimming == 36) {\n      digitalWrite(led2, LOW);\n      digitalWrite(led3, LOW);\n      analogWrite(led4, dimming);\n      dimming_s = \"036\";\n    }\n    if (dimming == 72) {\n      digitalWrite(led2, LOW);\n      analogWrite(led3, dimming);\n      digitalWrite(led4, LOW);\n      dimming_s = \"072\";\n    }\n    if (dimming == 108) {\n      digitalWrite(led2, LOW);\n      analogWrite(led3, dimming);\n      analogWrite(led4, dimming);\n      dimming_s = \"108\";\n    }\n    if (dimming == 144) {\n      analogWrite(led2, dimming);\n      digitalWrite(led3, LOW);\n      digitalWrite(led4, LOW);\n      dimming_s = \"144\";\n    }\n    if (dimming == 180) {\n      analogWrite(led2, dimming);\n      digitalWrite(led3, LOW);\n      analogWrite(led4, dimming);\n      dimming_s = \"180\";\n    }\n    if (dimming == 216) {\n      analogWrite(led2, dimming);\n      analogWrite(led3, dimming);\n      digitalWrite(led4, LOW);\n      dimming_s = \"216\";\n    }\n    if (dimming == 252) {\n      analogWrite(led2, dimming);\n      analogWrite(led3, dimming);\n      analogWrite(led4, dimming);\n      dimming_s = \"252\";\n    }\n    if (sensor.isClick()) {\n      if (dimming &lt;= 252) {\n        dimming = dimming + 36;\n      }\n      if (dimming &gt; 253) {\n        dimming = 36;\n      }\n    }\n    if (sensor.isHolded()) {  \/\/\/\/\/\/\/\/need function\n      write_EEPROM(dimming_s, 1);\n      analogWrite(led1, dimming);\n      analogWrite(led2, dimming);\n      analogWrite(led3, dimming);\n      analogWrite(led4, dimming);\n      delay(500);\n      digitalWrite(led1, LOW);\n      digitalWrite(led2, LOW);\n      digitalWrite(led3, LOW);\n      digitalWrite(led4, LOW);\n      resetFunc();\n    }\n\n    break;\n  }\n}\n<\/pre>\n\n\n\n<pre class=\"wp-block-preformatted has-black-color has-text-color has-background\" style=\"background-color:#9ba1a5\"><strong>eeprom_f.ino<\/strong><\/pre>\n\n\n\n<pre class=\"wp-block-preformatted has-black-color has-cyan-bluish-gray-background-color has-text-color has-background\">\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/Read String EEPROM\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\nString read_string(int l, int p) {\n  String temp;\n  for (int n = p; n &lt; l + p; ++n)\n  {\n    if (char(EEPROM.read(n)) != ';') {\n      if (isWhitespace(char(EEPROM.read(n)))) {\n        \/\/do nothing\n      } else temp += String(char(EEPROM.read(n)));\n\n    } else n = l + p;\n\n  }\n  return temp;\n}\n\nvoid write_EEPROM(String x, int pos) {\n  for (int n = pos; n &lt; x.length() + pos; n++) {\n    EEPROM.write(n, x[n - pos]);\n  }\n}\n\nvoid defaultEEPROM() {       \/\/ Check for default donfig\n  if (read_string(1, 0) != \"0\") {\n    write_EEPROM(\"0\", 0); \/\/Save default config on first start\n    write_EEPROM(\"252\", 1); \/\/Dimming\n    write_EEPROM(\"005\", 5);  \/\/Timing\n    delay(1000);\n    resetFunc();\n  }\n}\n<\/pre>\n\n\n\n<pre class=\"wp-block-preformatted has-black-color has-text-color has-background\" style=\"background-color:#9ba1a5\"><strong>menu_f.ino<\/strong><\/pre>\n\n\n\n<pre class=\"wp-block-preformatted has-black-color has-cyan-bluish-gray-background-color has-text-color has-background\">void menu_f() {\n  while (true) {\n    sensor.tick();\n    if (menu == 0) {\n      analogWrite(led1, dimming);\n      digitalWrite(led4, LOW);\n    }\n    if (menu == 1) {\n      analogWrite(led4, dimming);\n      digitalWrite(led1, LOW);\n    }\n    if (sensor.isClick()) {\n      menu = !menu;\n    }\n    if (sensor.isHolded()) {\n      if (menu == 0) {\n        isAwake = 3;\n        break;\n      }\n      if (menu == 1) {\n        isAwake = 4;\n        break;\n      }\n    }\n  }\n}\n<\/pre>\n\n\n\n<pre class=\"wp-block-preformatted has-black-color has-text-color has-background\" style=\"background-color:#9ba1a5\"><strong>timing_f.ino<\/strong><\/pre>\n\n\n\n<pre class=\"wp-block-preformatted has-black-color has-cyan-bluish-gray-background-color has-text-color has-background\">void timing_f() {\n  while (true) {\n    sensor.tick();\n    analogWrite(led4, dimming);\n    if (timing == \"005\") {\n      digitalWrite(led1, LOW);\n      digitalWrite(led2, LOW);\n      analogWrite(led3, dimming);\n    }\n    if (timing == \"010\") {\n      digitalWrite(led1, LOW);\n      analogWrite(led2, dimming);\n      digitalWrite(led3, LOW);\n    }\n    if (timing == \"015\") {\n      digitalWrite(led1, LOW);\n      analogWrite(led2, dimming);\n      analogWrite(led3, dimming);\n    }\n    if (timing == \"030\") {\n      analogWrite(led1, dimming);\n      digitalWrite(led2, LOW);\n      digitalWrite(led3, LOW);\n    }\n    if (timing == \"060\") {\n      analogWrite(led1, dimming);\n      digitalWrite(led2, LOW);\n      analogWrite(led3, dimming);\n    }\n    if (timing == \"300\") {\n      analogWrite(led1, dimming);\n      analogWrite(led2, dimming);\n      digitalWrite(led3, LOW);\n    }\n    if (timing == \"600\") {\n      analogWrite(led1, dimming);\n      analogWrite(led2, dimming);\n      analogWrite(led3, dimming);\n    }\n    if (sensor.isClick()) {\n      if (timing == \"005\") {\n        timing = \"010\";\n      }\n      else if (timing == \"010\") {\n        timing = \"015\";\n      }\n      else if (timing == \"015\") {\n        timing = \"030\";\n      }\n      else if (timing == \"030\") {\n        timing = \"060\";\n      }\n      else if (timing == \"060\") {\n        timing = \"300\";\n      }\n      else if (timing == \"300\") {\n        timing = \"600\";\n      }\n      else if (timing == \"600\") {\n        timing = \"005\";\n      }\n    }\n    if (sensor.isHolded()) {  \/\/\/\/\/\/\/\/need function\n\n      write_EEPROM(timing, 5);\n      analogWrite(led1, dimming);\n      analogWrite(led2, dimming);\n      analogWrite(led3, dimming);\n      analogWrite(led4, dimming);\n      delay(500);\n      digitalWrite(led1, LOW);\n      digitalWrite(led2, LOW);\n      digitalWrite(led3, LOW);\n      digitalWrite(led4, LOW);\n      resetFunc();\n    }\n  }\n}\n<\/pre>\n\n\n\n<h2 class=\"has-black-color has-cyan-bluish-gray-background-color has-text-color has-background wp-block-heading\"><a href=\"https:\/\/sznetwork.systems\/wp-content\/uploads\/2022\/06\/SZ_BNightLight.zip\">Code download link<\/a><\/h2>\n\n\n\n<h2 class=\"has-black-color has-cyan-bluish-gray-background-color has-text-color has-background wp-block-heading\">Libraries used in project <a href=\"https:\/\/github.com\/AlexGyver\/GyverLibs\">https:\/\/github.com\/AlexGyver\/GyverLibs<\/a><\/h2>\n","protected":false},"excerpt":{"rendered":"<p>Some time ago born my baby boy. And when he sleep, sometimes needed to go to room in night time. Switch light I don&#8217;t want, and I bought cheap lamp. <a class=\"read-more-link\" href=\"https:\/\/sznetwork.systems\/?page_id=893\">read more&#8230;<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"parent":97,"menu_order":0,"comment_status":"open","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-893","page","type-page","status-publish","hentry"],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/sznetwork.systems\/index.php?rest_route=\/wp\/v2\/pages\/893","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sznetwork.systems\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/sznetwork.systems\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/sznetwork.systems\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/sznetwork.systems\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=893"}],"version-history":[{"count":5,"href":"https:\/\/sznetwork.systems\/index.php?rest_route=\/wp\/v2\/pages\/893\/revisions"}],"predecessor-version":[{"id":909,"href":"https:\/\/sznetwork.systems\/index.php?rest_route=\/wp\/v2\/pages\/893\/revisions\/909"}],"up":[{"embeddable":true,"href":"https:\/\/sznetwork.systems\/index.php?rest_route=\/wp\/v2\/pages\/97"}],"wp:attachment":[{"href":"https:\/\/sznetwork.systems\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=893"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}