Переделка кредла-зарядки для акб смартфонов в тестер АКБ.
- Войдите на сайт для отправки комментариев
Давно хотел сделать крутую зарядку-тестер, что б всё умела, всё поддерживала,
и при этом ещё и выглядела достойно. Недавно понял, что это несбыточные мечты, и врядли когда я соберусь
на такой серьёзный проект. Но потребность тестировать аккумы есть, и в основном это аккумуляторы смартфонов и телефонов. Решил сделать простую тестер-зарядку, но на современной элементной базе. Предназначена только для Li-ion, только одно баночные, и только определённого типоразмера (хотя ничего не мешает подцепить крокодилами обычный 18650-элемент. Когда встал вопрос корпуса понял , что без специального держателя батареи не обойтись. Поэтому под это дело купил зарядку на Али специально в качестве корпуса. Ссылка. Родные внутренности интереса не представляли. Решил делать свою плату. К сожалению места под дисплей там нет. Нехотя пришлось прикручивать ESP8266, и делать простейший веб-интерфейс. В целом аппарат получился неплохой, я даже доволен. (все фотки кликабельны)
Схемотехника:
18-битный АЦП mcp3421 через делитель измеряет напряжение, благодаря тру-дифф входу измерять можно в любой полярности. Если полярность батареи правильная, то сработает реле и подключит основную схему. Зарядку производит "народный" чип tp4056. Сейчас есть и более
интересные микрухи зарядки, но этот был под рукой. С вывода подключения токозадающего резистора снимается сигнал на АЦП, -вольтаж пересчитыватся и выводится как ток зарядки (с резистором 3 кОм от 40 до 400 мА), это измерение чисто информационное, в алгоритме тестирования не используется. Ток измеряет INA219. Выбрал только потому, что была под рукой. В идеале лучше взять более современный Ina226. Оба АЦП питаются от отдельного маломощного стабилизатора в целях минимизации помех, но в принципе можно всё от одного мощного 1117-3.3 запитать. От стабилизации разрядного тока решил отказаться по ряду соображений. В качестве нагрузки -резисторы, управляемые мосфет-ключом. Два резистора образуют 3 варианта нагрузки, примерно 250, 500, и 700 ма. В качестве резисторов по 4 штуки пол-ваттных SMD, включенных паралельно для поднятия общей мощности. Для озвучивания событий используется электромагнитный излучатель с встроенным генератором. 5вольтовый излучатель по даташиту потребляет 30 мА, но работая от 3х вольт фактический ток составил 10 мА, поэтому я его посадил на ногу ESP без ключа на транзисторе, если кто-то будет повторять, то ключ лучше сделать. Дело в том, что использовать пищалку я решил уже после того, как сделал плату :) Детали без номиналов на схеме некритичны в разумных пределах. В затвор мосфетов -от 100 Ом до килоома, стяжка затвора от 100к до мегаома. Прочие подтяжки 3..20к.
Использование:
При включении питания устройство пытается 10 секунд соединиться с прописанной в скетче точкой доступа. Если такой точки нет, то автоматически создаётся точка с таким же названием и паролем. Это позволит взять тестер куда-то в другое месте, где нет вашей точки и пользоваться без перепрошивки. В первом случае IP адрес можно узнать из сериала или вашей точки доступа, во втором случае адрес будет 192.168.4.1, и в сериале тоже отобразится. Если устройство подключилось к существующей точке -раздатся один очень короткий писк, если оно само создало точку -два коротких писка.
Никакого управления по умолчанию не требуется, весь цикл происходит автоматически после подключения аккумулятора. При подключении акб включается режим зарядки, затем разряд с измерением ёмкости аккумулятора, затем повторный заряд. После этого происходит небольшой разряд в течении 10 секунд и измеряется внутренее сопротивление. В начале каждого режима раздаются писки числом соответсвующим режиму - 1-писк первый заряд, 2 писка -разряд, 3 писка -повторный заряд, 4 писка -измерение сопротивления. 5 писков -тестирование завершено.
Вручную через веб-кнопочки можно переключиться из любого в любой режим, изменить нагрузку, и отменить проверку полярности и напряжения батареи (например что-бы стартовать аккум с заблокировавшейся схемой защиты). Внимание, - если с отключенной проверкой подключить в неправильной полярности то мгновенно сгорит чип tp4056.
Настройка. Для точной настройки нужно откалибровать значения обоих АЦП. Напряжение
с MCP3421 измеряет точно, но из-за резисторного делителя необходимо рассчитать множитель (254 строка).
Я подавал напряжение 5 вольт с прецизионного источника, и рассчитывал множитель (13 строка).
Точность тока, измеряемого INA219 зависит от точности номинала шунта. 0.1 Ома -это очень грубо. Я брал хороший мультиметр, включал последовательно с акб, и рассчитывал сопротивление шунта исходя из уже измеренного напряжения, и тока взятого с мультиметра. Так же мультиметром можно проверить точность тока зарядки и скорретировать множитель (230 строка). Но это уже не критично.



