Диабет и arduino
- Войдите на сайт для отправки комментариев
Диабет и 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); }
если
lcd.print(
"Русский язык"
);
не печатает, то никак.И на том спасибо. Буду менять железо. А какое точно подойдет для русского языка?
И на том спасибо. Буду менять железо. А какое точно подойдет для русского языка?
в LCD прошито два шрифта - латиница и что-то ещё.
искать с латиницей и кириллицей.
...
arduino nano
...
Теперь о моей проблеме. Sketch оказался сильно большой, и уже нет места для развития программы. Кто-нибудь подскажите, как уменьшить мою программу?
...
Видите ли, Вы используете младшую модель контроллера и пытаетесь запихнуть в нее 5 библиотек, да еще и несколько котен строк своего кода.
Способ ужать код существует, но, боюсь, он не для Вас: нужно отказываться от стандартных библиотек и писать работу с "железом" самостоятельно, поддерживая только те функции, которые Вам действительно необходимы. Но это уже, строго говоря, не подход Ардуино. С точки зрения Ардуино, если программе становится тесно в каком-либо контроллере, нужно брать модель постарше. Например, Мега 2560.
Огромное спасибо за совет. Уже заказал с алекса...
купите российский дисплей МЭЛТ
ОНИ ВСЕ РУССИФИЦИРОВАНЫ, правда дорогие
я тоже уже год как диабетик...над таким устройством не задумывался,будильника на телефоне вполне хватает...да и не настолько все страшно и плохо,чтоб прям до минуты,чтоб прям отдельное устройство иметь=)отпишите когда соберете устройство,все равно любопытно=)
купите российский дисплей МЭЛТ
ОНИ ВСЕ РУССИФИЦИРОВАНЫ, правда дорогие
Да, зачем? Полно дешевых 1602 с кириллицей.
Да, зачем? Полно дешевых 1602 с кириллицей.
Если кому попадались скиньте ссылку. Я думаю всем будет интересно!
я тоже уже год как диабетик...над таким устройством не задумывался,будильника на телефоне вполне хватает...да и не настолько все страшно и плохо,чтоб прям до минуты,чтоб прям отдельное устройство иметь=)отпишите когда соберете устройство,все равно любопытно=)
Суть идеи не ставить уколы по времени минута в минуту. А в том, чтобы ребенок запомнил что в какой последовательности. И заблаговременно доставал препараты из холодильника, а также не забывал менять иглы. С девайсом ему гораздо интереснее, чем просто с тетрадкой.
Да вот хотя бы здесь: http://voron.ua/catalog/023080
Да вот хотя бы здесь: http://voron.ua/catalog/023080
ты бы ещё ссылку на бразильцев сбросил)))))
4 доллара плюс пересылка - совсем не дёшево получается
Откуда мне знать где ты живеш? Может и в Бразилии. ))))
Я вообще собирал, бы, на дисплее LCD 3310(3410) или 5110. Эти дисплеи доступнее и потребление меньше.
LCD 3310 у меня есть. Я сначала на нем и собирал. Но дисплей сильно мелкий.
а зачем вам sd карта ?
а зачем вам sd карта ?
На неё записываются данные: ХЕ, показания глюкометра, инсулин.
а где вы эти данные получаете
я в коде не увидел
Вводятся вручную с ir пульта. Строка 119 142 158 178. Сохранение 204.
Вводятся вручную с ir пульта.
А зачем это нужно? Проще завести бумажный журнал и туда записывать, или на большом компьтере в файл вводить. Или Ардуина как-то использует для каких-то расчётов эти данные?
Вот если бы был датчик глюкозы и Ардуина с него считывала данные...
Вводятся вручную с ir пульта.
А зачем это нужно? Проще завести бумажный журнал и туда записывать, или на большом компьтере в файл вводить. Или Ардуина как-то использует для каких-то расчётов эти данные?
Вот если бы был датчик глюкозы и Ардуина с него считывала данные...
тоже вот смотрю какое то ненужное решение с картой
тем более организация записи параметров на карту не решена
Можно записывать и на обоях. Ещё раз повторюсь моему сыну так интереснее. А запись идет на карту с целью обработки данных в vba.
Можно записывать и на обоях. Ещё раз повторюсь моему сыну так интереснее. А запись идет на карту с целью обработки данных в vba.
А сбор данных на прямую - это идея. У меня два прибора акку чек и ун тач. Оба имеют порты обмена данных. Остается загадка как их расшифровать.
Можно записывать и на обоях. Ещё раз повторюсь моему сыну так интереснее. А запись идет на карту с целью обработки данных в vba.
А почему нельзя сразу в компьютер записать (с целью обработки данных в vba)?
Сначала данные записываются на SD-карту в Ардуине, затем карта вынимается и подключается к компьютеру. Зачем так усложнять?