Костыль для мозга

В одной книге мигранты из других миров не признавались за самостоятельную личность. Им назначался опекун, который был обязан заботиться о таком вот «ребёнке». На работу мигрантов брали, но делали это забавным способом. Вначале смены такой работник надевал что-то вроде шлема, который отключал сознание, а телом начинал управлять искусственный интеллект. Приходишь на работу, и по сути спишь. Мозг отдыхает, тело напрягается.

Думаю, если устроить опрос и выставить такой гаджет, скажем, за 50 килорублей, то его попросту сметут с полок. Не сами люди, так их работодатели. А уж среди призывников, так вообще отбою бы не было. Надел в начале службы и проснулся уже отслужившим, с развитой мускулатурой и дыхалкой.

Сейчас такой шляпы в продаже нет. Лично мне она без особой надобности, ведь я работаю мозгами, но кто сказал что так будет всегда? Верно?

А есть-ли у фантастов что-нибудь для мозга? Оказывается да. В серии по мирам EVA описана такая штука, как заливка «баз данных» в мозг. Нужна она (вот так сюрприз) для получения профессиональных навыков в какой-либо сфере деятельности. Вместо ВУЗов и прочих школ. Берёшь кредит, оплачиваешь такую закачку какой-нибудь свежей базы, и идёшь устраиваться на работу.

Ну… в подобном деле есть жирный-такой минус. Представь, сколько преподавателей окажутся… не нужны? Кто их будет кормить? Куда их девать? С другой стороны, закачают какую-нибудь полезную базу и займутся чем-нибудь нужным.

Но есть одно «но»: подобных услуг тоже никто не оказывает. Хочешь учиться — трать время, напрягай мозг.

Вот так. Как говорил один сержант: Чтоб жизнь мёдом не казалась.

Хорошо… Т.е. не особо, но допустим. А если-ли что-нибудь менее совершенное, но помогающее проапгрейдить мозг?

Оказывается есть, и называется оно п-здюли будильник. Мозгу не прикажешь проснуться в точно заданное время. Хотя, у Штирлица вроде-бы получалось. И вот тут помогает техническое устройство, которое воздействует на орган слуха, который, в свою очередь, в норме никогда не выключается. Для тех, у кого с восприятием звука проблемы, есть световые будильники, которые фигачат пульсирующим ярким светом, заметным даже сквозь веки.

Да, это «костыль». Костыль для мозга. Он не добавляет знаний или способностей, но с задачей испортить тебе утро, справляется.

Мне сейчас будильник без особой надобности. К началу рабочего дня я по-любому проснусь. Либо Л. разбудит, либо голуби орущие на крыше (да, эти твари умеют издавать громкие, монотонные и противные звуки), или соседи. Будильник нужен только когда нужно проснуться рано.

А вот что мне нужно, так это «костыль», который будет концентрировать внимание на одной выполняемой задаче и не давать отвлекаться на другие. В этом плане эффективным оказался таймер в телефоне. Но у него есть минусы:

  1. Он сажает аккумулятор, поскольку приходится держать экран включенным.
  2. Он не позволяет прерваться и замерить время перерыва.
  3. Он не напоминает о своём существовании, пока я сам о нём не вспомню.

Таймер для работы, близкий к идеальному, показан в данном видео.

Но и тут есть минусы.

  1. Дисплей. Он показывает только одну временную шкалу. Мне же желательно две: обратный отсчёт и таймер перерыва.
  2. Кнопки. Я бы хотел иметь три: 15 минут, 30 минут, 60 минут. Ну или задавать интервал энкодером.

Работать это дело должно так.

При включении я вижу стартовое значение таймера работы, которое могу изменить.

Наверное лучше использовать потенциометр. Так значение будет «запоминаться» до следующего включения прибора.

При этом, шкала таймера простоя показывает ноль.

Далее, я нажимаю кнопку, и начинается обратный отсчёт таймера работы. Когда отсчёт заканчивается, звучит некий звуковой сигнал.

Если мне нужно прерваться, я жму кнопку, таймер работы останавливается и начинает увеличиваться значение таймера простоя. Каждые 5 минут активированный таймер простоя будет подавать звуковой сигнал. При нажатии кнопки, таймер простоя останавливается, и активируется таймер работы.

Длительное нажатие на кнопку останавливает все таймеры и сбрасывает их значения на стартовые.

Вот такое простое устройство мне нужно.

Что потребуется?

Давай смотреть из имеющегося среди хлама.

  1. Arduino UNO — есть.
  2. LCD дисплей для Nokia 5110, приспособленный для подключения к Arduino — есть.
  3. Кнопка — есть.
  4. Потенциометр — есть.
  5. Какой-нибудь динамик — подберу.
  6. Корпус… А вот тут ничего идеального. Значит, придётся изъёживаться.

Спалил два светодиода и один звучёк, угрохал несколько часов. И знаете что? Получилось! И скетч написался, и детали нашлись, и даже корпус почти подошёл.

Пины:

  • D2, D3, D4, D6, D5 — дисплей
  • D9 — подсветка дисплея
  • D10 — кнопка
  • D13 — спикер

Библиотеки:

Скетч:

#include <LCD5110_Basic.h>
#include "GyverButton.h"

#define BUTTON_PIN 10   // кнопка подключена сюда (BTN_PIN --- КНОПКА --- GND)
#define MELODY_PIN 13

