Ukladani prebytku "Drama"

Automatizace, řízení, měření, logování a programování s využitím platformy Arduino.
Uživatelský avatar
peater
Příspěvky: 249
Registrován: pát bře 20, 2015 9:25 pm
Reputace: 14

Re: Ukladani prebytku "Drama"

Příspěvek od peater »

kodl69 píše:Takže to nemáš podle toho schématu co uvádíš, ale máš display shield. Je potřeba správně definovat piny u LiquidCrystal lcd(8, 9, 4, 5, 6, 7); a vyzkoušet na základním příkladu co je v ide "hello word" pokud se tohle zobrazí, je to ok. Ještě pozor na trimr konrastu, pro začátek ho nastav aby trochu byly vidět všechny body pořád, možná máš jenom kontrast "mimo rozsah".

No po pravdě, dneska jsem zprovoznoval arduino poprvé. Tak v tom lítám.
Takto je nastavené:

//knihovny
#include <LiquidCrystal.h> // include LCD library
/*--------------------------------------------------------------------------------------
Defines
--------------------------------------------------------------------------------------*/
// Pins in use
#define BUTTON_ADC_PIN A0 // A0 is the button ADC input
// ADC readings expected for the 5 buttons on the ADC input
#define RIGHT_10BIT_ADC 0 // right
#define UP_10BIT_ADC 135 // up
#define DOWN_10BIT_ADC 309 // down
#define LEFT_10BIT_ADC 484 // left
#define SELECT_10BIT_ADC 727 // right
#define BUTTONHYSTERESIS 10 // hysteresis for valid button sensing window
//return values for ReadButtons()
#define BUTTON_NONE 0 //
#define BUTTON_RIGHT 1 //
#define BUTTON_UP 2 //
#define BUTTON_DOWN 3 //
#define BUTTON_LEFT 4 //
#define BUTTON_SELECT 5 //
/*--------------------------------------------------------------------------------------
Variables
--------------------------------------------------------------------------------------*/
byte buttonJustPressed = false; //this will be true after a ReadButtons() call if triggered
byte buttonJustReleased = false; //this will be true after a ReadButtons() call if triggered
byte buttonWas = BUTTON_NONE; //used by ReadButtons() for detection of button events
/*--------------------------------------------------------------------------------------
Init the LCD library with the LCD pins to be used
--------------------------------------------------------------------------------------*/
LiquidCrystal lcd( 8, 9, 4, 5, 6, 7 ); //Pins for the freetronics 16x2 LCD shield. LCD: ( RS, E, LCD-D4, LCD-D5, LCD-D6, LCD-D7 )

int analogPin = 3; // pin na kterem merime napeti na baterii
float targetVoltage = 28.8; // hodnota ciloveho napeti
float minVoltage = 28 ; // minimalni hodnota napeti, pri kterem se vypina PWM
float VoltageStep = 0.1;//skok pro zmenu napeti
float analogVoltage = 0; // hodnota na pinu analogPin
int pwmPin = 13; // pin na kterem vyrabime PWM signal

float analogOffset = 18.05;//zacatek rozsahu - posunute zenerkou
float analogRange = 14.1;//mereny rozsah (m)

float diffMax = 0.7; // maximalni odchylka od ciloveho napeti
byte pwmDuty = 0; // kolik % PWM cyklu bude rele zapnuto
byte pwmStepUp = 2; // minimalni zmena skoku PWM nahoru
byte pwmStepDown = 4; // minimalni zmena skoku PWM dolu
int pwmMax = 100; // maximalni povoleny vykon v %
int pwmFreq = 50; // frekvence PWM - maximalne 100Hz!
int pwmCycle = 1; // cas v sekundach mezi zmenou PWM duty
int sumTime = 0; // celkova delka PWM cyklu v ms
int pwmLength = 0; // delka jednoho cyklu v milisekundach
int tempDelay = 5;//kolik cyklu se nevycita teplota (zdrzuje)
int loadPower = 700; // vykon zateze W pro vypocet akumulovane energie ve Wh
float loadTime;//prubezne nacitani casu ON v milisekundach pro zobrazeni Wh
int j;//pomocna promena pro pocitani cyklu
int k; //pro teplotu, neumim zaokrouhleni jinak

// funkce se provede po startu
void setup() {
lcd.begin(16, 2);
//button adc input
pinMode( BUTTON_ADC_PIN, INPUT ); //ensure A0 is an input
digitalWrite( BUTTON_ADC_PIN, LOW ); //ensure pullup is off on A0

// nastaveni digitalniho pinu jako vystup
pinMode(pwmPin, OUTPUT);
}

