Диабет и arduino

k_vit
Offline
Зарегистрирован: 11.09.2016

Диабет и arduino

Всем привет.

Этим летом моему сыну поставили диагноз – диабет. В помощь отслеживания времени было решено сделать часы.  Основные функции: Напоминание о предстоящем уколе и фиксация показаний.

 

Железо:

TF Card Reader Memory Shield Module SPI

Clock Module DS3231SN

IR Module с пультом

LCD1602+I2C LCD 1602 module (16х2)

arduino nano

Зуммер (только я его забыл купить)

В итоге получились часы с функциями:

Запись уровня глюкозы

Запись ХЕ

Запись порции инсулина (по 2-м препаратам отдельно)

7 будильников (можно хоть сколько)

Напоминание о смене иглы  (по 2-м препаратам отдельно)

 

Теперь о моей проблеме. Sketch оказался сильно большой, и уже нет места для  развития программы. Кто-нибудь подскажите, как уменьшить мою программу?

И кто-нибудь знает как на таком дисплее (LCD1602+I2C LCD 1602 module Blue screen IIC/I2C for arduino LCD1602 Adapter plate) получить русский язык?

  

За ранее очень благодарен!

 

//#include <Wire.h>
//#include <TimeLib.h>
#include <DS1307RTC.h>
#include <IRremote.h>
#include <SPI.h>
#include <SD.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
int RECV_PIN = 8;
IRrecv irrecv(RECV_PIN);
decode_results results;

int kod = 0;
int menu = 0;
float  cheslo = 0;
int ka = 0;
int ks = 0;
int il = 0;
int ih = 0;
int tz = 0;

int bh[7] = {6, 6, 7, 12, 18, 19, 21};  // Будильник
int bm[7] = {00, 30, 0, 20, 10, 0, 00};
int bmes[7] = {3, 4, 5, 2, 3, 4, 6};


void setup() {
  // Serial.begin(9600);
  // while (!Serial);
  irrecv.enableIRIn();
  lcd.init();
  if (!SD.begin(10)) {
    ks = 1;
    return;
  }
  pinMode(3, OUTPUT);
}

