Alun perin ajatus oli tehdä tämä
juttu vain omaan tarpeeseen, eikä laittaa tänne blogiin. Toisaalta
tässä sovelluksessa olen tehnyt jonkin kohdan jälleen hiukan
toisella lailla, joten muutin mieleni. Ehkäpä tuosta ratkaisusta
voisi olla oivallusta jonkun omaan projektiinsa.
Tämän ohjaimen tehtävänä on valvoa
ja estää akkujen ylilataus. Minulla on mökillä kaksi akku- ja
paneeliryhmää. Toinen on tuvan alla ja toinen aitan alla. Näillä
molemmilla on omat kaupalliset säätäjänsä, mutta akut on
yhdistetty kaapelilla. Jostain syystä, en tiedä mistä johtuu, nämä
säätimet eivät oikein pelaa yhteen. Kun etelän puolen paneelit
tuottavat voimakkaasti sähköä (ja idän puolen jo vähemmän),
nousee aitan alla olevien akkujen jännite useita voltteja yli 14
voltin. Tämä tilanne ennen pitkää pilaa akut.
Tällä hetkellä siinä on käsikytkin,
joten joudun valvomaan tilannetta päivän mittaan ja kytkemään
idän puolen paneelit irti. Tämä toteutus tekee sen
automaattisesti. Akkujen jännitteen noustessa yli 14,2 V,
kytkeytyvät paneelit irti. Ne kytketään uudestaan säätimeen, kun
akkujen jännite laskee alle 12,5 V.
![]() |
Kuva1. Kolme eri
tilannetta: käsi / automaatilla: paneeli kytkettynä / paneeli irti.
|
Tässäkin on siis käsikytkin, millä
paneelit saa irti. Kun laite kytketään automaatille, eli käännetään
kytkintä JA akkujen jännite on noiden rajojen välissä, ei laite
toimi ennen kuin jompikumpi rajoista ohitetaan.
Tämän tilanteen olen toteuttanut
tavallisesti kahden askeleen sekvenssillä. Siinä on helppo
toteuttaa myös viive, millä eliminoidaan kosketinvärähtely.
Tässä toteutuksessa käsi-
automaattikytkin ei ohjaa Arduinoa, vaan kytkee akkujännitteen
releelle. Releen syöttöpisteestä maahan on vastuksen ja zenerin
(4,7 V) sarjakytkentä, joiden väli on kytketty Arduinon tuloon
(D5). Kun jännite on ylhäällä, on digitaalitulo ykkönen (1) ja
ohjelma siirtyy automaatille.
![]() |
Kuva 2. Aika tiukka
hässäkkä.
|
Tämän muutoksen tunnistus,
käsikäytöltä automaatille saa tapahtua vain kerran (0 → 1). Eli
ohjaus saa tapahtua vain sillä ohjelmakierroksella, kun muutos
havaitaan. Yleisesti käytetään termiä Difu = Differential Up.
Tähän tarvitaan tilatieto käsiasennosta (Bol_EdelTila),
mikä on epätosi (0) aina kun, kytkin on käsiasennossa. Kun kytkin
käännetään automaattiasentoon, tunnistetaan ristiriita
(Automaatti == tosi(1) JA vanha tieto == epätosi (0)), joten tällä
ohjelmakierroksella päivitetään LEDit ja rele siihen tilaan, mitä
akkujännite edellyttää. Heti tuon suorituksen jälkeen vanha tieto
ladataan todeksi, joten tuo ehto ei toteudu seuraavilla
ohjelmakierroksilla. Tässä oleellista on ohjelmarivien järjestys,
eli suoritusjärjestys. Kun kytkin käännetään käsiasentoon,
palautetaan vanha tieto epätositilaan.
Tässä
tapauksessa ei viivettä tarvitse, koska kytkimen kosketin ei ole
suoraan Arduinon tulossa. Jos silti ilmenee jotain epämääräisyyttä,
niin voi zenerin rinnalle kytkeä pienen kondensaattorin.
Toteutin tämän projektin Arduino
LEONARDO:lla pelkästään siitä syystä, että niitä oli jäänyt
roikkumaan. Tosin sanoen halusin päästä tuosta tyypistä eroon. Se
on huomattavasti herkempi vioittumaan kuin UNO. Minulla oli pari
sellaista Leonardoa, jotka olivat ilman liittimiä. Ne olivat
ainoita, jotka mahtuivat tuohon pieneen purkkiin, mutta molemmat
olivat jo rikki. Jouduin irrottamaan yhdestä kaikki liittimet.
Onneksi noita Leonardoja on enää yksi jäljellä. Ehkä sillekin
jokin käyttö löytyy. Sen etuna on se, että sen omakäyttö vie
vähemmän virtaa kuin UNO, mutta on myös paljon herkempi
sähläyksille.
Varsinainen sotkuhan tuosta rakenteesta
jälleen tuli, mutta onneksi se on pimennossa kotelon sisällä.
![]() |
Kuva 3. Kytkennän
oleelisimmat osat.
|
OHJELMA 59
/***************************************
* Ohjelman nimi:
AkkuSuoja_v3
* 05.05.2020
* Mökille aitan
akkujen suojaksi.
* Jos akkujen
jännite nousee yli 14,2 V,
* kytketään
rannan puoleiset paneelit irti.
* Palautus, kun
jännite laskee alle 12,5 V.
* Laitteessa on
myös käsikytkin.
* Analogia
mttausalue 0 .. 17.0 V
**************************************/
// MÄÄRITTELYT:
// Liityntöjen
määrittelyt
const
int Con_LED_Kasi = 2;
const
int Con_LED_Autom = 3;
const
int Con_LED_Paalla = 4;
const
int Con_LED_Pois = 6;
const
int Con_Autom = 5;
boolean
Bol_Automaatilla = false;
boolean
Bol_EdelTila = false;
const
int Con_Rele = 7;
const
int Con_Ana_Tulo = 0;
int
Int_Ana_Raaka = 0;
// Ohjauksen
aliohjelma
void
Fun_Ohjaus(int p1,int
p2,int p3,int
p4,int p5){
digitalWrite(Con_LED_Kasi, p1);
digitalWrite(Con_LED_Paalla, p2);
digitalWrite(Con_LED_Autom, p3);
digitalWrite(Con_LED_Pois, p4);
digitalWrite(Con_Rele, p5);
}// loppu
// ASETUKSET:
void
setup(){
Serial.begin(9600);
pinMode(Con_LED_Kasi, OUTPUT);
pinMode(Con_LED_Paalla, OUTPUT);
pinMode(Con_LED_Autom, OUTPUT);
pinMode(Con_LED_Pois, OUTPUT);
pinMode(Con_Rele, OUTPUT);
pinMode(Con_Autom, INPUT);
}// Asetuksen
loppu
// PÄÄLOOPPI
void
loop(){
//
Mittaukset ja siirtyminen Käsi -> Automaatti
Bol_Automaatilla =
digitalRead(Con_Autom);
if(Bol_Automaatilla
== false){ Bol_EdelTila = false;}
if(Bol_Automaatilla
== true &&
Bol_EdelTila == false){
Fun_Ohjaus(0,1,1,0,1);
Bol_EdelTila =
true;}
Int_Ana_Raaka =
analogRead(Con_Ana_Tulo);
// Tilaohjaukset
if(Bol_Automaatilla == false){
Fun_Ohjaus(1,0,0,0,0);}
if(Bol_Automaatilla == true
&& Int_Ana_Raaka < 752 ){
Fun_Ohjaus(0,1,1,0,1);}
if(Bol_Automaatilla == true
&& Int_Ana_Raaka > 854 ){
Fun_Ohjaus(0,0,1,1,0);}
delay(1);
} // Pääohjelma
LOPPU
Ei kommentteja:
Lähetä kommentti