/*--------------------------------------------------------------------------------------
ReadButtons()
Detect the button pressed and return the value
Uses global values buttonWas, buttonJustPressed, buttonJustReleased.
--------------------------------------------------------------------------------------*/
byte ReadButtons()
{
unsigned int buttonVoltage;
byte button = BUTTON_NONE; // return no button pressed if the below checks don't write to btn

//read the button ADC pin voltage
buttonVoltage = analogRead( BUTTON_ADC_PIN );
//sense if the voltage falls within valid voltage windows
if( buttonVoltage < ( RIGHT_10BIT_ADC + BUTTONHYSTERESIS ) )
{
button = BUTTON_RIGHT;
}
else if( buttonVoltage >= ( UP_10BIT_ADC - BUTTONHYSTERESIS )
&& buttonVoltage <= ( UP_10BIT_ADC + BUTTONHYSTERESIS ) )
{
button = BUTTON_UP;
}
else if( buttonVoltage >= ( DOWN_10BIT_ADC - BUTTONHYSTERESIS )
&& buttonVoltage <= ( DOWN_10BIT_ADC + BUTTONHYSTERESIS ) )
{
button = BUTTON_DOWN;
}
else if( buttonVoltage >= ( LEFT_10BIT_ADC - BUTTONHYSTERESIS )
&& buttonVoltage <= ( LEFT_10BIT_ADC + BUTTONHYSTERESIS ) )
{
button = BUTTON_LEFT;
}
else if( buttonVoltage >= ( SELECT_10BIT_ADC - BUTTONHYSTERESIS )
&& buttonVoltage <= ( SELECT_10BIT_ADC + BUTTONHYSTERESIS ) )
{
button = BUTTON_SELECT;
}
//handle button flags for just pressed and just released events
if( ( buttonWas == BUTTON_NONE ) && ( button != BUTTON_NONE ) )
{
//the button was just pressed, set buttonJustPressed, this can optionally be used to trigger a once-off action for a button press event
//it's the duty of the receiver to clear these flags if it wants to detect a new button change event
buttonJustPressed = true;
buttonJustReleased = false;
}
if( ( buttonWas != BUTTON_NONE ) && ( button == BUTTON_NONE ) )
{
buttonJustPressed = false;
buttonJustReleased = true;
}

//save the latest button value, for change event detection next time round
buttonWas = button;

return( button );
}