void loop() {
  lcd.backlight();
  tmElements_t tm;
  if (ks == 1) {                                             //  ERROR: SD
    lcd.setCursor(0, 0);
    lcd.print("     ERROR:     ");
    lcd.setCursor(0, 1);
    lcd.print("   No sd card   ");
    digitalWrite(3, HIGH);
    delay(1000);
  }
  if (irrecv.decode(&results)) {                            //  Код пульта
    if (ks == 1)goto metkachas;
    if (results.value == 0xFF22DD) kod = 16;
    if (results.value == 0xFFC23D) kod = 15;
    if (results.value == 0xFF629D) kod = 14;
    if (results.value == 0xFFA857) kod = 13;
    if (results.value == 0xFF02FD) kod = 12;
    if (results.value == 0xFF6897) kod = 1;
    if (results.value == 0xFF9867) kod = 2;
    if (results.value == 0xFFB04F) kod = 3;
    if (results.value == 0xFF30CF) kod = 4;
    if (results.value == 0xFF18E7) kod = 5;
    if (results.value == 0xFF7A85) kod = 6;
    if (results.value == 0xFF10EF) kod = 7;
    if (results.value == 0xFF38C7) kod = 8;
    if (results.value == 0xFF5AA5) kod = 9;
    if (results.value == 0xFF4AB5) kod = 0;
    if (results.value == 0xFF42BD) kod = 10;
    if (results.value == 0xFF52AD) kod = 11;
    irrecv.resume(); 
  }
  else {
    kod = 99;
  }
  if ( kod == 14) {                               // menu >
    menu = menu + 1;
    if ( menu == 5) menu = 0;
    cheslo = 0;
    ka = 0;
    lcd.setCursor(0, 0);
    lcd.print("                ");
    lcd.setCursor(0, 1);
    lcd.print("                ");

  }
  if (kod == 13) {{                               // menu <
    menu = menu - 1;
    if ( menu == -1) menu = 4;
    cheslo = 0;
    ka = 0;
    lcd.setCursor(0, 0);
    lcd.print("                ");
    lcd.setCursor(0, 1);
    lcd.print("                ");

  }

  if (kod == 16 && menu > 0) {                                       //стереть показания
    cheslo = 0;
    ka = 0;
    lcd.setCursor(0, 1);
    lcd.print("                ");
  }

  if (kod == 10 && menu > 0) {                                      //перейти на десятые
    ka = 1;
    lcd.setCursor(0, 1);
    lcd.print("*");
  }
  if (kod == 15 && menu > 2) {                                      //Замена иглы

    if (menu == 4) il = 0;
    if (menu == 3) ih = 0;
    lcd.setCursor(0, 0);
    lcd.print("   Zamena igl   ");
    lcd.setCursor(1, 1);
    lcd.print("               ");
    delay(1000);
  }
  if (menu == 1) {                                                                     //Глюкоза
    lcd.setCursor(0, 0);
    lcd.print("    Glukoza     ");
   if (kod < 10 && ka == 1) {
      cheslo = (float)kod / 10 + cheslo;
      ka = 2;
    }
    if (kod < 10 && ka == 0) {
      if ( cheslo == 0) {
        cheslo = kod;
      }
      else
      {
        cheslo = cheslo * 10;
        cheslo = cheslo + kod;
        ka = 1;
        lcd.setCursor(0, 1);
        lcd.print("*");
             }
    }
  }


  if (menu == 2) {                                                                     // XE
    lcd.setCursor(0, 0);
    lcd.print("       XE       ");
    if (kod < 10 && ka == 1) {
      cheslo = (float)kod / 10 + cheslo;
      ka = 2;
    }
    if (kod < 10 && ka == 0) {
      cheslo = kod;
      ka = 1;
      lcd.setCursor(0, 1);
      lcd.print("*");
    }
  }


  if (menu == 3) {                                                                 // Хумалог
    lcd.setCursor(0, 0);
    lcd.print("    Humalog     ");
    lcd.setCursor(14, 1);
    lcd.print("i");
    lcd.setCursor(15, 1);
    lcd.print(ih);
    if (kod < 10 && ka == 1) {
      cheslo = (float)kod / 10 + cheslo;
      ka = 2;
    }
    if (kod < 10 && ka == 0) {
      cheslo = kod;
      ka = 1;
      lcd.setCursor(0, 1);
      lcd.print("*");
    }
  }


  if (menu == 4) {                                                                // Левемир
    lcd.setCursor(0, 0);
    lcd.print("    Levemir     ");
    lcd.setCursor(14, 1);
    lcd.print("i");
    lcd.setCursor(15, 1);
    lcd.print(il);
    if (kod < 10 && ka == 1) {
      cheslo = (float)kod / 10 + cheslo;
      ka = 2;
    }
    if (kod < 10 && ka == 0) {
      cheslo = kod;
      ka = 1;
      lcd.setCursor(0, 1);
      lcd.print("*");
    }
  }

  
if (menu > 0) {
     lcd.setCursor(5, 1);
    lcd.print(cheslo);
}


  if (kod == 12) {                                                                 //  save
    if (menu < 1) goto metkachas;
    lcd.setCursor(0, 1);
    lcd.print("                ");
    File myFile = SD.open("glukoza.txt", FILE_WRITE);
    if (myFile) {
      myFile.print (tm.Day);
      myFile.print ("/");
      myFile.print (tm.Month);
      myFile.print ("/");
      myFile.print (tmYearToCalendar(tm.Year));
      myFile.print ("  ");
      myFile.print (tm.Hour);
      myFile.print (".");
      myFile.print (tm.Minute);
      myFile.print (".");
      myFile.print (tm.Second);
      if (menu == 1) myFile.print (" Glukoza - ");
      if (menu == 2) myFile.print (" XE - ");
      if (menu == 3) myFile.print (" Humalog - ");
      if (menu == 4) myFile.print (" Levemir - ");
      myFile.print(cheslo);
      if (il == 0  && menu == 4) myFile.print (" *");
      if (ih == 0  && menu == 3) myFile.print (" *");
      myFile.println();
      myFile.close();
      lcd.setCursor(0, 0);
      lcd.print("     Save       ");
      delay(1000);
      if (menu == 4) il = il + 1;
      if (menu == 3) ih = ih + 1;
    } else {
      lcd.setCursor(0, 0);
      lcd.print("     ERROR:     ");
      lcd.setCursor(0, 1);
      lcd.print("    not File    ");
      delay(5000);
    }
    menu = 0;
  }


  for (int i = 0; i <= 6; i++) {
    if ( bh[i] == tm.Hour && bm[i] == tm.Minute) {
      lcd.setCursor(0, 0);
      lcd.print("     TIME      ");
      lcd.setCursor(0, 1);
//      if (bmes[i] == 1) lcd.print("Dostan` Levemir ");  // Не вошло на arduino
//      if (bmes[i] == 2) lcd.print("Dostan` Humalog ");
//      if (bmes[i] == 3) lcd.print("Dostan` Lev&Hum ");
//      if (bmes[i] == 4) lcd.print("POSTAV` Levemir ");
//      if (bmes[i] == 5) lcd.print("POSTAV` Humalog ");
      if (bmes[i] == 6) lcd.print("Zamer` glukozu  ");
      digitalWrite(3, HIGH);
      delay(10000);
      lcd.setCursor(0, 1);
      lcd.print("                ");
    }
  }


metkachas:
  if (menu == 0) {                                                             //    Часы
    tz = tz + 1;
    if (tz > 8)  tz = 1;
    if (il < 5 && ih < 5)  tz = 1;

      if (tz > 4 && tz < 9 ) {
        lcd.setCursor(0, 1);
        if (il > 4)  lcd.print("Zameni iglu Lev.");
        if (ih > 4)  lcd.print("Zameni iglu Hum.");
        digitalWrite(3, HIGH);
      }
 
    if (RTC.read(tm)) {
      lcd.setCursor(4, 0);
      if (tm.Hour < 10)
      {
        lcd.setCursor(4, 0);
        lcd.print("0");
        lcd.setCursor(5, 0);
        lcd.print(tm.Hour );
      }
      else {
        lcd.setCursor(4, 0);
        lcd.print(tm.Hour );
      }
      lcd.setCursor(6, 0);
      lcd.print(".");
      if (tm.Minute < 10)
      {
        lcd.setCursor(7, 0);
        lcd.print("0");
        lcd.setCursor(8, 0);
        lcd.print(tm.Minute);
      }
      else {
        lcd.setCursor(7, 0);
        lcd.print(tm.Minute);
      }
      lcd.setCursor(9, 0);
      lcd.print(".");
      if (tm.Second < 10)
      {
        lcd.setCursor(10, 0);
        lcd.print("0");
        lcd.setCursor(11, 0);
        lcd.print(tm.Second);
      }
      else {
        lcd.setCursor(10, 0);
        lcd.print(tm.Second);
      }
      if (tz < 5) {
        lcd.setCursor(0, 1);
      lcd.print("   ");
              lcd.setCursor(13, 1);
      lcd.print("   ");
        if (tm.Day < 10) //                            data
        {
          lcd.setCursor(3, 1);
          lcd.print("0");
          lcd.setCursor(4, 1);
          lcd.print(tm.Day );
        }
        else {
          lcd.setCursor(3, 1);
          lcd.print(tm.Day );
        }
        lcd.setCursor(5, 1);
        lcd.print("/");
        if (tm.Month < 10)
        {
          lcd.setCursor(6, 1);
          lcd.print("0");
          lcd.setCursor(7, 1);
          lcd.print(tm.Month);
        }
        else {
          lcd.setCursor(6, 1);
          lcd.print(tm.Month);
        }
        lcd.setCursor(8, 1);
        lcd.print("/");
        lcd.setCursor(9, 1);
        lcd.print(tmYearToCalendar(tm.Year));
      }
    } else {
      if (RTC.chipPresent()) {
        lcd.setCursor(0, 0);
        lcd.print("     ERROR:     ");
        lcd.setCursor(0, 0);
        lcd.print("Clock - stopped ");
      }
      delay(9000);
    }
  }
metkaend:
  digitalWrite(3, LOW);
  delay(1000);
}

 

 

 

 

 

 

 

 

 

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

если lcd.print("Русский язык"); не печатает, то никак.

k_vit
Offline
Зарегистрирован: 11.09.2016

И на том спасибо. Буду менять железо. А какое точно подойдет для русского языка?

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

k_vit пишет:

И на том спасибо. Буду менять железо. А какое точно подойдет для русского языка?

в LCD прошито два шрифта - латиница и что-то ещё.

искать с латиницей и кириллицей.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

k_vit пишет:

...

arduino nano

...

Теперь о моей проблеме. Sketch оказался сильно большой, и уже нет места для  развития программы. Кто-нибудь подскажите, как уменьшить мою программу?

...

//#include <Wire.h>
//#include <TimeLib.h>
#include <DS1307RTC.h>
#include <IRremote.h>
#include <SPI.h>
#include <SD.h>
#include <LiquidCrystal_I2C.h>

Видите ли, Вы используете младшую модель контроллера и пытаетесь запихнуть в нее 5 библиотек, да еще и несколько котен строк своего кода.

Способ ужать код существует, но, боюсь, он не для Вас: нужно отказываться от стандартных библиотек и писать работу с "железом" самостоятельно, поддерживая только те функции, которые Вам действительно необходимы. Но это уже, строго говоря, не подход Ардуино. С точки зрения Ардуино, если программе становится тесно в каком-либо контроллере, нужно брать модель постарше. Например, Мега 2560.

k_vit
Offline
Зарегистрирован: 11.09.2016

Огромное спасибо за совет. Уже заказал с алекса...

vvadim
Offline
Зарегистрирован: 23.05.2012

купите российский дисплей МЭЛТ

ОНИ ВСЕ РУССИФИЦИРОВАНЫ, правда дорогие

pastry777
Offline
Зарегистрирован: 16.01.2014

я тоже уже год как диабетик...над таким устройством не задумывался,будильника на телефоне вполне хватает...да и не настолько все страшно и плохо,чтоб прям до минуты,чтоб прям отдельное устройство иметь=)отпишите когда соберете устройство,все равно любопытно=)

