Autolaturi mökille varavoimaksi Arduinon avulla

tosin tollasella systeemillä et voi käyttää ehkä esim monitoria joka vaatii 12v koska autosähkössä 12v on vain nimellisjännite ja todellisuudessa moottorin käydessä sen 13,8-14.4v uskoisin että autosähkökäyttöön olevat vehkeet kestää sen 16v vielä helposti, ja jos jotain elektroniikkaa pitää ajaa regu siellä olisi oltava.ja joo kyllä siellä pitäisi olla logiigga joka ei anna sammutus funktion ajaa pwm 100 jos moottori käy
 
@ississ, Joo tuohan oli hyvä. Eli periaatteessa kolmelta anturilta ikään kuin tuossa vahvistus ennen kuin palautetaan akkujännite lataussäätimeen.

Kysyit, että mitä muita laitteita järjestelmässä on. On perus mökkivarusteita: aurinkolataussäädin, radio, lamppuja, jääkaappi, tarpeen mukaan erikseen päälle kytkettävä 230 V invertteri.

Jääkaape on ainakin tarkoitettu karavaanikäyttöön, joten siinä ainakin lienee jännitteen yläraja korkeampi.
 
@TemeV , mutta voiko jännite kuitenkin nousta 16 volttiin? Miten käy laitteille, jotka kytkettynä systeemiin, jossa jännite hetkellisesti 16 volttia?
Ei sen pitäisi pystyä noin korkealle hyppäämään sekuntien aikaskaalassa. Jos mietitään että latausvirta olisi vaikkapa 50A normaalisti. Jos saisit jollain erikoisella vikatilanteella nostettua vaikkapa 150 ampeeriin, akku latautuu ja jännite nousee siinä kahdessa sekunnissa saman verran kuin normaalisti kuudessa sekunnissa Eli ei juurikaan.

Johtojen resistanssit toki nostaa jännitettä laturin päässä ja siellä päässä saatettaisiin jo lähennellä sitä 16 volttia, riippuen johtojen paksuudesta ja liitosten laadusta. Jos kuitenkin laitteet on kytketty akkuun, eikä suoraan laturiin, ei ne näe sitä jännitettä. Akun resistanssi lienee joitain milliohmeja, ja tuo 150 ampeeria nostaisi siis jännitettä joitain satoja millivoltteja.
 
@TemeV , no tuolla perusteella, jos siis saa laitettua tuommoisen lisäturvapiirin katkaisemaan ohjauksen laturilta, niin riittäisi aivan ok tämän systeemiin suojaukseksi. Toki silti kannattaa tuossa nuo @ississ :n aiemmin mainitsemat jutut laittaa sinne koodiin.

Täytyy toki muistaa, että varmaan todennäköisyys tämmöiselle tapahtumalle on lähellä nollaa, mutta ei sitä varmaan liian varovainen tässä olla.
 
Tähän väliin sujuvasti koodikysymys taas. Voiko tuossa ajastuksissa käyttää tuota samaa lastTime -muuttuja vai pitääkö kaikille ajastuksille olla omat? Yritän saada noita delay() funktioita pois tuosta koodista, että olisi "nätimpi" koodi.

Näyttääkö toimivalta äkkiseltään katsottuna:

C++:
void shutDown() {  //engine shutdown, execute relay

  //If the charging current drops to 0 to 5 amperes and charging voltage is under 15 volts (safety) and motor is running
  // start the shutdown function and turn off the relay
  if (current >= 0 && current < 5 && sensVoltage < 15 && digitalRead(motorPin) == HIGH && motorStatus == 2) {
    digitalWrite(relayPin, LOW);

    if (millis() - lastTime >= 2000) {  //wait at least 2 seconds to engine stall down

      analogWrite(pwmPin, 255);  // Stop Duty Cycle at 100 %, alternator electromagnet off

      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Sammutus");

      motorStatus = 3;  //motor has run, to reset, switch power off, on next startup, it will be reset

#ifdef DEBUG
      Serial.println("Sammutettu.");
#endif
    }

  } else if (motorStatus == 2) {
    lastTime = millis();

    digitalWrite(relayPin, HIGH);  //else, keep relay on

#ifdef DEBUG
    Serial.println("Kaynnissa.");
#endif
  }
}
 
Viimeksi muokattu:
En nyt oo varma mutta jos tuo lasttime oon ns geneerinen muuttuja jota siis käytetään monessa void jotain se käsittääkseni pitäisi myös joka loop kierroksella päivittää tai se päivittää vain kun joku ajaa tuon
Koodi:
lastTime =millis();

jos sulla on void loop()

{

lastTime = millis();


}
niin silloin joka loop kierroksella sulla on tuo arvo johon voit verrata onko aika kulunut. mutta nyt pähkäilen kun tuossa esimerkissä päivität vain lastTimen jos motorstatus == 2 joten jos tuon lisää looppiin rikkooko se jonkun logiigan ? jos rikkoo niin teet toisen esim generallastmillis = millis(); johon vertaa yleismailmallisesti paljonko aikaa on kulunut.
 
