
Fórum | MyPower.CZ | Obnovitelné zdroje energie - energetická soběstačnost | Poslední návštěva: stř bře 29, 2023 8:05 am
MareC3k píše:Podarilo sa mi ako tak rozbehnut toto ukladanie prebytkov, ale mam trocha problem s tym, ze mam rovnaky displej ako luge na predchadzajucej strane a pokial som dobre pochopil, tak by malo fungovat aj zvysovanie a znizovanie napatia pomocou tlacitok, ale s tymto displejom a tlacitkami na nom mi to akosi nefunguje. v programe su tlacitka definovane na pinoch 50 a 52, a tento displej ich ma pripojene ku analogovym pinom 1-7. Ked som to zmenil tak to nejako nereagovalo a samo dvihalo cielove napatie hore... da sa to nejako spravit? alebo musim dat ine tlacitka na piny 50 a 52? dik
MareC3k píše:Este jedna vec ma napadla, komu funguje to uz dlhsie obdobie? neni problem s menicom? lebo predsa take zatazovacie impulzy ktore dostava menic mu mozno davaju trocha zabrat. Alebo je to v pohode a menic s tym nema problem?
MareC3k píše:Mam dalsi problem... ked funguje ukladanie prebytkov, tak mi nastane problem s menicom a to ten ze sa vypina od prepatia... mam nastavene nabijanie zo solaru na 30V, prebytky sa absorbuju od 29,5V, ale pri prevadzke asi nastane nejaka spicka na dc strane pri prudkom poklese vykonu do bojlera, asi ked arduino meria teplotu a menic sa vypne od vysokeho vstupneho napatia /vypina sa pri 31V/.
int analogPin = 1; // pin na kterem merime napeti na baterii
float targetVoltage = 27.2; // hodnota ciloveho napeti
float minVoltage = 26; // minimalni hodnota napeti, pri ktere se vypina PWM
float analogVoltage = 0; // hodnota na pinu analogPin
float analogVoltageSum = 0; // promenna pro prumerovani analogVoltage
int pwmPin = 13; // pin na kterem vyrabime PWM signal
float analogDivision= 15.28; // rozliseni na 1 volt (zapocitan o. delic)
float diffMax = 0.2; // maximalni odchylka od ciloveho napeti
byte pwmDuty = 0; // kolik % PWM cyklu bude rele zapnuto
byte pwmStepUp = 2; // minimalni zmena skoku PWM nahoru
byte pwmStepDown = 3; // 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 i ; // pomocna promenna
// funkce se provede po startu
void setup() {
// inicializace serioveho portu na rychlost 115200 bps:
Serial.begin(115200);
// nastaveni digitalniho pinu jako vystup
pinMode(pwmPin, OUTPUT);
// par odberu pro odstraneni hlouposti;
analogRead(analogPin);
analogRead(analogPin);
delay(500);
analogRead(analogPin);
delay(500);
analogRead(analogPin);
delay(500);
analogRead(analogPin);
delay(500);
analogRead(analogPin);
delay(500);
// pojistka, aby jsme si nezapamatovali prilis
// nizke cilove napeti
//while (analogVoltage < minVoltage + diffMax)
// {
// // pulsekunda na usazeni
// delay(500);
// // sto odberu na zprumerovani
// analogVoltageSum=0;
for (i=0; i<100; i++)
{
// napeti na analogPin bude brano jako cilove napeti
// (po zprumerovani)
analogVoltage=analogRead(analogPin)/analogDivision;
analogVoltageSum=analogVoltageSum+analogVoltage;
delay(50);
}
// // zprumerujeme
analogVoltage=analogVoltageSum/100;
// // vypiseme
// Serial.print("Aktualni napeti (prumer): ");
// Serial.println(analogVoltage);
// }
// napeti je dostatecne vysoke, takze ho bereme jako cilove
targetVoltage=analogVoltage;
Serial.print("Cilove napeti nastaveno na: ");
Serial.println(analogVoltage);
}
void loop() {
// nacteme aktualni napeti
analogVoltage=analogRead(analogPin)/analogDivision;
delay(5);
analogVoltage=(analogVoltage+analogRead(analogPin)/analogDivision)/2;
// 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;
}
Serial.print("Cilove napeti: ");
Serial.println(targetVoltage);
Serial.print("Aktualni napeti: ");
Serial.println(analogVoltage);
Serial.print("PWM: ");
Serial.println(pwmDuty);
// Vlastni PWM cyklus
sumTime = 0;
pwmLength = 1000 / pwmFreq;
while ( sumTime < pwmCycle * 1000)
{
if (pwmDuty > 0)
{
sumTime=sumTime+pwmLength+pwmLength*(100-pwmDuty)/pwmDuty;
digitalWrite(pwmPin, HIGH);
delay(pwmLength);
digitalWrite(pwmPin, LOW);
delay(pwmLength*(100-pwmDuty)/pwmDuty);
}
else
{
digitalWrite(pwmPin, LOW);
sumTime=pwmCycle * 1000+1;
delay(pwmCycle * 1000+1);
}
}
}
Uživatelé procházející toto fórum: CC [Bot] a 0 návštevníků