Genri5
Offline
Зарегистрирован: 31.05.2016

vvadim пишет:

купите российский дисплей МЭЛТ

ОНИ ВСЕ РУССИФИЦИРОВАНЫ, правда дорогие

Да, зачем? Полно дешевых 1602 с кириллицей.

k_vit
Offline
Зарегистрирован: 11.09.2016

Genri5]</p> <p>[quote=vvadim пишет:

Да, зачем? Полно дешевых 1602 с кириллицей.

 

Если кому попадались скиньте ссылку. Я думаю всем будет интересно!

k_vit
Offline
Зарегистрирован: 11.09.2016

pastry777 пишет:

я тоже уже год как диабетик...над таким устройством не задумывался,будильника на телефоне вполне хватает...да и не настолько все страшно и плохо,чтоб прям до минуты,чтоб прям отдельное устройство иметь=)отпишите когда соберете устройство,все равно любопытно=)

Суть идеи не ставить уколы по времени минута в минуту. А в том, чтобы ребенок запомнил что в какой последовательности. И заблаговременно доставал препараты из холодильника, а также не забывал менять иглы. С девайсом ему гораздо интереснее, чем просто с тетрадкой.

Genri5
Offline
Зарегистрирован: 31.05.2016

Да вот хотя бы здесь: http://voron.ua/catalog/023080