void loop() {
//zmena ciloveho napeti tlacitky
{
byte button;
byte timestamp;

//get the latest button pressed, also the buttonJustPressed, buttonJustReleased flags
button = ReadButtons();

switch( button )
{case BUTTON_NONE:
{break;}

case BUTTON_RIGHT:
{
minVoltage +=VoltageStep;
break;
}
case BUTTON_LEFT:
{
minVoltage -= VoltageStep;
break;
}
case BUTTON_UP:
{
targetVoltage += VoltageStep;
break;
}
case BUTTON_DOWN:
{
targetVoltage -= VoltageStep;
break;
}
case BUTTON_SELECT:
{

break;
}
}

// nacteme aktualni napeti (poradi clenu dela bordel, asi pocita na malo desetinych mist?)
analogVoltage= (analogRead(analogPin) * analogRange)/1024+analogOffset;
// pokud je rozdil napeti skutecneho a ciloveho
// ve stanovene mezi, zvysime vykon, jinak snizujeme
if (targetVoltage - analogVoltage < diffMax)
{
if (pwmDuty+pwmStepUp > pwmMax)
{
pwmDuty=pwmMax;
}
else
{
pwmDuty=pwmDuty+pwmStepUp;
}
}
else
{
if (pwmDuty-pwmStepDown < 0)
{
pwmDuty=0;
}
else
{
pwmDuty=pwmDuty-pwmStepDown;
}
}
// skokove stazeni vykonu, pokud dojde k poklesu napeti
if ( analogVoltage < minVoltage)
{
pwmDuty=0;
}

lcd.setCursor(0, 0);
lcd.print("Ak");
if(analogVoltage > analogOffset + 0.1){
lcd.print(analogVoltage, 1);
}
else{
lcd.print("--.-");
}
lcd.print("V");

lcd.setCursor(8, 0);
lcd.print("ON:");
lcd.print(targetVoltage, 1);
lcd.print("V");

lcd.setCursor(0, 1);
lcd.print("Pow:");
lcd.print(pwmDuty);
lcd.print("%");

lcd.setCursor(8, 1);
lcd.print("Wh:");

//bez pouziti promene typu int a pretypovani primo ve vysledku obcas lezly zaporne hodnoty ??
k = ( loadTime / 1000 * loadPower / 3600);
lcd.setCursor(11, 1);
lcd.print(k);
//loadTime=0;

//cteni teploty jednou za deset cyklu (zdrzuje)
j++;
if(j==tempDelay){
j=0;
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(0, 2);
lcd.print("T1:");
//lcd.setCursor(3, 2);
lcd.print((char)223);

lcd.setCursor(8, 2);
lcd.print("T2:");
//lcd.setCursor(13, 2);
lcd.print((char)223);

lcd.setCursor(8, 0);
lcd.print("OF:");
lcd.print(minVoltage, 1);
lcd.print("V");

}
// Vlastni PWM cyklus
sumTime = 0;
pwmLength = 1000 / pwmFreq;


while ( sumTime < pwmCycle * 1000)
{
if(pwmDuty == 100){
digitalWrite(pwmPin, HIGH);
sumTime=pwmCycle * 1000;
loadTime +=pwmCycle * 1000;
delay(pwmCycle * 1000);
}
else if (pwmDuty > 0)
{
sumTime=sumTime+pwmLength+pwmLength*(100-pwmDuty)/pwmDuty;
digitalWrite(pwmPin, HIGH);
loadTime +=pwmLength;
delay(pwmLength);
digitalWrite(pwmPin, LOW);
delay(pwmLength*(100-pwmDuty)/pwmDuty);
}
else
{
digitalWrite(pwmPin, LOW);
sumTime=pwmCycle * 1000;
delay(pwmCycle * 1000);

}
}
}
}
9000Wp, 48v, 2x Pip-5048 MK paralelně, Li-ion 470Ah, ICC monitoring, GreenBonO vytěžovač
https://pvoutput.org/list.jsp?userid=50768
kodl69
Příspěvky: 7367
Registrován: sob črc 19, 2014 8:56 pm
Reputace: 865
Lokalita: severně od Brna
Systémové napětí: 48V
Výkon panelů [Wp]: 8kWp
Kapacita baterie [kWh]: 12kWh
Chci prodávat energii: NE
Chci/Mám dotaci: NE

Re: Ukladani prebytku "Drama"

Příspěvek od kodl69 »

a na tom displeji není nic, nebo jak? tady to vypadá ok. jak píšu, zkus příklady, liquid crystal, hello word a tam opravit definici pinů viz výše. pokud to bude něco ukazovat, je displej ok a řešíš další věci. takovej kilometr kódu že by fungoval hned a dobře je těžko uvěřit.
ostrov skoro 8kWp neustále ve stádiu zrodu: smartshunt(ex WBJR), MPPT150/45, MPPT 250/100(ex midnitesolar 150 clasic lite), 16S a různě P cca 340Ah Winston, MP II 5000,( ex Powerjack 8kW, ex samodomo cca 4kW). 48V DC rozvody a spotřebiče.
Uživatelský avatar
peater
Příspěvky: 249
Registrován: pát bře 20, 2015 9:25 pm
Reputace: 14

Re: Ukladani prebytku "Drama"

Příspěvek od peater »

Špatně jsem se vyjádřil, display zobrazuje všechno v pořádku. Spínání přebytků, napětí baterie, min. max. nastavení napětí. Jedině co nechce zobrazit je teplota vody. Zobrazí se pouze T1° ale chybí hodnota.
9000Wp, 48v, 2x Pip-5048 MK paralelně, Li-ion 470Ah, ICC monitoring, GreenBonO vytěžovač
https://pvoutput.org/list.jsp?userid=50768
kodl69
Příspěvky: 7367
Registrován: sob črc 19, 2014 8:56 pm
Reputace: 865
Lokalita: severně od Brna
Systémové napětí: 48V
Výkon panelů [Wp]: 8kWp
Kapacita baterie [kWh]: 12kWh
Chci prodávat energii: NE
Chci/Mám dotaci: NE

Re: Ukladani prebytku "Drama"

Příspěvek od kodl69 »

a jak by se ti to mohlo zobrazit, když to v tom programu není :-) se podívej co tam máš napsaný:
cd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(0, 2);
lcd.print("T1:");
//lcd.setCursor(3, 2);
lcd.print((char)223);
a kde je ta proměnná co se má zobrazit? asi to bylo na tom řádku cos smazal a je prázdnej, třeba něco jako lcd.print(teplota1); a kde se ta teplota naměří, to je mi taky tajemstvím.
ostrov skoro 8kWp neustále ve stádiu zrodu: smartshunt(ex WBJR), MPPT150/45, MPPT 250/100(ex midnitesolar 150 clasic lite), 16S a různě P cca 340Ah Winston, MP II 5000,( ex Powerjack 8kW, ex samodomo cca 4kW). 48V DC rozvody a spotřebiče.
lopoko1

