Диабет и 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-карту в Ардуине, затем карта вынимается и подключается к компьютеру. Зачем так усложнять?