vvadim
Offline
Зарегистрирован: 23.05.2012

Genri5 пишет:

Да вот хотя бы здесь: http://voron.ua/catalog/023080

ты бы ещё ссылку на бразильцев сбросил)))))

4 доллара плюс пересылка - совсем не дёшево получается

Genri5
Offline
Зарегистрирован: 31.05.2016

Откуда мне знать где ты живеш? Может и в Бразилии. ))))

Я вообще собирал, бы, на дисплее  LCD 3310(3410) или 5110. Эти дисплеи доступнее и потребление меньше.

k_vit
Offline
Зарегистрирован: 11.09.2016

LCD 3310 у меня есть. Я сначала на нем и собирал. Но дисплей сильно мелкий.

 

vvadim
Offline
Зарегистрирован: 23.05.2012

а зачем вам sd карта ?

k_vit
Offline
Зарегистрирован: 11.09.2016

vvadim пишет:

а зачем вам sd карта ?

На неё записываются данные: ХЕ, показания глюкометра, инсулин.

vvadim
Offline
Зарегистрирован: 23.05.2012

а где вы эти данные получаете

я в коде не увидел

k_vit
Offline
Зарегистрирован: 11.09.2016

Вводятся вручную с ir пульта. Строка 119 142 158 178. Сохранение 204.

arduinec
Offline
Зарегистрирован: 01.09.2015

k_vit пишет:

Вводятся вручную с ir пульта.

А зачем это нужно? Проще завести бумажный журнал и туда записывать, или на большом компьтере в файл вводить. Или Ардуина как-то использует для каких-то расчётов эти данные?

Вот если бы был датчик глюкозы и Ардуина с него считывала данные...

vvadim
Offline
Зарегистрирован: 23.05.2012

arduinec пишет:

k_vit пишет:

Вводятся вручную с ir пульта.

А зачем это нужно? Проще завести бумажный журнал и туда записывать, или на большом компьтере в файл вводить. Или Ардуина как-то использует для каких-то расчётов эти данные?

Вот если бы был датчик глюкозы и Ардуина с него считывала данные...

тоже вот смотрю какое то ненужное решение с картой

тем более организация записи параметров на карту не решена

k_vit
Offline
Зарегистрирован: 11.09.2016

Можно записывать и на обоях. Ещё раз повторюсь моему сыну так интереснее. А запись идет на карту с целью обработки  данных в vba.

k_vit
Offline
Зарегистрирован: 11.09.2016

Можно записывать и на обоях. Ещё раз повторюсь моему сыну так интереснее. А запись идет на карту с целью обработки  данных в vba.

k_vit
Offline
Зарегистрирован: 11.09.2016

А сбор данных на прямую - это идея. У меня два прибора акку чек и ун тач. Оба имеют порты обмена данных. Остается загадка как их расшифровать.

arduinec
Offline
Зарегистрирован: 01.09.2015

k_vit пишет:

Можно записывать и на обоях. Ещё раз повторюсь моему сыну так интереснее. А запись идет на карту с целью обработки  данных в vba.

А почему нельзя сразу в компьютер записать (с целью обработки  данных в vba)?
Сначала данные записываются на SD-карту в Ардуине, затем карта вынимается и подключается к компьютеру. Зачем так усложнять?