long jTimer = 0;
long wTimer = 0;
int jTimerMinPrint = 0;
int jTimerSecPrint = 0;
int wTimerHPrint = 0;
int wTimerMinPrint = 0;
int wTimerSecPrint = 0;
long wTimerAlert = 0;
long wTimerMaxAlert = 300000;
int maxDelayTimer = 1000;
int nowDelayTimer = 0;
bool jTimerStarted = false;
bool wTimerStarted = false;

GButton butt1(BUTTON_PIN);
LCD5110 myGLCD(2,3,4,6,5);
extern uint8_t SmallFont[];
extern uint8_t MediumNumbers[];
extern uint8_t BigNumbers[];

void setup() {
  pinMode(MELODY_PIN, OUTPUT);
  myGLCD.InitLCD();
  Serial.begin(9600);
  tone(MELODY_PIN, 1000, 300);
}

void button_presser() {
    butt1.tick();
    
    if (butt1.isSingle()) {
      if (jTimerStarted == false && wTimerStarted == false) {
        jTimer = 3600000;
        jTimerStarted = true;
        tone(MELODY_PIN, 3000, 50);
      }else{
        if (jTimerStarted == true) {
          jTimerStarted = false;
          wTimerStarted = true;
          tone(MELODY_PIN, 700, 100);
        }else{
          if (wTimerStarted == true) {
            jTimerStarted = true;
            wTimerStarted = false;
            tone(MELODY_PIN, 3000, 50);
          }
        }
      }
      
      Serial.println("Single");
    }
    if (butt1.isDouble()) {
      if (!jTimerStarted && !wTimerStarted) {
        jTimer = 1800000;
        jTimerStarted = true;
        tone(MELODY_PIN, 3500, 50);
      }
      Serial.println("Double");
    }
    if (butt1.isTriple()) {
      if (!jTimerStarted && !wTimerStarted) {
        jTimer = 900000;
        jTimerStarted = true;
        tone(MELODY_PIN, 4000, 50);
      }
      Serial.println("Triple");
    }
    if (butt1.isHold()) {
        jTimerStarted = false;
        wTimerStarted = false;
        jTimer = 0;
        wTimer = 0;
        tone(MELODY_PIN, 5000, 200);
        Serial.println("Hold");
    }
}

void loop() {
  button_presser();
  
   if (jTimerStarted == true) {
     jTimer--;
   }
   if (wTimerStarted == true) {
     wTimer++;
     wTimerAlert++;
     if (wTimerAlert >= wTimerMaxAlert) {
        wTimerAlert = 0;
        tone(MELODY_PIN, 700, 200);
     }
   }

  if (jTimer < 0)  {
    jTimer = 0;
    jTimerStarted = false;
    wTimerStarted = false;
    tone(MELODY_PIN, 2000, 1000);
  }

  if (nowDelayTimer >= maxDelayTimer) {

    myGLCD.clrScr();
    nowDelayTimer = 0;
    myGLCD.setFont(BigNumbers);
    jTimerMinPrint = ceil(jTimer/60000);
    jTimerSecPrint = ceil((jTimer - (jTimerMinPrint*60000))/1000);
    if (jTimerMinPrint < 10) {
      myGLCD.printNumI(0, 20, 0);
      myGLCD.printNumI(jTimerMinPrint, 35, 0);
    }else{
      myGLCD.printNumI(jTimerMinPrint, 20, 0);
    }
    myGLCD.setFont(BigNumbers);
    if (jTimerSecPrint < 10) {
      myGLCD.printNumI(0, 55, 0);
      myGLCD.printNumI(jTimerSecPrint, 70, 0);
    }else{
      myGLCD.printNumI(jTimerSecPrint, 55, 0);  
    }
    
    myGLCD.setFont(MediumNumbers);
    wTimerHPrint = ceil(wTimer/3600000);
    wTimerMinPrint = ceil((wTimer - (wTimerHPrint*3600000))/60000);
    wTimerSecPrint = ceil((wTimer - (wTimerMinPrint*60000))/1000);

    if (wTimerHPrint >= 3) {
        jTimer = 0;
        wTimer = 0;
        jTimerStarted = false;
        wTimerStarted = false;
        tone(MELODY_PIN, 500, 5000);
    }
    
    if (wTimerHPrint < 10) {
      myGLCD.printNumI(0, 4, 24);
      myGLCD.printNumI(wTimerHPrint, 16, 24);
    }else{
      myGLCD.printNumI(wTimerHPrint, 4, 24);
    }
    if (wTimerMinPrint < 10) {
      myGLCD.printNumI(0, 32, 24);
      myGLCD.printNumI(wTimerMinPrint, 44, 24);
    }else{
      myGLCD.printNumI(wTimerMinPrint, 32, 24);
    }
    if (wTimerSecPrint < 10) {
       myGLCD.printNumI(0, 60, 24);
       myGLCD.printNumI(wTimerSecPrint, 72, 24);
    }else{
       myGLCD.printNumI(wTimerSecPrint, 60, 24);
    }
  }
  
  nowDelayTimer++;
  delay(1);
}

 

Вместо Arduino UNO взял Arduino Nano. У дисплея не работает подсветка. Похоже спалил когда-то давно.

Потенциометр не понадобился:

  • одиночный клик устанавливает таймер на 60 минут,
  • двойной клик — 30 минут,
  • тройной клик — 15 минут,
  • долгое нажатие — сброс всех таймеров.

Устройство запитал от USB-порта. Задняя стенка корпуса отваливается, но работе это не мешает.

В общем, есть что дорабатывать, да и протестировать тоже нужно. Но главное, я сделал этот «костыль» сегодня. Им уже можно пользоваться.

А теперь, спать! Я офф, друзья.

Напишите комментарий