Tähän väliin sujuvasti koodikysymys taas. Voiko tuossa ajastuksissa käyttää tuota samaa lastTime -muuttuja vai pitääkö kaikille ajastuksille olla omat? Yritän saada noita delay() funktioita pois tuosta koodista, että olisi "nätimpi" koodi.

Näyttääkö toimivalta äkkiseltään katsottuna:

C++:
void shutDown() {  //engine shutdown, execute relay

  //If the charging current drops to 0 to 5 amperes and charging voltage is under 15 volts (safety) and motor is running
  // start the shutdown function and turn off the relay
  if (current >= 0 && current < 5 && sensVoltage < 15 && digitalRead(motorPin) == HIGH && motorStatus == 2) {
    digitalWrite(relayPin, LOW);

    if (millis() - lastTime >= 2000) {  //wait at least 2 seconds to engine stall down

      analogWrite(pwmPin, 255);  // Stop Duty Cycle at 100 %, alternator electromagnet off

      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Sammutus");

      motorStatus = 3;  //motor has run, to reset, switch power off, on next startup, it will be reset

#ifdef DEBUG
      Serial.println("Sammutettu.");
#endif
    }

  } else if (motorStatus == 2) {
    lastTime = millis();

    digitalWrite(relayPin, HIGH);  //else, keep relay on

#ifdef DEBUG
    Serial.println("Kaynnissa.");
#endif
  }
}

Samaa muuttujaa voi käyttää jos ei ole vaaraa että eri viiveet menee päällekkäin.
Tarkoittaa siis sitä että todennäköisesti joillakin muilla muuttujilla pitää tallentaa tilatieto missä ollaan ja sen mukaan tulkita ajastuksia.

Seurannan kannalta voisi olla parempi määrittää nuo motorstatus- arvot nimillä eikä numeroilla. Koodina ihan sama asia mutta silmälle helpompi kun ei tarvitse muistaa mikä tila oli 2 ja mikä 3.
Esimerkiksi

#define MOTOR_OFF 0
#define MOTOR_STARTING 1
#define MOTOR_RUNNING 2
#define MOTOR_STOPPING 3

ja koodissa:

int motorStatus = MOTOR_OFF;

Ja muista varmistaa että tilat/ehdot ovat sellaisia ettei mene vahingossa ohi tai suoriteta liian monta kertaa.
Oikeastaan niin että kun ehto täyttyy niin tila vaihtuu ja silloin on muut ehdot, tarvitset siis ainakin "ajossa" -> "sammumassa" -> "sammutettu" jolloin ajossa tutkitaan virtarajat jne.
Kun pitää aloittaa sammutus niin silloin asettaa lastTime, sammutusrele, jne ja seuraava tila.
"Sammumassa"- tilassa sitten tutkitaan sitä aikaa eikä enää välitetä virroista (ehkä kannattaa asettaa myös pwm minimiin edellä) ja taas asetetaan seuraava tila kun aikaraja täyttyy.

Näin varmistat myös sen että lastTime (tai muu vastaava) joka tässä on "tapahtuman alkuhetki" päivittyy vain tilan vaihdossa silloin kun kyseinen tapahtuma oikeasti alkaa.
Asettamalla jokaisella kierroksella lastTime = millis() kun kone on käynnissä on tavallaan ihan turhaa ja varsinkin silloin sitä ei voi uusiokäyttää.

Jotain tähän tyyliin siis. Ei takeita toiminnasta.
C++:
void shutDown() {

  if ( motorStatus == MOTOR_RUNNING ) {
    // Käynnissä
    if ( ( current >= 0 ) && ( current < 5 ) && ( sensVoltage < 15 ) && ( digitalRead(motorPin) == HIGH ) ) {
      //  ehdot täyttyy -> pitää sammuttaa

      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Sammutus alkaa");

#ifdef DEBUG
      Serial.println("Sammutus alkaa");
#endif
      // Ehkä myös tämä
      //analogWrite(pwmPin, 15);  // 5% pwm
      digitalWrite(relayPin, LOW);
      motorStatus = MOTOR_STOPPING;
      lastTime = millis();
    }
  } else if ( motorStatus == MOTOR_STOPPING ) {
    // Sammutus menossa
    if ( ( millis() - lastTime ) >= 2000 ) {
      // Aika täynnä

      if ( [ tähän rpm/tärinä luku -> onko moottori oikeasti sammunut ? ] ) {
        // Ehkä varmuuden vuoksi tarkastaa latausvirta ja jännite myös ennen pwm- asetusta
        // Sammunut
        analogWrite(pwmPin, 255);

        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("Sammutettu");

#ifdef DEBUG
        Serial.println("Sammutettu");
#endif
        motorStatus = MOTOR_OFF;
        // Sammutusrele pitäisi voida palauttaa jo tässä (koska tarkastettu että sammui)
        // tai sillä missä pitäisi olla silloin kun tehdään seuraava startti.
        //digitalWrite(relayPin, HIGH);
      }
    }
  }

}
 

Statistiikka

Viestiketjuista
264 596
Viestejä
4 581 081
Jäsenet
75 472
Uusin jäsen
AndyV

Hinta.fi

Back
Ylös Bottom