Fórum | MyPower.CZ | Obnovitelné zdroje energie - energetická soběstačnost | Právě je ned zář 23, 2018 2:04 am


Ukladani prebytku "Drama"

Automatizace, řízení, měření, logování a programování s využitím platformy Arduino.
Předchozí

Re: Ukladani prebytku "Drama"

Příspěvekod kodl69 » pon zář 26, 2016 8:28 pm

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".
ostrov 3000Wp neustále ve stádiu zrodu: 6x noark CHSM6610P250, 6x250Wp z I4wifi, 4x auria 120Wp, midnite classic 150 lite+whizbang jr., 16S a různě P cca 300Ah Winston, Powerjack 8kW (reálně 6kW po úpravě). 48V DC rozvody a spotřebiče.
kodl69
 
Příspěvky: 2651
Registrován: sob črc 19, 2014 7:56 pm
Reputation: 180

Re: Ukladani prebytku "Drama"

Příspěvekod peater » pon zář 26, 2016 8:50 pm

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);

}
}
}
}
Uživatelský avatar
peater
 
Příspěvky: 132
Registrován: pát bře 20, 2015 9:25 pm
Reputation: 2

Re: Ukladani prebytku "Drama"

Příspěvekod kodl69 » pon zář 26, 2016 9:14 pm

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 3000Wp neustále ve stádiu zrodu: 6x noark CHSM6610P250, 6x250Wp z I4wifi, 4x auria 120Wp, midnite classic 150 lite+whizbang jr., 16S a různě P cca 300Ah Winston, Powerjack 8kW (reálně 6kW po úpravě). 48V DC rozvody a spotřebiče.
kodl69
 
Příspěvky: 2651
Registrován: sob črc 19, 2014 7:56 pm
Reputation: 180

Re: Ukladani prebytku "Drama"

Příspěvekod peater » úte zář 27, 2016 6:12 am

Š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.
Uživatelský avatar
peater
 
Příspěvky: 132
Registrován: pát bře 20, 2015 9:25 pm
Reputation: 2

Re: Ukladani prebytku "Drama"

Příspěvekod kodl69 » úte zář 27, 2016 3:01 pm

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 3000Wp neustále ve stádiu zrodu: 6x noark CHSM6610P250, 6x250Wp z I4wifi, 4x auria 120Wp, midnite classic 150 lite+whizbang jr., 16S a různě P cca 300Ah Winston, Powerjack 8kW (reálně 6kW po úpravě). 48V DC rozvody a spotřebiče.
kodl69
 
Příspěvky: 2651
Registrován: sob črc 19, 2014 7:56 pm
Reputation: 180

Re: Ukladani prebytku "Drama"

Příspěvekod lopoko1 » úte úno 21, 2017 10:45 pm

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?
lopoko1
 
Příspěvky: 7
Registrován: ned úno 07, 2016 8:38 pm
Reputation: 0

Re: Ukladani prebytku "Drama"

Příspěvekod mpro » pát čer 09, 2017 9:03 am

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.
mpro
 
Příspěvky: 8
Registrován: úte kvě 31, 2016 1:11 pm
Bydliště: Brno
Reputation: 0

Re: Ukladani prebytku "Drama"

Příspěvekod peater » úte bře 13, 2018 8:31 pm

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.
Uživatelský avatar
peater
 
Příspěvky: 132
Registrován: pát bře 20, 2015 9:25 pm
Reputation: 2

Re: Ukladani prebytku "Drama"

Příspěvekod 007ToMMaS » stř bře 14, 2018 3:39 pm

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
007ToMMaS
 
Příspěvky: 846
Registrován: sob zář 15, 2012 7:53 pm
Reputation: 10

Re: Ukladani prebytku "Drama"

Příspěvekod peater » stř bře 14, 2018 5:09 pm

Díky za info, taky jsem na to přišel.
Uživatelský avatar
peater
 
Příspěvky: 132
Registrován: pát bře 20, 2015 9:25 pm
Reputation: 2

Předchozí

Zpět na Arduino

Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 1 návštěvník

cron
Reputation System ©'