Nastavitelny istic a prudovy monitor do auta

Pochváľte sa ostatným čo zaujímave ste vyrobili alebo práve vyrábate!

Moderátori: psichac, Moderátori

TomasNM
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1371
Dátum registrácie: 22 Jan 2012, 19:24
Bydlisko: Nové Mesto nad Váhom
Vek: 43

Nastavitelny istic a prudovy monitor do auta

Príspevok od používateľa TomasNM » 22 Okt 2017, 22:00

Pani,

Kazdy autoelektrikar sa stretol so situaciou,ked stale nieco vypalovalo poistky a kym nasiel problem,tak mal plny sacok poodpalovanych poistiek.
Medzi tychto ludi patrim aj ja a tato prax ma uz prestala bavit.
Tak som vyrobil nastavitelny istic,ktory sa pripoji na miesto problematickej poistky.
Ako sa mi v hlave formovala ucelena predstava tohto zariadenia,dostal som rozne napady,ako tuto jednoduchu funkcionalitu rozsirit.
tak vzniklo zariadenie,ktore teraz popisem.

Zakladne informacie:
- riadenie prostrednictvom Arduino Nano
- LCD 5110
- napajanie vstavanym akumulatorom 18650
- nabijaci obvod pre akumulator TP4056
- stepup menic XL6009 pre napajanie autorele
- Hallov snimac prudu pre 30A
- obsluha rotacnym enkoderom

Funkcie:
- zakladny ampermeter
- graficke zobrazenie s menitelnou casovou zakladnou od 200-9999ms pre posun grafu o 1px,v krokoch 10ms
- moznost pridat buffer(nad limitny prud pre pripadne spicky),ktory vypne obvod po urcitom case,ked je prud nad limitom
- ak je prud nizsi ako v buffer zone,tak sa buffer resetuje po nastavenom case
- okamzite rozopnutie obvodu v pripade,ze prud prekroci nastaveny+buffer
- graficke zobrazenie dot/bar
- samozrejme,nastavitelna prudova hodnota
- konektor DB15 pre pripojenie adapterov na rozne tvary poistiek
- indikacia uzavreteho obvodu modrou LED
- indikacia stavu nabijania cervenou/zelenou LED
- indikacia napatia akumulatora
Prílohy
Hotovy vyrobok
Hotovy vyrobok
Poziadavka pre aktivaciu obvodu
Poziadavka pre aktivaciu obvodu
Ampermeter
Ampermeter
Casovy priebeh prudu
Casovy priebeh prudu
Nastavenia
Nastavenia
Vnutorny layout suciastok
Vnutorny layout suciastok
Schema zapojenia
Schema zapojenia
0
Naposledy upravil/-a TomasNM v 22 Okt 2017, 22:26, upravené celkom 1 krát.

Používateľov profilový obrázok
enigma
Ultimate člen
Ultimate člen
Príspevky: 2505
Dátum registrácie: 24 Dec 2011, 15:21
Bydlisko: Nitra

Re: Nastavitelny istic a prudovy monitor do auta

Príspevok od používateľa enigma » 22 Okt 2017, 22:18

pekná práca , až na tú anglíčtinu . nemohlo to byť po slovenský ? všimol som si že najme mladší slováci radšej používaju anglíčtinu ako vlastnú materskú reč . myslíte si že niekto o takých 50 rokov bude ešte používať slovenčinu ? možno niekde na lazoch .... ale aj tá už bude poloslovenčina ....
0

TomasNM
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1371
Dátum registrácie: 22 Jan 2012, 19:24
Bydlisko: Nové Mesto nad Váhom
Vek: 43

Re: Nastavitelny istic a prudovy monitor do auta

Príspevok od používateľa TomasNM » 22 Okt 2017, 22:27

Anglictina - jediny dovod:
Slovenske napisy mi tam nevojdu,inak by tam boli.
0

Používateľov profilový obrázok
Mishung
Stály člen
Stály člen
Príspevky: 494
Dátum registrácie: 01 Dec 2009, 00:00
Bydlisko: Praha
Vek: 32

Re: Nastavitelny istic a prudovy monitor do auta

Príspevok od používateľa Mishung » 15 Nov 2017, 15:49

enigma napísal:myslíte si že niekto o takých 50 rokov bude ešte používať slovenčinu ?
Preco vidis takyto stav ako problem? :)

Edit:
Pracujem vo firme kde sa vyvija elektronika (na Slovensku). Nemame tu jedineho cudzinca. Zdrojaky/dokumentaciu/interfejsy atd. piseme zasadne v anglictine. Vitaj v realnom svete.
0
They say the world is turning
But we are stuck upside down...

Používateľov profilový obrázok
Drakoush
Ultimate člen
Ultimate člen
Príspevky: 10964
Dátum registrácie: 07 Feb 2012, 23:22
Bydlisko: Nitra
Vek: 28
Kontaktovať používateľa:

Re: Nastavitelny istic a prudovy monitor do auta

Príspevok od používateľa Drakoush » 15 Nov 2017, 15:54

Pretože keď sa pozrieš na pepikov, tak už skoro ani nehovoria česky. Ich mladá generácia má strašnú úchylku hovoriť každé tretie slovo po anglicky. Šit, tohle je rýl!
0
Odkupujem zaujímavé meracie prístroje. Ponuky mailom alebo SS.

Používateľov profilový obrázok
troodon
Pokročilý člen
Pokročilý člen
Príspevky: 529
Dátum registrácie: 04 Nov 2010, 00:00
Bydlisko: Nitra
Vek: 44

Re: Nastavitelny istic a prudovy monitor do auta

Príspevok od používateľa troodon » 15 Nov 2017, 16:10

to je celkom podarena vec, obcas by sa mi take nieco hodilo, bude to sukrmony projekt ci planujes to zverejnit aj s plnkou ?
K+ za originalitu.
0

martin knocik
Ultimate člen
Ultimate člen
Príspevky: 1639
Dátum registrácie: 23 Jan 2008, 00:00
Bydlisko: Trenčianska Turná
Vek: 33
Kontaktovať používateľa:

Re: Nastavitelny istic a prudovy monitor do auta

Príspevok od používateľa martin knocik » 15 Nov 2017, 16:42

Nebojíš sa rozpájať jednosmerné skratové prúdy aute relatívne slabým 30A relé ? Nerozmýšlal si nad dostatočne dimenzovaným mosfetom/igbt na rýchle vypnutie pri veľkom skrate ?

Pracujem vo firme kde sa vyvija elektronika (na Slovensku). Nemame tu jedineho cudzinca. Zdrojaky/dokumentaciu/interfejsy atd. piseme zasadne v slovenčine. Baví ma hľadanie slovenských ekvivalentov všade kde sa to dá. Naši predkovia 1000 rokov vzdorovali maďarčine, tak im to teraz nepokazme.
0
http://mkbci.com

FEL UNIZA 2015, Ing.

ľudstvo je vírus ktorý napadol Zem

nerobme si ťažkú hlavu z debilov čo nám ani po členky nesiahajú, buďme radi že my dačo dokážeme a smejme sa im akí sú sprostí

