perjantai 8. toukokuuta 2020

LATAUSVAHTI 59

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