Скетч:
//Распиновки #define ce_pin 15 //выход МК - вход TP4056 "Разрешение работы" #define stb_pin 0 //вход МК с подтяжкой -выход TP4056 "открытый коллектор" светодиод "Зарядка окончена" #define rele_pin 4 //выход МК - подключение аккумулятора через реле #define buz_pin 16 // выход МК -активный звукоизлучатель #define r7_pin 5 //выход МК -подключение резистора 7 Ом #define r15_pin 14 //выход МК -подключение резистора 15 Ом #define adc_pin A0 // вход МК -выход TP4056 "резистор тока" #define sda_pin 13 // назначить SDA #define scl_pin 12 //назначить SCL #define Vmin 3.0 //минимальное напряжение до которого происходит разряд #define Vdetect 2 //минимальное напряжение на батарее как пригодной для тестирования #define Rshnt 0.1025 //точное сопротивление шунта (измерялся через ток и напряжение точным мультиметром) #include "Wire.h" #include <ESP8266WiFi.h> #include <ESP8266WebServer.h> const char* ssid = "имявашейточки"; const char* password = "паролькточке"; ESP8266WebServer server(80); volatile uint16_t sek; // счёт времени оперативня переменная, и по режимам для статистики uint16_t sek_mode1,sek_mode2,sek_mode3, sek_mode4; float batt_volt, Rvn, tok, tok_chg, capacity, wh,wh_out; byte mode; //режим: 0- акк не обнаружен. 1-заряд, 2 разряд, 3-заряд2, 4-измерение сопротивления, 5 - конец работы. byte webmode=0;//переменная режимов, задаваемых из браузера String oldwebmodestr;//для сравнения режимов из браузера заданных и выполненных byte Rload=2; //выбор нагрузки по умолчанию 1 -резистор 15 Ом, 2 -7 Ом, 3 -5 Ом. boolean Vbattcontrol=1; //флаг контроля полярности и минимального напряжения на аккумуляторе. 0 -нет контроля. 1 -есть контроль void setup() { pinMode (stb_pin, INPUT_PULLUP); //StandBay TP4056 pinMode (ce_pin, OUTPUT); //CE TP4056 pinMode (rele_pin, OUTPUT); //Rele connect Batt. pinMode (buz_pin, OUTPUT); pinMode (r7_pin, OUTPUT); pinMode (r15_pin, OUTPUT); Wire.begin(sda_pin,scl_pin); ina219_write(0x00, 0x107D);// значение конфигурационного регистра по даташиту Wire.beginTransmission(0x68);//i2c адрес MCP3421= B1101000 Wire.write(B11100); // настройка АЦП: постоянное преобразование, 18бит, усиление=1. Wire.endTransmission(); noInterrupts(); timer0_isr_init(); timer0_attachInterrupt(tim_sek); timer0_write(ESP.getCycleCount() + 80000000L); // 80MHz == 1sec interrupts(); Serial.begin(115200); ////////web server settings WiFi.mode(WIFI_STA); //попробовать приконнектится к домашней точке WiFi.begin(ssid, password); Serial.println(""); ///Wait for connection while ( WiFi.status()!= WL_CONNECTED) { delay(500); Serial.print("."); if (sek>10) break; } //в ождании коннекта рисует точки в сериал if (WiFi.status() == WL_CONNECTED ){ buzzer(1,20); //пискнуть 1 раз что соединилось как клиент Serial.println(""); Serial.print("Connected to "); Serial.println(ssid); Serial.print("IP address: "); Serial.println(WiFi.localIP()); } else {//если этой точки нет, то созать точку с дефолтовым адресом 192.168.4.1 WiFiClient(stop); WiFi.mode(WIFI_AP); Serial.println(""); Serial.print("Configuring access point..."); WiFi.softAP(ssid,password, 13,false ); IPAddress myIP = WiFi.softAPIP(); Serial.print("AP IP address: "); Serial.println(myIP); buzzer(2,20); //пискнуть 2 раз что стартовал сервер } WiFi.printDiag(Serial);//вывести в сериал данные о соединении server.on("/", handleRoot); server.onNotFound (handleRoot ); server.begin(); Serial.println("HTTP server started"); delay(500); //что б писк не слился со следующим }// end setup void tim_sek(){// тикалка секунд sek++; switch(mode){ case 1: sek_mode1++; break; case 2: sek_mode2++; break; case 3: sek_mode3++; break; case 4: sek_mode4++; } timer0_write(ESP.getCycleCount() + 80000000); } void handleRoot() { //опрос "кнопок" -переход в режимы if( server.hasArg("webmode") ){ String webmodestr=server.arg("webmode"); if (oldwebmodestr!=webmodestr){ if(webmodestr == "0" ) {mode = 0;} else if(webmodestr == "1" ) {mode = 1; } else if(webmodestr == "2" ) {mode = 2; } else if(webmodestr == "3" ) {mode = 3; } else if(webmodestr == "4" ) {mode = 4; } else if(webmodestr == "5" ) {Rload = 1; } else if(webmodestr == "6" ) {Rload = 2; } else if(webmodestr == "7" ) {Rload = 3; } else if(webmodestr == "8" ) {Vbattcontrol = 0; } else if(webmodestr == "9" ) {Vbattcontrol = 1; } oldwebmodestr=webmodestr; } //end if oldwebmode.. }//end if server.hasarg //остновной код HTML String webstr = ""; webstr = "<html>\ <head>\ <meta http-equiv='refresh' content='5'/>\ <title>ESP8266 charger</title>\ <style>\ body { background-color: #cccccc; font-family: Arial, Helvetica, Sans-Serif; Color: #000000; }\ </style>\ </head>\ <body>\ <h2>Test Li-ion battery for smartphones</h2><font color=green>\n"; if (mode==0) { webstr+="<h1><b>Waiting...</b></h1>"; } else if (mode==1) { webstr+="<h1><b>Primary charging</b></h1>"; } else if (mode==2) { webstr+="<h1><b>The measurement of the Battery capacity</b></h1>"; } else if (mode==3) { webstr+="<h1><b>Re-charge</b></h1>"; } else if (mode==4) { webstr+="<h1><b>Measurement of internal resistance</b></h1>"; } else if (mode==5) { webstr+="<h1><b>Testing completed</b></h1>"; } // строчка времени int mn = sek / 60; int hr = mn / 60; char timestr[47]; sprintf(timestr, "<font color=black><p>Uptime: %02d:%02d:%02d</p>",hr, mn % 60, sek % 60); webstr+=timestr; //строчка напряжения webstr+="<h2>The battery voltage <font color=red>" + String(batt_volt,3) + "<font color=black> v</h2><hr>"; //строчка при зарядке if (mode==1||mode==3) { webstr+="<h2>Charge current <font color=red>" + String(tok_chg,0) + "<font color=black> mA</h2><hr>"; } if (mode>=3) { webstr+="<h2>the energy in the charging <font color=red>" + String(wh_out,0) + "<font color=black> mWh</h2><hr>"; } //строчка при разряде if (mode==2) { webstr+="<h2>Discharge current <font color=red>" + String(tok,0) + "<font color=black> mA</h2><hr>";} //показ ёмкости if (mode >1) { webstr+="<h2>Battery capacity <font color=red>" + String(capacity,2) + "<font color=black> mA/H <font color=red>" + String(wh,0)+"<font color=black> mW/h</h2><hr>";} //показ сопротивления if (mode >3) { webstr+="<h2>Internal resistance <font color=red>" + String(Rvn,2) + "<font color=black> Ohm</h2><hr>";} //вывод статистики в конце теста if (mode==5) { webstr+="<h3>Statistics: Charge1="+String(sek_mode1/60)+"min; disCharge="+String(sek_mode2/60)+"min; Charge2="+String(sek_mode3/60)+"min; </h3>"; }//end if mode==5 ////////////обработка "кнопок"//////////////////////////////// if (mode!=0){ webstr+="\ Repeat cycle: \ <a href=\"/?webmode=0\"><button>jump</button></a>";} if (mode!=1){ webstr+="\ Charge1 : \ <a href=\"/?webmode=1\"><button>jump</button></a>";} if (mode!=2){ webstr+="\ Cap.measure : \ <a href=\"/?webmode=2\"><button>jump</button></a>";} if (mode!=3){ webstr+="\ Re-Charge : \ <a href=\"/?webmode=3\"><button>jump</button></a>";} webstr+="\ Res. measure \ <a href=\"/?webmode=4\"><button>jump</button></a><br>"; if(Rload != 1){ webstr+="\ load 15 Ohm \ <a href=\"/?webmode=5\"><button>select</button></a>"; } if(Rload != 2){ webstr+="\ load 7 Ohm \ <a href=\"/?webmode=6\"><button>select</button></a>"; } if(Rload != 3){ webstr+="\ load 5 Ohm \ <a href=\"/?webmode=7\"><button>select</button></a>"; } if( Vbattcontrol ){webstr+="\ <br>Control polarity and voltage of the battery: \ <a href=\"/?webmode=8\"><button>Off</button></a></br>";} else {webstr+="\ <h3>Control polarity and voltage of the battery: \ <a href=\"/?webmode=9\"><button>On</button></a></br>"; } webstr+= "</body></html>"; server.send ( 200, "text/html", webstr ); } void loop() { batt_volt= vbatt_read();// измерить напряжение на каждом круге if (Vbattcontrol) { //если напряжение менее нормы то всё отключить if (batt_volt < Vdetect) {nonew_akk(); mode=0; } else { if (mode==0) {nonew_akk(); mode=1; buzzer(mode,100); } } }//enf if Vbattcontrol //если нет контроля то перейти к заряду если mode0 else { if (mode==0) { nonew_akk(); mode=1;} } switch(mode){ case 0: nonew_akk(); break; //обнуление переменных и ожидание подключения акка case 1: charge(); break; //зарядка case 2: discharge(); break; //измерить ёмкость case 3: charge(); break; //зарядка-2 case 4: Rvn_test(); break; //измерить сопротивление case 5: digitalWrite(rele_pin,LOW); //финиш } //end switch/case server.handleClient(); }//end loop void nonew_akk(){ select_load(0); digitalWrite(ce_pin,LOW);digitalWrite(rele_pin,LOW); Rvn=0, tok=0, capacity=0; wh=0; wh_out=0; sek_mode1=0; sek_mode2=0; sek_mode3=0; sek_mode4=0; } void charge(){// режим зарядки и обнаружение конца зарядки static uint16_t old_sek; digitalWrite(rele_pin,HIGH); digitalWrite(ce_pin,HIGH); //включить заряд select_load(0);// отключить нагрузки tok_chg= analogRead(adc_pin) / 2.412403442; //пересчёт в миллиамперы if (sek!=old_sek&&mode==3){wh_out += (batt_volt* tok_chg)/3600.0; old_sek=sek;} //считать мощность при зарядке //если tp4056 сигнализирует об окончании заряда, то отключить заряд и сменить режим. if (digitalRead(stb_pin)==LOW){digitalWrite(ce_pin,LOW); mode++; buzzer(mode,100); } } void discharge(){// измерение ёмкости static uint16_t old_sek=255; if (sek==old_sek) {return;}//обрабатывать данные раз в секунду digitalWrite(rele_pin,HIGH); digitalWrite(ce_pin,LOW); //Отключить зарядку, включить реле select_load(Rload);//включить нагрузку tok = ina219_read(0x01) / Rshnt /100.0; capacity +=(tok/3600.0);// расчёт емкости из тока и времени wh+= (batt_volt* tok)/3600.0; old_sek=sek; if (batt_volt<Vmin) {select_load(0); mode++; buzzer(mode,100); } //если напруга упала до минимума то сменить режим на зарядку. } //end_mode3 float vbatt_read(){ int32_t value; Wire.requestFrom(0x68,4); value = ((int32_t)Wire.read()<<24) |((int32_t)Wire.read()<<16)|((int32_t)Wire.read()<<8)|(Wire.read()); value>>=8;//скинуть информационный байт return value /24287.98860781773; //результат в вольтах } void Rvn_test(){ static uint16_t old_sek = sek; digitalWrite(rele_pin,HIGH); digitalWrite(ce_pin,LOW); //Отключить зарядку, включить реле select_load(1); //подключить резистор 15 Ом handleRoot();// что-б отобразить изменение режима if (sek_mode4 <10) {return;} //delay(10000); //выждать 10 секунд float volt_start= vbatt_read(); //измерить напряжение под нагрузкой 15Ом float tok1 = ina219_read(0x01) / Rshnt /100.0; select_load(3); //подключить резистор 7 и 15 Ом delay(3000); float volt_end= vbatt_read(); //измерить напряжение под нагрузкой 5Ом float tok2 = ina219_read(0x01) / Rshnt /100.0; select_load(0); Rvn= (volt_start*1000 -volt_end*1000) / (tok2-tok1); mode++; buzzer(mode,1000); } void select_load(byte n){ switch(n) { case 1: digitalWrite(r15_pin,HIGH); digitalWrite(r7_pin,LOW); break; case 2: digitalWrite(r7_pin,HIGH); digitalWrite(r15_pin,LOW); break; case 3: digitalWrite(r15_pin,HIGH); digitalWrite(r7_pin,HIGH); break; case 0: digitalWrite(r15_pin,LOW); digitalWrite(r7_pin,LOW); } } //end void void buzzer(byte n, int tim){ for ( ; n>0; n--) { digitalWrite(buz_pin,HIGH); delay(tim); digitalWrite(buz_pin,LOW); delay(300); } } // функция записи в конфигурационные регистры INA219 void ina219_write(byte adr, uint16_t cfg) { Wire.beginTransmission(0x40); Wire.write(adr); Wire.write((cfg >> 8) & 0xFF); Wire.write(cfg & 0xFF); Wire.endTransmission(); } //функция чтения данных из регистров INA219 int ina219_read(byte adr) { Wire.beginTransmission(0x40); Wire.write(adr); Wire.endTransmission(); Wire.requestFrom(0x40,2); int value = ((Wire.read() << 8) | Wire.read()); return value; }Интересный проект! Положу в закладки.
Радует использование смартфона в качестве дисплея и управления. Также радует точность измерений.
От сборки сдерживает отсутствие mcp3421. На Али можно купить по приемлимой цене только десятком.
yucan, на ибей есть тыц В принципе можно брать любой ацп с шиной I2C. ADS1110 например даже в таком же корпусе и с такой же распиновкой. Но в коде конечно поменять пару строчек придёться.
От сборки сдерживает отсутствие mcp3421. На Али можно купить по приемлимой цене только десятком.
А такие вещи так и покупаются (если не сотней) они же "во все дырки затычки".
Заказал на Ибее. Такой же модуль на Али почти в 2 раза дороже.
Пока попробую код откомпилировать
Какой версией IDE компилировать?
arduino-1.6.5-r5 ругается. Пишет "эскиз не создается"
File name tester akk_esp8266.ino is invalid: ignored
java.io.IOException: Не найдено правильных файлов с кодом...
У меня java 8-я установлена, система ХР
yucan,
Понял, спасибо. Буду пробовать.
Новости проекта:
(1)протестировал новый аккум с Али для смартфона Samsung Galaxy, заявленная ёмкость 1650 мА/ч - измерил при всех трёх вариантах нагрузки.
250 мА - 1662 мА/ч; 500 мА - 1612 мА/ч; 700 мА - 1588 мА/ч; Сопротивление не менялось -0,18 Ом
Как видно на малом токе даже чуть больше нормы. И довольно небольшая зависимость ёмкости от тока нагрузки. Выходит и в правду был оригинал, как было обещано на страничке продавца.
(2)Добавил вывод в милливатт-часах, причём как при зарядке так и при разряде. Теперь видно, сколько энергии "вошло", и сколько "вышло" :-)
Скетч в #1 обновил.
У некоторых продавцов можно купить хорошие аккумуляторы. Мне пришли аккумуляторы piksell типоразмера ААА. R вн=0,11 Ом. Заявленная ёмкость 1200 ма\ч - тоже соответствуют! До этого на шуруповёрт покупал акумуляторы 18650 с заявленной ёмкостью 2600 - тоже соответствовали.
Здравствуйте! Китаец вместо INA 219 прислал шилд INA 226. Переделывать что нибудь надо?
yucan, В некотором смысле вам даже повезло, но если вы далеки от понимания даташита и настройки регистров, то будут серьёзные проблемы, ибо скетч нужно модифицировать. У Ina226 другой i2c адрес(задаётся адресными входами), у него по другому настраивается регистр конфигурации. И нету регулировки усиления, значит с шунта не должно прийти напряжение больше 80мв (при шунте 0,1 Ома ток не должен превышать 0,8 Ампер)
Скачал даташит. Нет, с регистрами мне не разобраться.
yucan, тогда незнаю чем вам помочь. Существует ещё готовая билиотека для ina226, но не могу ничего сказать кроме того, что она есть. Билиотека позволит получить готовую цифру тока. Но это разумеется потребует ещё более существенной модификации скетча.
Да уже заказал ina219 у другого продавца.
Бибилиотеку для ina226 скачал. Завтра попробую к ардуино прикрутить
Здравствуйте! Не удаётся к ардуино подключить. Адрес по умолчанию задал 40H. Не пойму в чем дело. Сканер этот модуль не видит. Подключаю по этой схеме
yucan, стандартный I2C сканер должен видеть. Вариантов в общем два -либо неправильно подключено, либо модуль нерабочий.
Да я тоже так думаю...А в среду ардуино ничего подгружать не надо?
Ничего. I2C должен откликаться при поиске сканером.
Случайно нашёл в инете фотку модуля INA226 и обратил внимание на маркировку
А это мой. SDA и SCL перепутаны местами. Пошли данные в монитор порта! Сопротивление шунта 0, 01 Ом.
yucan, такой шунт не годится, по крайней мере для данного тестера точно. При максимальном токе нагрузки 0,75 ампера напряжение на шунте будет всего 7,5 мв. Это уровень помех и наводок.
Перекинул полярность - процесс пошёл! И на разряде тоже.
dimax, спасибо за проект!
Начал тестировать аккумуляторы, заметил, что в режиме заряда, через некоторое время отваливается сеть. Причём режим ESP не меняется, все сигналы на 4056 выдаются. Сначала добавил ёмкостей по питанию, потом сменил источник питания - толку нет. Тестер работает в режиме точки доступа. В других режимах всё норм. Куда копать не знаю.
yucan, у вас что-то с самого начала не заладилось с повторением этого проекта. Я свой в режиме точки доступа особо долго не гонял за ненадобностью, да и сам этот режим добавил, когда уже всё отладил. А в режиме клиента проблем не было. Наверно есть смысл погуглить на тему "esp8266 подвисает", наверняка есть какие-то типовые случаи.
dimax, простите, если вопрос будет глупым - если чуть упростить и напряжение мерить встроенным АЦП МК, а ток - классической схемой на любом распространненом ОУ , например ЛМ358 - сильно упадет точность?
b707, мне кажется для качественного измерения напряжения литиевого аккумулятора нужно разрешение АЦП порядка 1mV, при зарядке/разрядке это ещё не сильно критично, но при измерении внутреннего сопротивления -это уже обязательно. Гипотетически с хорошим ИОН, с удачной разводкой оного на плате и оверсемплингом можно выжать этот милливольт. Но я бы не советовал. Можно всё это сделать, а милливольты всё равно будут прыгать. Проще внешний сигма-дельта АЦП, благо их сейчас в ассортименте.
Здравствуйте, dimax! У вас на схеме плюс аккумулятора модключается к -Vin INA219. Это правильно? ESP-шка моя исправна. У меня пропадает сеть только в режиме заряда. Причем если при заряде аккумулятор отключить - тут же сеть появляется.
yucan, там не особо важно куда плюс куда минус, просто в одном случае будут отрицательные значения тока. Если они положительные, значит всё ок. Измерьте напряжение питания на ногах ESP-шки при заряде. Самая частая причина подвисаний -плохое питание.
У меня схема поместилась в обычной лягушке. Устройсвом доволен, хоть и во время зарядки вайфай пропадает. В целом свои функции выполняет. Спасибо!
Всем привет, очень занятная и интересная тема, есть непреодолимое желание повторить, останавливает только одно, сам код для ардуино есть, а где брать фаил .apk. для андроида, сильно не пинайте я только начал осваивать ардуино, а тут еще и андроид......
derby, нет никакого apk. Всё управление через любой интернет-браузер.
PS: для начинающего этот проект может оказаться слишком сложным.
(// основной код HTML) посмотрев на код боле внимательно, все сразу стало понятно, что и откуда берется на экране андроида, да сам код конечно очень сложный, будем осваивать, во остальном, ни каких сложностей не вижу, иготовление плат(ы) пайка, это все освоено, очень давно, спасибо за разЪяснение.