Používateľov profilový obrázok
mac26
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1298
Dátum registrácie: 01 Feb 2010, 00:00
Bydlisko: Martin

Re: Nastavitelny istic a prudovy monitor do auta

Príspevok od používateľa mac26 » 15 Nov 2017, 17:21

Mne sa skor nepaci ten konektor.
0

Používateľov profilový obrázok
Kado
Power user
Power user
Príspevky: 1625
Dátum registrácie: 02 Sep 2007, 00:00
Bydlisko: PB
Vek: 40

Re: Nastavitelny istic a prudovy monitor do auta

Príspevok od používateľa Kado » 15 Nov 2017, 18:26

konektor iný, s väčšou prúdovou zatazitelnostou, , do serie dať poistku (pre prípad skratu v obvode o rad vysie ako je max meraný prúd), relé iné, ak je 30A relé, tak dat 70A-80A relé, podla 3D modelu DPS, to relé je automobilové, mohlo by byt aj na 70A-80A, to by tam vošlo
https://www.tme.eu/sk/details/am3-12b/e ... /am3-12bp/

mosfet je dobry napad pre extra rychle vypinanie, ale iba seriova kombinacia kontakt rele a mosfet, rele kvoli ochrane pred moznym prepolovanim vstupnych svoriek teda aj "prepolovanim" mosfetu
0
Návrh zapojení s jednočipovými mikropočítačmi, tvorba programového vybavenia pre mikropočítače
http://www.jk-elektronika.info/index.html

predaj !!
http://svetelektro.com/modules.php?name ... 54#p549154

beny66ka
Stály člen
Stály člen
Príspevky: 147
Dátum registrácie: 16 Apr 2016, 22:05
Bydlisko: Ostrava

Re: Nastavitelny istic a prudovy monitor do auta

Príspevok od používateľa beny66ka » 16 Nov 2017, 12:25

SUPER. Jaký typ HAlové sondy používáš na snímání proudu ??
:potlesk: :applause: :agree:
0

TomasNM
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1371
Dátum registrácie: 22 Jan 2012, 19:24
Bydlisko: Nové Mesto nad Váhom
Vek: 43

Re: Nastavitelny istic a prudovy monitor do auta

Príspevok od používateľa TomasNM » 16 Nov 2017, 12:38

martin knocik napísal:Nebojíš sa rozpájať jednosmerné skratové prúdy aute relatívne slabým 30A relé ? Nerozmýšlal si nad dostatočne dimenzovaným mosfetom/igbt na rýchle vypnutie pri veľkom skrate ?
Dal som tam 40A rele.
Rychlost vypnutia nemusi byt az taky problem,beznym poistkam trva ovela dlhsie,kym zareaguju.
MOSFET by uz pri tychto prudoch mohol docela solidne hriat,takze som sa tym nezaoberal,navyse by musel byt zavisly na polarite,co sa mi nechcelo riesit.
Ono aj tu poistku na konci kablu som mal problem prepalit.
Original bola oznacena 20A a neprepalilo ju ani ked som cez nu tlacil 40A.
Zrejme cinska poistka.

-- Spojený príspevok 16 Nov 2017, 12:40 --
mac26 napísal:Mne sa skor nepaci ten konektor.
Ten konektor je 15pin,pricom vrchny rad je poprepajany na jednu stranu poistky,spodny rad je na druhu stranu.
Nemal problem takto preniest 30A. Pouzity typ je z rozmerovych dovodov.

-- Spojený príspevok 16 Nov 2017, 12:45 --
beny66ka napísal:SUPER. Jaký typ HAlové sondy používáš na snímání proudu ??
:potlesk: :applause: :agree:
Senzor prudu tam mam tento (ACS712):
https://www.ebay.com/itm/5A-20A-30A-Ran ... 3d26f6f621
0

pocitujlasku
Ultimate člen
Ultimate člen
Príspevky: 6200
Dátum registrácie: 20 Júl 2007, 00:00
Vek: 41

Re: Nastavitelny istic a prudovy monitor do auta

Príspevok od používateľa pocitujlasku » 16 Nov 2017, 12:47

martin knocik napísal:Zdrojaky/dokumentaciu/interfejsy atd. piseme zasadne v slovenčine. Baví ma hľadanie slovenských ekvivalentov všade kde sa to dá.
Takze sa vraciame opat do obdobia pred 89, kde vsetko bolo pisane slovensky a teraz kopec mladych ani len netusi, co znamenali niektore slova a skratky.
Inac, ak tam obhajujes sw v slovencine, tak odporucam spravavovat lokalizovany windows server. Polovicu casu stravis premyslanim, co ti to vlastne chce povedat a potom pol dna googlis anglicke ekvivalenty, aby si sa dopratral riesenia.
Kod a specifikacie sa nepisu v anglictine len tak, lebo chceme. Kopec slov sa neda prelozit spravne a potom vznikaju komplikacie (napr. v sietovych veciach: router-> smerovac, switch->prepinac a kopec dalsich odbornych vyrazov). Dalsia vec je, ze casom sa moze firma rozrast a expandovat do zahranicia. Pochybujem, ze taky Madar, alebo nemec bude vediet co znamenaju tie slovenske vyrazy.
Posledna vec: kazdy moze mat iny navrh na preklad a mozu vznikat kolizie, ked pod jednym slovom si x-ludi predstavi xx- roznych veci.
0
Jedním z největších projevů nedůvěry v Boha je hromosvod na kostele.

TomasNM
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1371
Dátum registrácie: 22 Jan 2012, 19:24
Bydlisko: Nové Mesto nad Váhom
Vek: 43

Re: Nastavitelny istic a prudovy monitor do auta

Príspevok od používateľa TomasNM » 16 Nov 2017, 12:52

troodon napísal:to je celkom podarena vec, obcas by sa mi take nieco hodilo, bude to sukrmony projekt ci planujes to zverejnit aj s plnkou ?
K+ za originalitu.
Nemam problem poskutnut informacie.
Niekam to zverejnovat neplanujem,ale ak by bol zaujem,tak mozem aj kod sem hodit.
Schema a zoznam suciastok su tu tiez.
3D model tiez nieje 1:1,pocas montaze som nieco poposuval. Tym mi islo skor si to rozhodit a zistit,ci to tam vobec vsetko vojde.
0

TomasNM
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1371
Dátum registrácie: 22 Jan 2012, 19:24
Bydlisko: Nové Mesto nad Váhom
Vek: 43

Re: Nastavitelny istic a prudovy monitor do auta

Príspevok od používateľa TomasNM » 16 Nov 2017, 20:05