Re: Ukladani prebytku "Drama"

Příspěvek od lopoko1 »

Ahojte. našiel som si toto staršie téma a momentálne pre mna moc dobré Ďakujem všetkým za príspevky.
Už na základe kodu od peater sa mi podarilo rozjazdiť aruduino len mám otázku aké odpory použiť pre meranie 48V systému? prípadne ako to zapojiť?
Skúšal niekto namiesto tlačidiel použiť matrix klavesnicu?
Výstup PWM13 mi príde že je nastavený na frekvenciu 50Hz. čo môžem na výstupe použiť ako spínač(Tyristor) prípadne máte nejaké zapojenie?
mpro
Příspěvky: 41
Registrován: úte kvě 31, 2016 2:11 pm
Reputace: 1
Lokalita: Jižní morava
Výkon panelů [Wp]: 1000/nové 4100
Kapacita baterie [kWh]: 3
Bydliště: Brno

Re: Ukladani prebytku "Drama"

Příspěvek od mpro »

Sestrojil jsem vytežovač dle "Drama" trochu poupravil ke svému, ale nezdá se mi hlavní algoritmus... Ten pořád musí "plavat".
Nikdy se nezastaví na třeba 30% nebo se pletu? Při simulaci na stole okolo nastaveného napětí bud snižuje nebo zvyšuje, což samozřejmně smyčka programu dělá správně.
Když nebude dostatek Ppv na Pload tak se snižuje do doby než napětí "povyleze" a pak z další sekundě zase přidá. Jak se vám to chová v praxi?
Ocenil bych i krátké videjko.
Ostrov: EASUN IGrid VX IV 5.6kW @48V(zatím 2kWh) + 10 x 410Wp
předchozí MUST PV18-2K HM,3KVA/2.4KW, 24V, 40A MPPT; 4x255Wp Benq panely, olovo 24V 170Ah
Uživatelský avatar
peater
Příspěvky: 249
Registrován: pát bře 20, 2015 9:25 pm
Reputace: 14

Re: Ukladani prebytku "Drama"

Příspěvek od peater »

lopoko1 píše:Ahojte. našiel som si toto staršie téma a momentálne pre mna moc dobré Ďakujem všetkým za príspevky.
Už na základe kodu od peater sa mi podarilo rozjazdiť aruduino len mám otázku aké odpory použiť pre meranie 48V systému? prípadne ako to zapojiť?
Skúšal niekto namiesto tlačidiel použiť matrix klavesnicu?
Výstup PWM13 mi príde že je nastavený na frekvenciu 50Hz. čo môžem na výstupe použiť ako spínač(Tyristor) prípadne máte nejaké zapojenie?
Přidám se k dotazu: "aké odpory použiť pre meranie 48V systému?" Přešel jsem na 48V a rád bych to vyzkoušel.
9000Wp, 48v, 2x Pip-5048 MK paralelně, Li-ion 470Ah, ICC monitoring, GreenBonO vytěžovač
https://pvoutput.org/list.jsp?userid=50768
007ToMMaS
Příspěvky: 1095
Registrován: sob zář 15, 2012 8:53 pm
Reputace: 16

Re: Ukladani prebytku "Drama"

Příspěvek od 007ToMMaS »

Prikladám odkaz na microlog. V podstate je možné použiť hodnoty aj z neho lebo ide o odporový delič, a tj stačí len v programe upraviť hodnotu pre správne meranie v arduinu. http://microlog.mypower.cz/hw:odporovy-delic
3,2kWp REC320NP - juh
3,6kWp - Phonosolar PS450M5GFH-24/TH- východ
2x IGridSV-IV5.6KW, 2x Li-ion - 48V / 156Ah =312Ah
Uživatelský avatar
peater
Příspěvky: 249
Registrován: pát bře 20, 2015 9:25 pm
Reputace: 14

Re: Ukladani prebytku "Drama"

Příspěvek od peater »

Díky za info, taky jsem na to přišel.
9000Wp, 48v, 2x Pip-5048 MK paralelně, Li-ion 470Ah, ICC monitoring, GreenBonO vytěžovač
https://pvoutput.org/list.jsp?userid=50768

Odpovědět
  • Podobná témata
    Odpovědi
    Zobrazení
    Poslední příspěvek