Na poziadanie pridavam aj kod...
Bohuzial,stale sa nedaju nahravat subory *.ino :(

Kód: Vybrať všetko

const PROGMEM byte screens[]={
0xFF,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0F,0x08,0x0E,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0E,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0xF8,
0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x40,0x20,0xA0,0xA0,0xA0,0xA0,0x20,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0xFF,
0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFE,0x01,0x00,0x00,0x00,0x00,0x01,0xFE,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,
0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x70,0xF0,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x80,0xFD,0x05,0x05,0x05,0x05,0x05,0x05,0xFD,0x80,0xFF,0x00,0x00,0x00,0x00,0xFF,
0xFF,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x91,0x91,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0xFF,
0xFF,0x80,0xBE,0xA2,0xA2,0xA2,0xA2,0xA2,0xA2,0xA2,0xA2,0xA2,0xA2,0xA2,0xA2,0xA2,0xA2,0xA2,0xA2,0xA2,0xA2,0xA2,0xA2,0xA2,0xA2,0xA2,0xA2,0xA2,0xA2,0xA2,0xA2,0xBE,0x9C,0x80,0x80,0xFF,0x80,0x80,0x88,0x88,0xAA,0x9C,0x88,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xA0,0x80,0x80,0x80,0x80,0x80,0x80,0xBE,0x92,0xBE,0x80,0x80,0xFF,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xA6,0x96,0x88,0xB4,0xB2,0x80,0xFF,

0xF8,0x0E,0xEA,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0xCA,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0E,0x08,0x0F,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0F,0x08,0x08,0x0B,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0B,0x08,0x08,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0xF8,
0xFF,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,
0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,
0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,
0xFF,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xFF,
0xFF,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xB8,0x88,0xB8,0x88,0xB0,0x80,0xA0,0xB8,0x88,0x80,0x80,0xFF,0x80,0x80,0x88,0x88,0xAA,0x9C,0x88,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xA0,0x80,0x80,0x80,0x80,0x80,0x80,0xBE,0x92,0xBE,0x80,0x80,0xFF,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xA0,0x80,0x80,0x80,0x80,0x80,0x80,0xBE,0x92,0xBE,0x80,0xFF,

0xF8,0x0E,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0E,0x08,0x0E,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0E,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0xFF,
0xFF,0x00,0x00,0x00,0x2E,0x2A,0x3A,0x00,0x3E,0x2A,0x22,0x00,0x02,0x3E,0x02,0x00,0x00,0x00,0x3E,0x22,0x22,0x00,0x3E,0x20,0x3E,0x00,0x3E,0x12,0x2C,0x00,0x3E,0x12,0x2C,0x00,0x3E,0x2A,0x22,0x00,0x3E,0x04,0x08,0x3E,0x00,0x02,0x3E,0x02,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x22,0x3E,0x00,0x3E,0x22,0x3E,0x00,0x20,0x00,0x3E,0x22,0x3E,0x00,0x00,0x00,0x3E,0x12,0x3E,0x00,0x00,0x00,0xFF,
0xFF,0x00,0x00,0x00,0x3E,0x2A,0x14,0x00,0x3E,0x20,0x3E,0x00,0x3E,0x0A,0x02,0x00,0x3E,0x0A,0x02,0x00,0x3E,0x2A,0x22,0x00,0x3E,0x12,0x2C,0x00,0x00,0x00,0x3E,0x10,0x0E,0x00,0x3E,0x12,0x3E,0x00,0x3E,0x20,0x20,0x00,0x3E,0x20,0x3E,0x00,0x3E,0x2A,0x22,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x22,0x3E,0x00,0x3E,0x22,0x3E,0x00,0x00,0x00,0x26,0x16,0x08,0x34,0x32,0x00,0x00,0x00,0xFF,
0xFF,0x00,0x00,0x00,0x3E,0x2A,0x14,0x00,0x3E,0x20,0x3E,0x00,0x3E,0x0A,0x02,0x00,0x3E,0x0A,0x02,0x00,0x3E,0x2A,0x22,0x00,0x3E,0x12,0x2C,0x00,0x00,0x00,0x02,0x3E,0x02,0x00,0x3E,0x00,0x3E,0x04,0x08,0x04,0x3E,0x00,0x3E,0x2A,0x22,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x22,0x3E,0x00,0x3E,0x22,0x3E,0x00,0x20,0x00,0x3E,0x22,0x3E,0x00,0x00,0x00,0x24,0x2A,0x12,0x00,0x00,0x00,0xFF,
0xFF,0x00,0x00,0x00,0x3E,0x2A,0x14,0x00,0x3E,0x20,0x3E,0x00,0x3E,0x0A,0x02,0x00,0x3E,0x0A,0x02,0x00,0x3E,0x2A,0x22,0x00,0x3E,0x12,0x2C,0x00,0x00,0x00,0x3E,0x12,0x2C,0x00,0x3E,0x2A,0x22,0x00,0x2E,0x2A,0x3A,0x00,0x3E,0x2A,0x22,0x00,0x02,0x3E,0x02,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xBE,0xA2,0xBE,0x80,0xBE,0xA2,0xBE,0x80,0xA0,0x80,0xBE,0xA2,0xBE,0x80,0x80,0x80,0xA4,0xAA,0x92,0x80,0x80,0x80,0xFF,
0xFF,0x80,0x80,0x80,0xBF,0xA1,0xA1,0xA1,0xA1,0xA1,0xA1,0xA1,0xA1,0xA1,0xA1,0xA1,0xA1,0xA1,0xA1,0xA1,0xBF,0x9E,0x80,0x80,0xBF,0xA1,0xA1,0xA1,0xA1,0xA1,0xA1,0xA1,0xA1,0xA1,0xA1,0xA1,0xA1,0xA1,0xA1,0xA1,0xA1,0xA1,0xA1,0xA1,0xA1,0xA1,0xA1,0xA1,0xA1,0xA1,0xA1,0xA1,0xA1,0xA1,0xA1,0xA1,0xA1,0xA1,0xBF,0x80,0x80,0xFF,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xA0,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xBE,0x92,0xBE,0x80,0xFF,

0xFF,0x01,0x01,0xC1,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x4F,0x48,0x4E,0x4A,0x4A,0x4A,0x4A,0x4A,0x4A,0x4A,0x4A,0x4A,0x4A,0x4A,0x4A,0x4A,0x4A,0x4A,0x4A,0x4A,0x4A,0x4A,0x4A,0x4E,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x4E,0x4E,0xCE,0x8E,0x0E,0x0E,0xF8,
0xFF,0x00,0x00,0xFF,0x00,0x3E,0x22,0x22,0x00,0x3E,0x00,0x3E,0x12,0x2C,0x00,0x3E,0x22,0x22,0x00,0x3E,0x20,0x3E,0x00,0x3E,0x00,0x02,0x3E,0x02,0x00,0x00,0x00,0x3E,0x22,0x1C,0x00,0x3E,0x00,0x2E,0x2A,0x3A,0x00,0x3E,0x22,0x22,0x00,0x3E,0x22,0x3E,0x00,0x3E,0x04,0x08,0x3E,0x00,0x3E,0x04,0x08,0x3E,0x00,0x3E,0x2A,0x22,0x00,0x3E,0x22,0x22,0x00,0x02,0x3E,0x02,0x00,0x3E,0x2A,0x22,0x00,0x3E,0x22,0x1C,0x00,0xFF,0xFF,0x00,0x00,0xFF,
0xFF,0x00,0x00,0xFF,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0xF9,0xF9,0xF9,0x39,0xF9,0x39,0xF9,0x39,0xB9,0xB9,0xF9,0x39,0xB9,0xB9,0xF9,0xF9,0xF9,0x01,0x01,0x01,0xF9,0x09,0x09,0xC9,0x89,0x09,0xC9,0x09,0xC9,0x49,0xC9,0x09,0x09,0xF9,0x01,0x01,0xFF,0xFF,0x00,0x00,0xFF,
0xFF,0x00,0x00,0xFF,0x00,0x00,0x1F,0x15,0x11,0x00,0x1F,0x02,0x04,0x1F,0x00,0x1F,0x09,0x1F,0x00,0x1F,0x15,0x0A,0x00,0x1F,0x10,0x10,0x00,0x1F,0x15,0x11,0x00,0x00,0x01,0x15,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x3F,0x3F,0x3A,0x3A,0x38,0x3F,0x38,0x3A,0x3B,0x3F,0x3A,0x3A,0x38,0x3F,0x3F,0x3F,0x00,0x00,0x00,0x3F,0x20,0x20,0x27,0x20,0x21,0x27,0x20,0x27,0x24,0x27,0x20,0x20,0x3F,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,
0xFF,0x90,0x90,0x91,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x90,0x90,0xFF,
0xFF,0x80,0xBE,0xA2,0xA2,0xA2,0xA2,0xA2,0xA2,0xA2,0xA2,0xA2,0xA2,0xA2,0xA2,0xA2,0xA2,0xA2,0xA2,0xA2,0xA2,0xA2,0xA2,0xA2,0xA2,0xA2,0xA2,0xA2,0xA2,0xA2,0xA2,0xBE,0x9C,0x80,0x80,0xFF,0x80,0x80,0x88,0x88,0xAA,0x9C,0x88,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xA0,0x80,0x80,0x80,0x80,0x80,0x80,0xBE,0x92,0xBE,0x80,0x80,0xFF,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xA6,0x96,0x88,0xB4,0xB2,0x80,0xFF,
};
const PROGMEM byte numbers[]={
0xF8,0xFC,0xFE,0xFF,0x1F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x1F,0xFF,0xFE,0xFC,0xF8,
0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,
0x1F,0x3F,0x7F,0xFF,0xF8,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF8,0xFF,0x7F,0x3F,0x1F,

0x00,0x00,0x00,0x00,0xC0,0xE0,0xF0,0xF8,0xFC,0xFE,0xFF,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,

0x78,0x7C,0x7E,0x7F,0x1F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x1F,0xFF,0xFE,0xFC,0xF8,
0xC0,0xE0,0xF0,0xF8,0xF8,0x78,0x78,0x78,0x78,0x78,0x78,0x7C,0x7F,0x3F,0x1F,0x0F,
0xFF,0xFF,0xFF,0xFF,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,

0x78,0x7C,0x7E,0x7F,0x1F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x1F,0xFF,0xFE,0xFC,0xF8,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x3C,0x3C,0x3C,0x7E,0xFF,0xFF,0xE7,0xC3,
0x1E,0x3E,0x7E,0xFE,0xF8,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF8,0xFF,0x7F,0x3F,0x1F,

0x00,0x00,0x00,0x00,0x00,0xC0,0xF0,0xFC,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,
0x00,0xC0,0xF0,0xFC,0xFF,0x3F,0x0F,0x03,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,
0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0xFF,0xFF,0xFF,0xFF,0x0F,0x0F,0x0F,

0xFF,0xFF,0xFF,0xFF,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,
0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x1F,0xFF,0xFE,0xFC,0xF8,
0x1E,0x3E,0x7E,0xFE,0xF8,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF8,0xFF,0x7F,0x3F,0x1F,

0xF8,0xFC,0xFE,0xFF,0x1F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x1F,0x3F,0x3E,0x3C,0x38,
0xFF,0xFF,0xFF,0xFF,0x3C,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x3E,0xFE,0xFC,0xF8,0xF0,
0x1F,0x3F,0x7F,0xFF,0xF8,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF8,0xFF,0x7F,0x3F,0x1F,

0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0xCF,0xFF,0xFF,0xFF,0x3F,0x0F,
0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xF0,0xFC,0xFF,0x3F,0x0F,0x03,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,

0xF8,0xFC,0xFE,0xFF,0x1F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x1F,0xFF,0xFE,0xFC,0xF8,
0xC3,0xE7,0xFF,0xFF,0x7E,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x7E,0xFF,0xFF,0xE7,0xC3,
0x1F,0x3F,0x7F,0xFF,0xF8,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF8,0xFF,0x7F,0x3F,0x1F,

0xF8,0xFC,0xFE,0xFF,0x1F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x1F,0xFF,0xFE,0xFC,0xF8,
0x0F,0x1F,0x3F,0x7F,0x7C,0x78,0x78,0x78,0x78,0x78,0x78,0x3C,0xFF,0xFF,0xFF,0xFF,
0x1C,0x3C,0x7C,0xFC,0xF8,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF8,0xFF,0x7F,0x3F,0x1F,

};
const PROGMEM byte smallNumbers[]={
0x3E,0x22,0x3E,0x00,  0x00,0x04,0x3E,0x00,  0x3A,0x2A,0x2E,0x00,  0x2A,0x2A,0x3E,0x00,  0x0E,0x08,0x3E,0x00,
0x2E,0x2A,0x3A,0x00,  0x3E,0x2A,0x3A,0x00,  0x02,0x02,0x3E,0x00,  0x3E,0x2A,0x3E,0x00,  0x2E,0x2A,0x3E,0x00,

0x41,0x5D,0x41,0x7F,  0x7F,0x7B,0x41,0x7F,  0x45,0x55,0x51,0x7F,  0x55,0x55,0x41,0x7F,  0x71,0x77,0x41,0x7F,  
0x51,0x55,0x45,0x7F,  0x41,0x55,0x45,0x7F,  0x7D,0x7D,0x41,0x7F,  0x41,0x55,0x41,0x7F,  0x51,0x55,0x41,0x7F,
};
const PROGMEM byte lines[]={
0x7F,0x7F,0x51,0x55,0x45,0x7F,0x41,0x55,0x5D,0x7F,0x7D,0x41,0x7D,0x7F,0x7F,0x7F,0x41,0x5D,0x5D,0x7F,0x41,0x5F,0x41,0x7F,0x41,0x6D,0x53,0x7F,0x41,0x6D,0x53,0x7F,0x41,0x55,0x5D,0x7F,0x41,0x7B,0x77,0x41,0x7F,0x7D,0x41,0x7D,0x7F,0x6B,0x7F,0x7F,0x7F,0x7F,0x7F,
0x7F,0x7F,0x41,0x55,0x6B,0x7F,0x41,0x5F,0x41,0x7F,0x41,0x75,0x7D,0x7F,0x41,0x75,0x7D,0x7F,0x41,0x55,0x5D,0x7F,0x41,0x6D,0x53,0x7F,0x7F,0x7F,0x41,0x6F,0x71,0x7F,0x41,0x6D,0x41,0x7F,0x41,0x5F,0x5F,0x7F,0x41,0x5F,0x41,0x7F,0x41,0x55,0x5D,0x7F,0x6B,0x7F,0x7F,
0x7F,0x7F,0x41,0x55,0x6B,0x7F,0x41,0x5F,0x41,0x7F,0x41,0x75,0x7D,0x7F,0x41,0x75,0x7D,0x7F,0x41,0x55,0x5D,0x7F,0x41,0x6D,0x53,0x7F,0x7F,0x7F,0x7D,0x41,0x7D,0x7F,0x41,0x7F,0x41,0x7B,0x77,0x7B,0x41,0x7F,0x41,0x55,0x5D,0x7F,0x6B,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,
0x7F,0x7F,0x41,0x55,0x6B,0x7F,0x41,0x5F,0x41,0x7F,0x41,0x75,0x7D,0x7F,0x41,0x75,0x7D,0x7F,0x41,0x55,0x5D,0x7F,0x41,0x6D,0x53,0x7F,0x7F,0x7F,0x41,0x6D,0x53,0x7F,0x41,0x55,0x5D,0x7F,0x51,0x55,0x45,0x7F,0x41,0x55,0x5D,0x7F,0x7D,0x41,0x7D,0x7F,0x6B,0x7F,0x7F,
};

const PROGMEM byte no[]={
0xF9,0x09,0x09,0xC9,0x09,0xC9,0x09,0xC9,0x49,0x49,0x09,0xC9,0x49,0x49,0x09,0x09,0xF9,0x01,0x01,0x01,0xF9,0xF9,0xF9,0x39,0x79,0xF9,0x39,0xF9,0x39,0xB9,0x39,0xF9,0xF9,0xF9,
0x3F,0x20,0x20,0x25,0x25,0x27,0x20,0x27,0x25,0x24,0x20,0x25,0x25,0x27,0x20,0x20,0x3F,0x00,0x00,0x00,0x3F,0x3F,0x3F,0x38,0x3F,0x3E,0x38,0x3F,0x38,0x3B,0x38,0x3F,0x3F,0x3F,
};

#include <PCD8544.h>
#include <avr/pgmspace.h>
#include <EEPROM.h>
 
#define LCD_COMMAND 0 
#define LCD_DATA  1

#define PIN_RESET 7 //Pin 4 on LCD
#define PIN_SCE   6 //Pin 3 on LCD
#define PIN_DC    5 //Pin 5 on LCD
#define PIN_SDIN  4 //Pin 6 on LCD
#define PIN_SCLK  3 //Pin 7 on LCD
#define encoder1 2
#define encoder2 8
#define encoder3 9

#define hold 2000
#define AVinvalidate 100
#define Savetimebase 3000
#define battupdate 1000

// The dimensions of the LCD (in pixels)...
static const byte LCD_WIDTH = 84;
static const byte LCD_HEIGHT = 48;
static PCD8544 lcd;

int c;
int mode=2; //due to switch after start and e2 edge
int line=1;
volatile int encoder = 0;
boolean scr=true,inv=true,invg=true;//main edges
boolean bar=true;
boolean eoa1,eob1;
boolean e1=true,e2=true,e3=false,e4=true,e5=false,e6=true,e7=true,e8=true,e9=true,e10=true,e11=false;
// e1 - set time to switch to settings
// e2 - time less than settings to switch scr1 and scr2
// e3 - switch scr1 and scr2
// e4 - push encoder in settings
// e5 - prevent mod after scr3
// e6 - restart graph
// e7 - buffer start/continue
// e8 - start reset buffer time
// e9 - clear buffer display
// e10 - confirm yes/no
// e11 - save timebase

boolean mod,output=false;
unsigned long time,before1,before2,before3,before4,before5,before6,before7,before8,before9;
// before1 - long press to settings and back
// before2 - actual amperage invalidate
// before3 - graph add invalidate
// before4 - buffer time
// before5 - 1ms for buffer increase
// before6 - time to reset buffer
// before7 - time difference to add to buffer
// before8 - save timebase
// before9 - battery update
int values[5];
int graph[80];
int actual;
int avg[100],avgc=0;
int buf=0;
int prevmode=1;
int yesno=0;
int filter=100;
float act[100];
int cfilter=0;




void setup() {
  lcd.begin(LCD_WIDTH, LCD_HEIGHT);

  LCDWrite(LCD_COMMAND, 0x21); //Tell LCD that extended commands follow
  LCDWrite(LCD_COMMAND, 0xAA); //Set LCD Vop (Contrast): Try 0xB1(good @ 3.3V) or 0xBF if your display is too dark
  LCDWrite(LCD_COMMAND, 0x04); //Set Temp coefficent
  LCDWrite(LCD_COMMAND, 0x15); //LCD bias mode 1:48: Try 0x13 or 0x14
  LCDWrite(LCD_COMMAND, 0x20); //We must send 0x20 before modifying the display control mode
  LCDWrite(LCD_COMMAND, 0x0C); //Set display control, 0x0C normal mode. 0x0D for inverse
  pinMode(PIN_DC,OUTPUT);
  pinMode(encoder1, INPUT_PULLUP); 
  pinMode(encoder2, INPUT_PULLUP); 
  pinMode(encoder3, INPUT_PULLUP); 
  attachInterrupt(0, doEncoderA, RISING);
//attachInterrupt(1, doEncoderB, RISING);
  analogReference(DEFAULT);
  values[0]=100;
  values[1]=10;
  values[2]=100;
  values[3]=10;
  values[4]=200;
  values[5]=1;
  LoadSettings();
  encoder=values[4];
  before9=20000;//draw battery after start
  Serial.begin(115200);
}

void loop() {
  before7=time;
  time=millis();
  boolean eb=!digitalRead(encoder3);
  
  actual=abs(analogRead(A0)-515);
//  actual=0;//only for debug
  actual=map(actual,0,400,0,300);
  act[cfilter]=actual;
  actual=0;for(int i=0;i<filter;i++) { actual+=act[i];} actual=actual/filter;
  cfilter++;if(cfilter>=filter) cfilter=0;
  if(actual<0) actual=400;
  if(!output ) actual=0;
  
  if(!eb) { e1=true;e3=false;e6=true;}
  if( eb) { e2=true;e10=true;}

  if(mode==1) 
  {
    if(scr) { screen(1);scr=false;
      drawSmallNumber(45,5,values[0]/100,false);drawSmallNumber(49,5,values[0]%100/10,false);drawSmallNumber(55,5,values[0]%10,false);
      drawSmallNumber(68,5,values[1]/10 ,false);drawSmallNumber(72,5,values[1]%10,false);
      }
    if(inv) { 
      inv=false;before2=time;
      drawBigNumber(5 ,actual/100);
      drawBigNumber(23,actual%100/10);
      drawBigNumber(47,actual%10);
      if(buf>0) drawBuffer();
      Serial.println(actual);
      }
    if(time-before2>=AVinvalidate) inv=true;
  }
  if(mode==4) 
  {
    if(scr) { screen(4);scr=false;encoder=1;
      drawSmallNumber(45,5,values[0]/100,false);drawSmallNumber(49,5,values[0]%100/10,false);drawSmallNumber(55,5,values[0]%10,false);
      drawSmallNumber(68,5,values[1]/10 ,false);drawSmallNumber(72,5,values[1]%10,false);
      }
    if(inv) {
      inv=false;
      if(encoder<0) encoder=0;if(encoder>3) encoder=3;
      if(encoder<2)yesno=0;else yesno=1;
      if(yesno==0) { 
        for(int i=0;i<34;i++) { 
          gotoXY(43+i,2);LCDWrite(LCD_DATA,pgm_read_byte_near(screens+1723+i));
          gotoXY(43+i,3);LCDWrite(LCD_DATA,pgm_read_byte_near(screens+3*504+3*84+43+i));}
        }
      if(yesno==1) { 
        for(int i=0;i<34;i++) { 
          gotoXY(43+i,2);LCDWrite(LCD_DATA,pgm_read_byte_near(no+i));
          gotoXY(43+i,3);LCDWrite(LCD_DATA,pgm_read_byte_near(no+34+i));}
        }
      }
    if(!eb && e10 && (prevmode==2 || prevmode==1)) { if(yesno==0) { output=true;buf=0;}else{ output=false;} mode=1;scr=true;inv=true;e3=true;e10=false;}
    if(!eb && e10 && prevmode==3) { prevmode=1;e10=false;}
  }
  if(mode==2) 
  {
    if(encoder<20)encoder=20;if(encoder>999)encoder=999;values[4]=encoder;    
    if(scr) { screen(2);scr=false;
      drawSmallNumber(41,5,values[0]/100,false);drawSmallNumber(45,5,values[0]%100/10,false);drawSmallNumber(51,5,values[0]%10,false);
      }
    if(inv) {
      inv=false;before2=time;
      avg[avgc]=actual;avgc++;
      drawSmallNumber(2,5,values[4]/100,false);drawSmallNumber(6,5,values[4]%100/10,false);drawSmallNumber(10,5,values[4]%10,false);drawSmallNumber(14,5,0,false);
      drawSmallNumber(64,5,actual/100,false);drawSmallNumber(68,5,actual%100/10,false);drawSmallNumber(74,5,actual%10,false);
      if(buf>0) drawBuffer();
      }
    if(invg) {
      invg=false;before3=time;
      digitalWrite(12,true);
      for(int i=0;i<79;i++) { graph[i]=graph[i+1];drawColumn(2+i,graph[i]);} 
      int g=0;for(int i=0;i<avgc;i++) { g+=avg[i];};g=int(g/avgc);avgc=0;
      graph[79]=int(33*float(g)/float(values[0]));drawColumn(81,graph[79]);
      digitalWrite(12,false);
      }
    if(time-before2>=AVinvalidate) { inv=true;}
    if(time-before8>=Savetimebase && e11) { e11=false;SaveSettings();}
  }
  if(mode==3) 
  {
    if(!eb && !e4) { e4=true;if(e5)mod=!mod;e5=true;inv=true;if(!mod) encoder=line*3;else encoder=values[line-1];}
    if( eb &&  e4) { e4=false;}
    if(scr) { screen(3);scr=false;encoder=3;mod=false;
      drawSmallNumber(61,1,values[0]/100,mod);drawSmallNumber(65,1,values[0]%100/10,mod);drawSmallNumber(71,1,values[0]%10,mod);
      drawSmallNumber(65,2,values[1]/10 ,mod);drawSmallNumber(69,2,values[1]%10,mod);
      drawSmallNumber(61,3,values[2]/100,mod);drawSmallNumber(65,3,values[2]%100/10,mod);drawSmallNumber(71,3,values[2]%10,mod);
      drawSmallNumber(61,4,values[3]/100,mod);drawSmallNumber(65,4,values[3]%100/10,mod);drawSmallNumber(71,4,values[3]%10,mod);
      }
    if(inv) { 
      inv=false;before2=time;
      if(!mod) { if(encoder<3)encoder=3;if(encoder>12)encoder=12;  line=encoder/3;}
      if( mod && line==1) { if(encoder<1)encoder=1;if(encoder>300)encoder=300;values[0]=encoder;}
      if( mod && line==2) { if(encoder<0)encoder=0;if(encoder>20 )encoder=20; values[1]=encoder;}
      if( mod && line==3) { if(encoder<0)encoder=0;if(encoder>999)encoder=999;values[2]=encoder;}
      if( mod && line==4) { if(encoder<0)encoder=0;if(encoder>999)encoder=999;values[3]=encoder;}
      if(line==1) drawLine(1,!mod,mod);else drawLine(1,false,mod);
      if(line==2) drawLine(2,!mod,mod);else drawLine(2,false,mod);
      if(line==3) drawLine(3,!mod,mod);else drawLine(3,false,mod);
      if(line==4) drawLine(4,!mod,mod);else drawLine(4,false,mod);
      if(line==1) { drawSmallNumber(61,1,values[0]/100,mod);drawSmallNumber(65,1,values[0]%100/10,mod);drawSmallNumber(71,1,values[0]%10,mod);}
      if(line==2) { drawSmallNumber(65,2,values[1]/10 ,mod);drawSmallNumber(69,2,values[1]%10,mod);}
      if(line==3) { drawSmallNumber(61,3,values[2]/100,mod);drawSmallNumber(65,3,values[2]%100/10,mod);drawSmallNumber(71,3,values[2]%10,mod);}
      if(line==4) { drawSmallNumber(61,4,values[3]/100,mod);drawSmallNumber(65,4,values[3]%100/10,mod);drawSmallNumber(71,4,values[3]%10,mod);}
      drawSmallNumber(63,5,actual/100,false);drawSmallNumber(67,5,actual%100/10,false);drawSmallNumber(73,5,actual%10,false);
      if(buf>0) drawBuffer();
    }
    if(time-before2>=AVinvalidate) inv=true;
  }
  
  if( eb && e1) { e1=false;before1=time;}
  if(!eb && time-before1< hold && e2) {
    e2=false;
    if(mode==1 && !e3) { mode=2;scr=true;inv=true;e3=true;encoder=values[4];for(int i=0;i<80;i++) { graph[i]=0;}}
    if(mode==2 && !e3) { if(output) { mode=1;}else{ prevmode=2;mode=4;} e10=false;scr=true;inv=true;e3=true;}
  }
  if( eb && time-before1>=hold && !e3) {
    if(mode==1) { mode=3;scr=true;inv=true;e3=true;line=1;e5=false;encoder=1;}
    if(mode==2 &&  e6) { inv=true;e6=false;bar=!bar;SaveSettings();}
    if(mode==3 && !e3) { if(output) { mode=1;} else{ mode=4;prevmode=3;} scr=true;inv=true;e3=true;mod=false;SaveSettings();}
  }
  if(time-before3>=values[4]*10 && output) { invg=true;}
  if(time-before9>=battupdate) { before9=time;drawBattery();}

  if(actual>=values[0] && actual<int(float(values[0])+(float(values[0])*float(values[1])/100.0))) { 
    e8=true;e9=true;
    if(e7) { e7=false;before4=time;}
    if(time-before5>=1) { buf+=time-before7;before5=time;}
    }
  if(actual<values[0]) { e7=true;if(e8) { e8=false;before6=time;}if(time-before6>=values[3]*100) { if(e9) { buf=0;drawBuffer();e9=false;}}}
  if(buf>=values[2]*100 || actual>=int(float(values[0])+(float(values[0])*float(values[1])/100.0))) { 
    if(mode==1) { mode=4;prevmode=1;scr=true;inv=true;}
    output=false;e10=false;
    if(e9) { buf=0;drawBuffer();e9=false;}}
  
  digitalWrite(13,output);
}

void LoadSettings()
{
  for(int i=0;i<5;i++) { values[i]=EEPROMreadlong(i);}
  if(EEPROMreadlong(5)==1) bar=true;else bar=false;
}
void SaveSettings()
{
  for(int i=0;i<5;i++) { EEPROMwritelong(i,values[i]);}
  if(bar) EEPROMwritelong(5,1);else EEPROMwritelong(5,0);
//  digitalWrite(11,true);delay(100);digitalWrite(11,false);
}
void EEPROMwritelong(int address, long value)
{
  byte four  = (value & 0xFF);
  byte three = ((value >> 8) & 0xFF);
  byte two   = ((value >> 16) & 0xFF);
  byte one   = ((value >> 24) & 0xFF);
  EEPROM.write(4*address, four);
  EEPROM.write(4*address + 1, three);
  EEPROM.write(4*address + 2, two);
  EEPROM.write(4*address + 3, one);
}
long EEPROMreadlong(long address)
{
  long four  = EEPROM.read(4*address);
  long three = EEPROM.read(4*address + 1);
  long two   = EEPROM.read(4*address + 2);
  long one   = EEPROM.read(4*address + 3);
  return ((four << 0) & 0xFF) + ((three << 8) & 0xFFFF) + ((two << 16) & 0xFFFFFF) + ((one << 24) & 0xFFFFFFFF);
}



void LCDWrite(byte data_or_command, byte data) {
  digitalWrite(PIN_DC, data_or_command); //Tell the LCD that we are writing either to data or a command
  //Send the data
  digitalWrite(PIN_SCE, LOW);
  shiftOut(PIN_SDIN, PIN_SCLK, MSBFIRST, data);
  digitalWrite(PIN_SCE, HIGH);
}
void gotoXY(int x, int y) {
  LCDWrite(0, 0x80 | x);  // Column.
  LCDWrite(0, 0x40 | y);  // Row.  ?
}





void doEncoderA(){
  boolean cont=true;
  boolean d1=digitalRead(encoder1);
  boolean d2=digitalRead(encoder2);
  if (d1) { if (d2) { if(cont) { encoder-=1;inv=true;cont=false;}} else { if(cont) { encoder+=1;inv=true;cont=false;}}}
  if(mode==2) { before8=time;e11=true;}
}
//void doEncoderB(){
//  boolean cont=true;
//  boolean d1=digitalRead(encoder1);
//  boolean d2=digitalRead(encoder2);
//  if (d2) { if (d1) { if(cont) { encoder+=1;inv=true;cont=false;}} else { if(cont) { encoder-=1;inv=true;cont=false;}}}
//} 





void screen(int scr) {
  gotoXY(0,0);scr-=1;
  for(int i=0;i<504;i++) { LCDWrite(LCD_DATA,pgm_read_byte_near(screens+i+(504*scr)));}
}  

void drawBigNumber(int pos, int num)
{
  for(int j=0;j<3;j++) { gotoXY(pos,j+1);
    for(int i=0;i<16;i++) {
    LCDWrite(LCD_DATA,pgm_read_byte_near(numbers+i+(j*16)+(48*num)));
  }}
}
void drawSmallNumber(int posX,int posY,byte number,boolean inversion)
{
  byte a;
  gotoXY(posX,posY);
  if(inversion==false) { for (int i=0;i<4;i++) { a=pgm_read_byte_near(smallNumbers+number*4+i   );if(posY>3) a=a+128;LCDWrite(LCD_DATA,a);}}
  if(inversion==true ) { for (int i=0;i<4;i++) { a=pgm_read_byte_near(smallNumbers+number*4+i+40);if(posY>3) a=a+128;LCDWrite(LCD_DATA,a);}}
}
void drawLine(byte number,boolean inversion,boolean edit)
{
  gotoXY(2,number);number-=1;
  for(int i=0;i<51;i++) { if(inversion) LCDWrite(LCD_DATA,pgm_read_byte_near(lines+number*51+i));
    else LCDWrite(LCD_DATA,pgm_read_byte_near(screens+1094+number*84+i));}
  if(edit) { 
    if(line==1 || line==3) { gotoXY(59,line);LCDWrite(LCD_DATA,127);LCDWrite(LCD_DATA,127);gotoXY(69,line);LCDWrite(LCD_DATA,95);LCDWrite(LCD_DATA,127);gotoXY(75,line);LCDWrite(LCD_DATA,127);LCDWrite(LCD_DATA,127);}
    if(line==4) { gotoXY(59,line);LCDWrite(LCD_DATA,127);LCDWrite(LCD_DATA,127);gotoXY(69,line);LCDWrite(LCD_DATA,223);LCDWrite(LCD_DATA,255);gotoXY(75,line);LCDWrite(LCD_DATA,255);LCDWrite(LCD_DATA,255);}
    if(line==1) { LCDWrite(LCD_DATA,B01000001);LCDWrite(LCD_DATA,B01101101);LCDWrite(LCD_DATA,B01000001);LCDWrite(LCD_DATA,127);LCDWrite(LCD_DATA,127);}
    if(line==2) { gotoXY(63,line);LCDWrite(LCD_DATA,127);LCDWrite(LCD_DATA,127);gotoXY(73,line);LCDWrite(LCD_DATA,127);LCDWrite(LCD_DATA,127);LCDWrite(LCD_DATA,B01011001);LCDWrite(LCD_DATA,B01101001);LCDWrite(LCD_DATA,B01110111);LCDWrite(LCD_DATA,B01001011);LCDWrite(LCD_DATA,B01001101);LCDWrite(LCD_DATA,127);LCDWrite(LCD_DATA,127);}
    if(line==3) { LCDWrite(LCD_DATA,B01011011);LCDWrite(LCD_DATA,B01010101);LCDWrite(LCD_DATA,B01101101);LCDWrite(LCD_DATA,127);LCDWrite(LCD_DATA,127);}
    if(line==4) { LCDWrite(LCD_DATA,B11011011);LCDWrite(LCD_DATA,B11010101);LCDWrite(LCD_DATA,B11101101);LCDWrite(LCD_DATA,255);LCDWrite(LCD_DATA,255);}
  } 
  else {
    if(line==1 || line==3) { gotoXY(59,line);LCDWrite(LCD_DATA,0);LCDWrite(LCD_DATA,0);gotoXY(69,line);LCDWrite(LCD_DATA,32);LCDWrite(LCD_DATA,0);gotoXY(75,line);LCDWrite(LCD_DATA,0);LCDWrite(LCD_DATA,0);}
    if(line==4) { gotoXY(59,line);LCDWrite(LCD_DATA,0);LCDWrite(LCD_DATA,0);gotoXY(69,line);LCDWrite(LCD_DATA,160);LCDWrite(LCD_DATA,128);gotoXY(75,line);LCDWrite(LCD_DATA,128);LCDWrite(LCD_DATA,128);}
    if(line==1) { LCDWrite(LCD_DATA,B00111110);LCDWrite(LCD_DATA,B00010010);LCDWrite(LCD_DATA,B00111110);LCDWrite(LCD_DATA,0);LCDWrite(LCD_DATA,0);}
    if(line==2) { gotoXY(63,line);LCDWrite(LCD_DATA,0);LCDWrite(LCD_DATA,0);gotoXY(73,line);LCDWrite(LCD_DATA,0);LCDWrite(LCD_DATA,0);LCDWrite(LCD_DATA,B00100110);LCDWrite(LCD_DATA,B00010110);LCDWrite(LCD_DATA,B00001000);LCDWrite(LCD_DATA,B00110100);LCDWrite(LCD_DATA,B00110010);LCDWrite(LCD_DATA,0);LCDWrite(LCD_DATA,0);}
    if(line==3) { LCDWrite(LCD_DATA,B00100100);LCDWrite(LCD_DATA,B00101010);LCDWrite(LCD_DATA,B00010010);LCDWrite(LCD_DATA,0);LCDWrite(LCD_DATA,0);}
    if(line==4) { LCDWrite(LCD_DATA,B10100100);LCDWrite(LCD_DATA,B10101010);LCDWrite(LCD_DATA,B10010010);LCDWrite(LCD_DATA,128);LCDWrite(LCD_DATA,128);}
  } 
}
void drawColumn(int pos,int height)
{
  byte bin[33];
  if( bar) { for(int i=0;i<33;i++) { if(i< height )bin[i]=1;else bin[i]=0;}}
  if(!bar) { for(int i=0;i<33;i++) { if(i==height-1)bin[i]=1;else bin[i]=0;}}
  gotoXY(pos,4);LCDWrite(LCD_DATA,128+32*bin[0]+16*bin[1]+8*bin[2]+4*bin[3]+2*bin[4]+bin[5]);  
  gotoXY(pos,3);LCDWrite(LCD_DATA,128*bin[6 ]+64*bin[7 ]+32*bin[8 ]+16*bin[9 ]+8*bin[10]+4*bin[11]+2*bin[12]+bin[13]);  
  gotoXY(pos,2);LCDWrite(LCD_DATA,128*bin[14]+64*bin[15]+32*bin[16]+16*bin[17]+8*bin[18]+4*bin[19]+2*bin[20]+bin[21]);  
  if(pos< 10) { gotoXY(pos,1);LCDWrite(LCD_DATA,128*bin[22]+64*bin[23]+32*bin[24]+16*bin[25]+8*bin[26]+4*bin[27]+pgm_read_byte_near(screens+588+pos));}
  if(pos==10) { gotoXY(pos,1);LCDWrite(LCD_DATA,128*bin[22]+64*bin[23]+32*bin[24]+16*bin[25]+8*bin[26]+4*bin[27]+2*bin[28]+pgm_read_byte_near(screens+588+pos));}
  if(pos> 10) { gotoXY(pos,1);LCDWrite(LCD_DATA,128*bin[22]+64*bin[23]+32*bin[24]+16*bin[25]+8*bin[26]+4*bin[27]+2*bin[28]+bin[29]);}
  if(pos> 10) { gotoXY(pos,0);LCDWrite(LCD_DATA,128*bin[30]+64*bin[31]+32*bin[32]+pgm_read_byte_near(screens+504+pos));  }
}
void drawBuffer()
{
  int a,dc;
  byte bin[3];
  if(mode==1) a=82;
  if(mode==2) a=23;
  if(mode==3) a=33;
  int b=int(a*float(buf)/float(values[2]*100));
  if(mode==1) { gotoXY(1 ,4);if(buf>0) { for(int i=0;i<b+1;i++) { dc=0;if(i==41 || i==42) dc=1;LCDWrite(LCD_DATA,240+dc);}}else { for(int i=0;i<a;i++) { dc=0;if(i==41 || i==42) dc=1;LCDWrite(LCD_DATA,144+dc);}}}
  if(mode==3) { gotoXY(25,5);if(buf>0) { for(int i=0;i<b+1;i++) { LCDWrite(LCD_DATA,191);}}else { for(int i=0;i<a;i++) { LCDWrite(LCD_DATA,161);}}}
  if(mode==2) { 
    gotoXY(51,0);
    if(buf>0) { 
      for(int i=0;i<b+1;i++) { 
        if( bar) { for(int j=0;j<3;j++) { if(j+30< graph[49+i]  )bin[j]=1;else bin[j]=0;}}
        if(!bar) { for(int j=0;j<3;j++) { if(j+30==graph[49+i]-1)bin[j]=1;else bin[j]=0;}}
        LCDWrite(LCD_DATA,128*bin[0]+64*bin[1]+32*bin[2]+11);
        }}else { 
      for(int i=0;i<a;i++) { 
        if( bar) { for(int j=0;j<3;j++) { if(j+30< graph[49+i]  )bin[j]=1;else bin[j]=0;}}
        if(!bar) { for(int j=0;j<3;j++) { if(j+30==graph[49+i]-1)bin[j]=1;else bin[j]=0;}}
        LCDWrite(LCD_DATA,128*bin[0]+64*bin[1]+32*bin[2]+8);
        }
      }
    }
}
void drawBattery()
{
  
  int bat=map(analogRead(A1),750,850,0,100);if(bat<0)bat=0;if(bat>100)bat=100;
//  Serial.println(analogRead(A1));

  int a;
  if(mode==1 || mode==4) a=28;
  if(mode==2) a=6;
  if(mode==3) a=15;
  int b=int(a*float(bat)/float(100));

  if(mode==1 || mode==4) 
  {
    gotoXY(3 ,5);
    for(int i=0;i<b;i++) { LCDWrite(LCD_DATA,190);}
    for(int i=b;i<a;i++) { LCDWrite(LCD_DATA,162);}
  }
  if(mode==2) 
  {
    gotoXY(3 ,0);
    for(int i=0;i<b;i++) { LCDWrite(LCD_DATA,234);}
    for(int i=b;i<a;i++) { LCDWrite(LCD_DATA,42 );}
  }
  if(mode==3) 
  {
    gotoXY(5 ,5);
    for(int i=0;i<b;i++) { LCDWrite(LCD_DATA,191);}
    for(int i=b;i<a;i++) { LCDWrite(LCD_DATA,161);}
  }
  
}
0

Napísať odpoveď
  • Podobné témy
    Odpovedí
    Zobrazení
    Posledný príspevok