arduino pwm

mk

Aktiivinen jäsen
Viestejä
629
#41
Vs: arduino pwm

Pinnnit >7 ei mahdu aiempaan taulukkoon, joka siis on 3+5 bittiä.
Täytyy indeksoida lisää.

char Pinnit[8] = (-1, 3, 5, 6, 9, 10, 11, -1);

unsigned char Arvot[256] = ([Pinnit[n]]*32+kerroin, jne
(tähän jo kannattaa kirjoittaa erillinen ja ulkopuolinen tekstin tuottaja)

Voit myös halutessasi muuttaa calcIrms laskennan ns. rinnakkaiseksi.

Muuta EmonLib.h

void current(unsigned int _inPinI, double _ICAL);
void current8Reset(void); // lisäys
void current8(unsigned int _inPinI8, unsigned int _inPinI, double _ICAL); // lisäys

double calcIrms(unsigned int NUMBER_OF_SAMPLES);
void calcIrms8(unsigned int NUMBER_OF_SAMPLES); // lisäys

// muuttujien lisäyksiä
Irms, Irms8[8];
double ICAL, ICAL8[8];
unsigned int inPinI;
int inPinI8[8]; // oma rivi
double offsetI, offsetI8[8]; //Low-pass filter output
double sqV,sumV,sqI,sumI, sumI8[8],instP,sumP; //sq = squared, sum = Sum, inst = instantaneous

Muuta EmonLib.cpp
Kopioi current ja calcIrms ed. nimisiksi
Lisää current8Reset

void EnergyMonitor::current8Reset(Void)
{
for (unsigned int m = 0; m < 8; m++)
inPinI8[m] = -1;
Irms8[m] = 0;
}

void EnergyMonitor::current8(unsigned int _inPinI8, unsigned int _inPinI, double _ICAL)
{
inPinI8[_inPinI8] = (int)_inPinI;
ICAL8[_inPinI8] = _ICAL;
offsetI8[_inPinI8] = ADC_COUNTS>>1;
}

void EnergyMonitor::calcIrms8(unsigned int Number_of_Samples)
{

#if defined emonTxV3
int SupplyVoltage=3300;
#else
int SupplyVoltage = readVcc();
#endif

unsigned int m;

for (unsigned int n = 0; n < Number_of_Samples; n++)
for (m = 0; m < 8; m++)
if (inPinI8[m] > -1)
{
sampleI = analogRead(inPinI8[m]);

// Digital low pass filter extracts the 2.5 V or 1.65 V dc offset,
// then subtract this - signal is now centered on 0 counts.
offsetI8[m] = (offsetI8[m] + (sampleI-offsetI8[m])/1024);
filteredI = sampleI - offsetI8[m];

// Root-mean-square method current
// 1) square current values
sqI = filteredI * filteredI;
// 2) sum
sumI8[m] += sqI;
}

for (m = 0; m < 8; m++)
{
double I_RATIO = ICAL8[m] *((SupplyVoltage/1000.0) / (ADC_COUNTS));
Irms8[m] = I_RATIO * sqrt(sumI8[m] / Number_of_Samples);
}

//Reset accumulators
for (m = 0; m < 8; m++)
sumI8[m] = 0;
//--------------------------------------------------------------------------------------
}

Lisätoimintona current8Reset joka resetoi pinnit pois käytöstä.
Pinnin käyttöönotto muuttuu myös hieman, current8(pinnin indeksi(0 - 7), pinnin numero, jne)
Nyt calcIrms8 ei palauta arvoa vaan ne löytyy Irms8[] muuttujasta indeksinumerolla.
Arvot ei myöskään muutu jos calcIrms8 ei kutsuta uudestaan.
 

Scroll

amatitutkintohenkilöinen
Viestejä
2 632
#42
Vs: arduino pwm

Nopeudella on näiden mopojen sovellutuksissa aina väliä minun kokemuksena. Jos ei nyt, niin viimeistään versiossa 2.32 homma kämähtää...

Miksi tehdä siitä pikku vilkaisusta nopeuden perään niin iso numero kun ei se merkittävästi lisää työtä kumminkaan ole? Siinä samalla kun siistii koodia luettavammaksi, pohtii myös nopeusasiat.

Nykyaikana kun ei käytännössä koskaan tarvitse mennä konekielen tasolle tai kikka-kolmosiin nopeutta saavuttaakseen. Riittää, että tietää mitä tekee ja koodaa kauniisti. Ei maksa käytännössä yhtään sen enempää kuin ryteikkö-tyylillä tekeminen. Erona vain se, että nätisti alunpitäen tehty on nätti vielä versiossa 2.32:kin - eikä "räjähdä" silmille tuottaen kummallisia vikoja, joista kukaan ei käsitä mitään.

Ajastusviat (time-dependent problems) ne hauskoja näissä vehkeissä ovatkin. Ilmaantuvat milloin ilmaantuvat eivät tieteenkään silloin kun vianselvittäjä on paikalla...
 

Scroll

amatitutkintohenkilöinen
Viestejä
2 632
#43
Vs: arduino pwm

mk sanoi:
Pinnnit >7 ei mahdu aiempaan taulukkoon, joka siis on 3+5 bittiä.
Täytyy indeksoida lisää.

char Pinnit[8] = (-1, 3, 5, 6, 9, 10, 11, -1);

unsigned char Arvot[256] = ([Pinnit[n]]*32+kerroin, jne
(tähän jo kannattaa kirjoittaa erillinen ja ulkopuolinen tekstin tuottaja)

Voit myös halutessasi muuttaa calcIrms laskennan ns. rinnakkaiseksi.

Muuta EmonLib.h
.....jne jne.
Tota noin, olikos ton koodin tarkoitus niinkuin suorittua Arduinossa?? Eikös tuo ollut C++ koodia?

Arska ei ole mikään C++ ympäristö. Ei minun tietääkseni ainakaan ellei sinne ole nyt sitten tullut tarjolle joku uutuus. No se sinun pitäisi varmaan sitten ohjeistaa, mitä sinne pitää asentaa lisää.

Perusmuotissaan Arska+Atmel ei ole mikään C++ kone. Eikä myöskään mikään "embedded linux", jonne laitetaan rinnakkaisprosesseja tai säikeitä tosta vaan pörisemään.

Arduino on hyvin minimaalisten resurssien ympäristö, jossa ohjelmointiympäristökin on aika rajoitteinen ja ohjelmoijan täytyy tietää mitä tekee.
 

tj86430

Aktiivinen jäsen
Viestejä
607
#44
Vs: arduino pwm

Scroll sanoi:
Tota noin, olikos ton koodin tarkoitus niinkuin suorittua Arduinossa?? Eikös tuo ollut C++ koodia?

Arska ei ole mikään C++ ympäristö. Ei minun tietääkseni ainakaan ellei sinne ole nyt sitten tullut tarjolle joku uutuus. No se sinun pitäisi varmaan sitten ohjeistaa, mitä sinne pitää asentaa lisää.

Perusmuotissaan Arska+Atmel ei ole mikään C++ kone. Eikä myöskään mikään "embedded linux", jonne laitetaan rinnakkaisprosesseja tai säikeitä tosta vaan pörisemään.

Arduino on hyvin minimaalisten resurssien ympäristö, jossa ohjelmointiympäristökin on aika rajoitteinen ja ohjelmoijan täytyy tietää mitä tekee.
En tunne Arduinoa, mutta pikagooglaus väittää mm. näin:

First, the Arduino compiler/IDE accepts C and C++ as-is. In fact many of the libraries are written in C++. Much of the underlying system is not object oriented, but it could be. Thus, "The arduino language" is C++ or C.
 

Scroll

amatitutkintohenkilöinen
Viestejä
2 632
#46
Vs: arduino pwm

tj86430 sanoi:
En tunne Arduinoa, mutta pikagooglaus väittää mm. näin:
Juu, osassa kirjastoja on käytetty C++:aa totta, mutta tuo ehdottamasi koodirakenne ei suoritu sellaisenaan Processing ympäristössä.

Tottahan Arskan kääntäjä C++:n konekieleksi vääntää koska viimekädessä prosessori ei tiedä mitä se koodi on alunperin ollut.

Koodissasi on kuitenkin pakko olla tiettyjä Processing-ohjelmointialustan elementtejä, muuten se ei suoritu. Nyt siitä puuttuu ne, mm. main() funktio. Vai oliko tuo vain osa siitä koodista?

Miten ajattelit toteuttaa tämän ehdotuksesi: "Voit myös halutessasi muuttaa calcIrms laskennan ns. rinnakkaiseksi."
 

repomies

Hyperaktiivi
Viestejä
7 277
#47
Vs: arduino pwm

Scroll sanoi:
Juu, osassa kirjastoja on käytetty C++:aa totta, mutta tuo ehdottamasi koodirakenne ei suoritu sellaisenaan Processing ympäristössä.
Tottahan Arskan kääntäjä C++:n konekieleksi vääntää koska viimekädessä prosessori ei tiedä mitä se koodi on alunperin ollut.
Miten ajattelit toteuttaa tämän ehdotuksesi: "Voit myös halutessasi muuttaa calcIrms laskennan ns. rinnakkaiseksi."
tj86430 ei väittänyt mitään aiheesta "ns. rinnakkaiseksi." vaan sen teki nimimerkki mk. Ja tuosta noin aika äkkiä kyllä näkee että ajatuksena on muuttaa emon librarya siten että se käpistelee kerralla useampaa pinniä, sen sijaan että tehtäisiin useampi emon-instanssi ja kutsutaan erikseen jokaista instanssia odotellen. TÄLLÄ on ehkä jo merkittävä vaikutus suoritusaikoihin, toisin kuin if-siistinnällä. Sittenkin voi olla että eniten tulisi nopeutta lisää parantamalla analog readien nopeutta nostamalla ADC kelloa. Mutta lisättäköön ettei minun mielestäni jollan kannata vieläkään lähteä optimoimaan nopeutta ellei ole havaittua suorituskykyongelmaa.
 

mk

Aktiivinen jäsen
Viestejä
629
#48
Vs: arduino pwm

Pari virhettä löytyi.
Esim. taulukkomuuttujan alustus vaatii aaltosulut.

Lisäsin funktion calcIarv8.
(Average Rectified Values)
Sisäinen looppi ei sisällä liukulukuja.
Sisäisen summan tyyppi on long joten pari miljoonaa näytettä mahtuu.
Vastaavan tyylinen Irms kestää sekin yli 10000 näytettä.
Float/long suoritusnopeuksien eroista en osaa sanoa, jossain oli jotenkin testattu, ettei suuria eroja olisi.

Funktio ei palauta arvoa.
Tuotokset löytyy Iarv8[] muuttujasta.
Alustus kuten aiemmin.

Arvo on keskiarvo * muuntosuhde * tarkkuus

Esim.
Setuppiin
...
emon.current8Reset();
emon.current8(1, 5, 6:cool:;
emon.current8(2, 6, 6:cool:;
emon.current8(3, 9, 6:cool:;

Looppiin
...
emon.calcIarv8(1480);
...
Serial.print(emon.Iarv8[1]);
Serial.print(" ");
Serial.print(emon.Iarv8[2]);
Serial.print(" ");
Serial.print(emon.Iarv8[3]);
Serial.print(" ");
 

Liitteet

repomies

Hyperaktiivi
Viestejä
7 277
#49
Vs: arduino pwm

Mk, vaikka sinänsä voikin olla fiksua lukaista kaikki virtatiedot kerralla, jollan ei välttämättä kannata lähteä kuitenkaan pelkästä optimoinnin ilosta laittamaan enempi vähempi kehitysasteella olevaa koodia ns. tuotantoon, kun kuulemma sen 100ms viiveen lisäys looppiin ei toimintaa muuta mihinkään. Nopeus ei nyt ole se tärkein juttu vaan laskennan virheettömyys tuossa virtojen muuttamisessa pwm-ohjauksiksi. Nykyisessä kuosissaan se emon-kirjasto on kuitenkin aika laajalti koeponnistettu ja siten todennäköisesti melko vähäbuginen. Sanoisin että jos se ei ole rikki, ei kannata koskea. KISS-periaatteella vaan eteenpäin.

Sinänsä tuo kontribuutiosi vaikuttaa ihan ok suunnalta. Ehkä voisit tehdä siitä patchin ja viskata sen emon-kirjaston kehittäjille arvioitavaksi.
 

mk

Aktiivinen jäsen
Viestejä
629
#50
Vs: arduino pwm

Toki näin.

Edellinen yritys oli vielä aivan täysin testaamatta.
Tämä nykyinen on sentään käännetty onnistuneesti.
(Uno R3 löytyy myös, kun löytyy)

Tekelehän on ihan vaan mielenkiinnosta, jos sitä siis on.

calcIarv8 vaihtui muotoon calcI88, joka tuottaa molemmat arvot ilman liukulukuja.
Säädettävä filtteri tuli myös matkaan, jonka arvo on kaikille mittauksille sama.
Palautuvat arvot on n/1024 murtolukuja, kokonaisosa siten n>>10 ja murto-osa n&1023.

Käyttö:
current8Reset(max ADC muutosnopeus per 2 mittausta) // pinnit nollautuu samalla
current8(pinnin indeksi, pinni, kalibrointi)
calcIrms8(Number_of_Samples) // arvot Irms8[]
calcI88(Number_of_Samples) // arvot Irms88[] ja Iarv88[]
 

Liitteet

J

jolla

Vieras
#51
Vs: arduino pwm

jetti&mopokelit on nyt ilmeisesti takanapäin ja kehittelen edelleen paremmaksi tuota paneleilta>varaajaan systeemiä

ongelma on että että tehon kasvaessa virta muuttuu senverran huonoksi mk2pvrouter systeemissä, mikä tällähetkellä on penkissä, että etenkin hybridi ajaa tehonsa pahimmassa välkkymisvaiheessa osittain alaspäin, pahimmillaan miltei kokonaan, toiminta on kuitenkin mahdollista kun manuaalisesti kytkimistä lisää kuormaa tai oikeasti triacilla potikasta väännän sopivan kuorman, silloin ei ongelmia suuremmillakaan kuormilla

joten onko seuraava koodi käyttökelpoinen, miten se oikeaoppisesti pitää laittaa kun haluan ensin pin7 ylös ja sitten pin7+pin8 ylös ettei tuossa ensimmäisessä tilanteessa pin8 jää ylös ja ensimmäisen arvon alittuessa molemmat ovat alhaalla, tää ajatuksen juoksun taso on taas tällä hetkellä nyt vaan tätä

Koodi:
   if ((realPower >= 1700) && (realPower < 3400)) 
    {
    digitalWrite(upPin7, HIGH);
    }
    else
    {
    digitalWrite(upPin7, LOW);
    }
    if ((realPower >= 3400) && (realPower < 6000)) 
    {
    digitalWrite(upPin8, HIGH);
    digitalWrite(upPin7, HIGH);
    }
    else
    {
    digitalWrite(upPin8, LOW);
    }
~kilowatin teholla mk2pv dataa sähkömittarista
Koodi:
8.0
7.8
2.1
20.8
7.3
13.7
9.3
5.4
-23.4
18.0
4.3
9.5
-0.5
24.5
36.9
21.4
-2.1
8.1
4.4
-3.2
7.4
-1.1
-4.1
11.9
-1.8
-3.8
25.8
-3.5
 

repomies

Hyperaktiivi
Viestejä
7 277
#52
Vs: arduino pwm

Tuo data näyttää heiluvan niin paljon ettei siitä muutaman sekunnin vilkaisulla viisastu.

Koodi on hankalalukuista koska sisennyksiä ei ole käytetty, mutta näyttää olevan kaksi erillistä if-else lauseketta joiden molempien ajon jälkeen vasta näkee mitkä on outputtien tilat. Toisinaan on selkeämpää tehdä niin, että vain yksi lohko ajetaan eli jatkaa if () {} else if () {} else if() {}.. jolloin vain yksi lohko suoritetaan. Siinä pitää sitten asetella kaikki hipelöitävät muuttujat.

Minusta näyttää että realpowerin ollessa alle 1700 taikka suurempi tai yhtä suuri kuin 6000 niin ajetaan molemmat else-haarat, ja molemmat outputit on LOW.

Välillä 1700 <= realpower < 3400 pin7 on HIGH ja pin8 LOW. välillä 3400 <= realpower < 6000 molemmat pin7 ja pin8 on HIGH.

Toivottavasti tuo oli myös mitä yritit. Itse olisin kirjoitellut if-else-if-else ketjuna jossa joka lohkossa asetetaan molemmat outputit ja if-ehdot kattavat koko realpowerin lukualueen ilman päällekkäisyyttä.
 
J

jolla

Vieras
#53
Vs: arduino pwm

repomies sanoi:
Tuo data näyttää heiluvan niin paljon ettei siitä muutaman sekunnin vilkaisulla viisastu.

Koodi on hankalalukuista koska sisennyksiä ei ole käytetty, mutta näyttää olevan kaksi erillistä if-else lauseketta joiden molempien ajon jälkeen vasta näkee mitkä on outputtien tilat. Toisinaan on selkeämpää tehdä niin, että vain yksi lohko ajetaan eli jatkaa if () {} else if () {} else if() {}.. jolloin vain yksi lohko suoritetaan. Siinä pitää sitten asetella kaikki hipelöitävät muuttujat.

Minusta näyttää että realpowerin ollessa alle 1700 taikka suurempi tai yhtä suuri kuin 6000 niin ajetaan molemmat else-haarat, ja molemmat outputit on LOW.

Välillä 1700 <= realpower < 3400 pin7 on HIGH ja pin8 LOW. välillä 3400 <= realpower < 6000 molemmat pin7 ja pin8 on HIGH.

Toivottavasti tuo oli myös mitä yritit. Itse olisin kirjoitellut if-else-if-else ketjuna jossa joka lohkossa asetetaan molemmat outputit ja if-ehdot kattavat koko realpowerin lukualueen ilman päällekkäisyyttä.
tätä haen
Välillä 1700 <= realpower < 3400 pin7 on HIGH ja pin8 LOW. välillä 3400 <= realpower < 6000 molemmat pin7 ja pin8 on HIGH.
ja alle 1700 molemmat LOW

sähkömittarin datalla ei tähän ole merkitystä, laitoin vain kuinka mk2pv hoitelee hommansa.....ihan hyvin

koko arduinon, joka ohjaa on/off ssr, koodi on
Koodi:
// EmonLibrary examples openenergymonitor.org, Licence GNU GPL V3

#include "EmonLib.h"             // Include Emon Library
EnergyMonitor emon1;             // Create an instance
int upPin7 = 7;
int upPin8 = 8;

void setup()
{
  pinMode(upPin7,OUTPUT);
  pinMode(upPin8,OUTPUT);  
  Serial.begin(9600);
  
  emon1.voltage(2, 234.26, 1.7);  // Voltage: input pin, calibration, phase_shift
  emon1.current(1, 14.0);       // Current: input pin, calibration.
}

void loop()
{
  emon1.calcVI(20,2000);         // Calculate all. No.of half wavelengths (crossings), time-out
  emon1.serialprint();           // Print out all variables (realpower, apparent power, Vrms, Irms, power factor)
  
  float realPower       = emon1.realPower;        //extract Real Power into variable
  float apparentPower   = emon1.apparentPower;    //extract Apparent Power into variable
  float powerFActor     = emon1.powerFactor;      //extract Power Factor into Variable
  float supplyVoltage   = emon1.Vrms;             //extract Vrms into Variable
  float Irms            = emon1.Irms;             //extract Irms into Variable
  
    if ((realPower >= 1700) && (realPower < 3400)) 
    {
    digitalWrite(upPin7, HIGH);
    }
    else
    {
    digitalWrite(upPin7, LOW);
    }
 /*   if ((realPower >= 3400) && (realPower < 6000)) 
    {
    digitalWrite(upPin8, HIGH);
    digitalWrite(upPin7, HIGH);
    }
    else
    {
    digitalWrite(upPin8, LOW);
    digitalWrite(upPin7, LOW);
    }
  */  
}
tällä pääsee ilman ongelmia 3400 saakka
 

repomies

Hyperaktiivi
Viestejä
7 277
#54
Vs: arduino pwm

No sitten se kai pelaa. Toivottavasti ei haittaa että realpowerin lipsahtaessa arvoon 6000 tai enemmän, molemmat outputit putoaa alas.

Sellainen kommentti vielä että tuolla välillä 3400-6000 se pin7 räpsähtää ensin alas ihan mikroskooppiseksi ajaksi kunnes tuo jälkimmäinen if-lauseke ajetaan ja se nostaa sen ylös. Nyt riippuen siitä mitä tehdään tämän jälkeen se joko on ongelma tai ei ole. Jos noita iffejä ajetaan tiukassa loopissa niin se räpsyy ylös-alas jatkuvasti tuolla välillä. Eli tee se if-else-if-else ketju kuten ehdotin niin tätä ei tapahdu. Voin toki illemmalla näyttää miten, jos harjoitus ei suju.
 

mk

Aktiivinen jäsen
Viestejä
629
#55
Vs: arduino pwm

jolla sanoi:
tätä haen
Välillä 1700 <= realpower < 3400 pin7 on HIGH ja pin8 LOW. välillä 3400 <= realpower < 6000 molemmat pin7 ja pin8 on HIGH.
ja alle 1700 molemmat LOW
Yli 6000 on määrittelemättä.

Koodi:
if (realPower < 1700)
{
  digitalWrite(upPin7, LOW);
  digitalWrite(upPin8, LOW);
}
else
{
  digitalWrite(upPin7, HIGH);
  if (realPower >= 3400)
    digitalWrite(upPin8, HIGH);
}
 
J

jolla

Vieras
#56
Vs: arduino pwm

repomies sanoi:
No sitten se kai pelaa. Toivottavasti ei haittaa että realpowerin lipsahtaessa arvoon 6000 tai enemmän, molemmat outputit putoaa alas.

Sellainen kommentti vielä että tuolla välillä 3400-6000 se pin7 räpsähtää ensin alas ihan mikroskooppiseksi ajaksi kunnes tuo jälkimmäinen if-lauseke ajetaan ja se nostaa sen ylös. Nyt riippuen siitä mitä tehdään tämän jälkeen se joko on ongelma tai ei ole. Jos noita iffejä ajetaan tiukassa loopissa niin se räpsyy ylös-alas jatkuvasti tuolla välillä. Eli tee se if-else-if-else ketju kuten ehdotin niin tätä ei tapahdu. Voin toki illemmalla näyttää miten, jos harjoitus ei suju.
oli 6000vähän, mutta tällä näyttäis ylämäkeen menevän muttaa ei osaa tiputtaa lukeman pienentyessä

edit
vaihdoin tähän toimivan koodin, tällä pelaa

Koodi:
    if ((realPower >= 1700) && (realPower < 3400)) 
    {
    digitalWrite(upPin7, HIGH);
    digitalWrite(upPin8, LOW);
    }
    else if ((realPower >= 3400) && (realPower < 4300)) 
    {
    digitalWrite(upPin8, HIGH);
    digitalWrite(upPin7, LOW);
    }
    else if ((realPower >= 4300) && (realPower < 8000)) 
    {
    digitalWrite(upPin8, HIGH);
    digitalWrite(upPin7, HIGH);
    }
    else
    {
    digitalWrite(upPin8, LOW);
    digitalWrite(upPin7, LOW);
    }
 

repomies

Hyperaktiivi
Viestejä
7 277
#57
Vs: arduino pwm

Ei varmaan koska laitoit alueita päällekäisiksi, mitä kehoitin jo varomaan. Tuo if-ehto 3400-8000 sisältää alueen 4300-8000 joten sitä jälkimmäistä ei ajeta, else-haaraan ei mennä.

Älä tee päällekäisiä if-ehtoja. Aseta molemmat outputit jokaisen noiden {} -blokkien sisällä. Näin tulee simppeli ja luettavampi ratkaisu.
 
J

jolla

Vieras
#58
Vs: arduino pwm

repomies sanoi:
Ei varmaan koska laitoit alueita päällekäisiksi, mitä kehoitin jo varomaan. Tuo if-ehto 3400-8000 sisältää alueen 4300-8000 joten sitä jälkimmäistä ei ajeta, else-haaraan ei mennä.

Älä tee päällekäisiä if-ehtoja. Aseta molemmat outputit jokaisen noiden {} -blokkien sisällä. Näin tulee simppeli ja luettavampi ratkaisu.
kiitos, nyt lähti toimimaan , 8000 oli kahteen kertaan ja molemmat pinnit piti määritellä eikä vain toista, muuten jäi HIGH

sopivasti aurinkokin piikitti liki 7k eikä mitään valojen välähtelyjä kun mk2pv hoitelee vain hienosäädön ja toinen arduino hoitelee karkeasäädön ssr kanssa

kiitos avusta
 

repomies

Hyperaktiivi
Viestejä
7 277
#59
Vs: arduino pwm

mk sanoi:
Yli 6000 on määrittelemättä.

Koodi:
if (realPower < 1700)
{
  digitalWrite(upPin7, LOW);
  digitalWrite(upPin8, LOW);
}
else
{
  digitalWrite(upPin7, HIGH);
  if (realPower >= 3400)
    digitalWrite(upPin8, HIGH);
}
Tuokaan ei pudota outputtia alas oikein kun realpower alkaa laskea. Laittaa nyt vaan ne molemmat outputit jokaiseen if-ehtoon ja niin että ehtojen alueet eivät mene päällekäin, ja ketjuttaa if-elsenä..
 

mk

Aktiivinen jäsen
Viestejä
629
#60
Vs: arduino pwm

Aivan.

Koodi:
if (realPower < 1700)
{
  digitalWrite(upPin7, LOW);
  digitalWrite(upPin8, LOW);
}
else
{
  digitalWrite(upPin7, HIGH);
  if (realPower >= 3400)
    digitalWrite(upPin8, HIGH);
  else
    digitalWrite(upPin8, LOW);
}
7 low < 1700 > high
8 low < 3400 > high
 
Viestejä
1 553
#61
Vs: arduino pwm

Itse viskaisin tosin luettavuuden takia homman per-pin, eikä per range (pääsee eroon samalla noista sisäkkäisistä if lausekkeista). Riippuen tietysti miten muu koodi on sählätty. Omina funktioinaan vielä kivempi. Toiminnallisuuden takia tosin täysin turhaa.

Koodi:
// PIN7 adjustment
if(realPower < 1700)
  digitalWrite(upPin7, LOW);
else
  digitalWrite(upPin7, HIGH);

// PIN8 adjustment
if(realPower >= 3400)
    digitalWrite(upPin8, HIGH);
else
    digitalWrite(upPin8, LOW);
 
J

jolla

Vieras
#62
Vs: arduino pwm

burmanm sanoi:
Itse viskaisin tosin luettavuuden takia homman per-pin, eikä per range (pääsee eroon samalla noista sisäkkäisistä if lausekkeista). Riippuen tietysti miten muu koodi on sählätty. Omina funktioinaan vielä kivempi. Toiminnallisuuden takia tosin täysin turhaa.

Koodi:
// PIN7 adjustment
if(realPower < 1700)
  digitalWrite(upPin7, LOW);
else
  digitalWrite(upPin7, HIGH);

// PIN8 adjustment
if(realPower >= 3400)
    digitalWrite(upPin8, HIGH);
else
    digitalWrite(upPin8, LOW);
tuossa 7 pinni jää pystyyn yli 3400
 
Viestejä
1 553
#63
Vs: arduino pwm

jolla sanoi:
tuossa 7 pinni jää pystyyn yli 3400
Niin se jäi tuossa edellisessäkin (josta siis otin mallia). Eikö sen pitänyt? Siinä tapauksessa toki laitat tuonne yhden else if lausekkeen pin7 kohdalle tai if(realPower < 1700 || realPower >= 3400)
 
J

jolla

Vieras
#64
Vs: arduino pwm

nyt nuo pelaa kahdella arduinolla, tietysti tuohon osaava voisi upottaa koodiin, mutta yleensä kun niin teen se ei tiedä hyvää

käytän
https://openenergymonitor.org/forum-archive/node/1757.html
scriptiä
Mk2_PV_Router_mini_3.
 

tj86430

Aktiivinen jäsen
Viestejä
607
#65
Vs: arduino pwm

Jos ajattelee toimivuuden lisäksi luettavuutta ja ylläpidettävyyttä, niin itse kyllä lukisin/ylläpitäisin mielelläni jotain tämän tyyppistä:

Koodi:
UPPER_BOUNDARY_BOTH_LOW = 1700;
UPPER_BOUNDARY_SEVEN_LOW_EIGHT_HIGH = 3400;
UPPER_BOUNDARY_BOTH_HIGH = 6000;

if (realPower < UPPER_BOUNDARY_BOTH_LOW) {
    digitalWrite(upPin7, LOW);
    digitalWrite(upPin8, LOW);
}
else if (realPower >= UPPER_BOUNDARY_BOTH_LOW && realPower < UPPER_BOUNDARY_SEVEN_LOW_EIGHT_HIGH) {
    digitalWrite(upPin7, LOW);
    digitalWrite(upPin8, HIGH);
}
else if (realPower >= UPPER_BOUNDARY_SEVEN_LOW_EIGHT_HIGH && realPower < UPPER_BOUNDARY_BOTH_HIGH {
    digitalWrite(upPin7, HIGH);
    digitalWrite(upPin8, HIGH);
}
else {
    digitalWrite(upPin7, LOW);
    digitalWrite(upPin8, LOW);
}
Nuo vakiot voi tietysti nimetä mieleisikseen ja jotenkin kuvaavammin ja lyhyemmin.
 
J

jolla

Vieras
#66
Vs: arduino pwm

burmanm sanoi:
Niin se jäi tuossa edellisessäkin (josta siis otin mallia). Eikö sen pitänyt? Siinä tapauksessa toki laitat tuonne yhden else if lausekkeen pin7 kohdalle tai if(realPower < 1700 || realPower >= 3400)
vaihdoin tuonne Vastaus #55 edellisellä sivulla nyt toimivan koodin, varmaan sen voi tehdä monellakin tavoin, etenkin jos siinä olisi jotain muutakin
 
J

jolla

Vieras
#67
Vs: arduino pwm

repomies sanoi:
No sitten se kai pelaa. Toivottavasti ei haittaa että realpowerin lipsahtaessa arvoon 6000 tai enemmän, molemmat outputit putoaa alas.

Sellainen kommentti vielä että tuolla välillä 3400-6000 se pin7 räpsähtää ensin alas ihan mikroskooppiseksi ajaksi kunnes tuo jälkimmäinen if-lauseke ajetaan ja se nostaa sen ylös. Nyt riippuen siitä mitä tehdään tämän jälkeen se joko on ongelma tai ei ole. Jos noita iffejä ajetaan tiukassa loopissa niin se räpsyy ylös-alas jatkuvasti tuolla välillä. Eli tee se if-else-if-else ketju kuten ehdotin niin tätä ei tapahdu. Voin toki illemmalla näyttää miten, jos harjoitus ei suju.
ei ole minkäälaista haittaa tässä tapauksessa, mittarissa ei edes vaihtumisia huomaa
 

repomies

Hyperaktiivi
Viestejä
7 277
#68
Vs: arduino pwm

tj86430 sanoi:
Jos ajattelee toimivuuden lisäksi luettavuutta ja ylläpidettävyyttä, niin itse kyllä lukisin/ylläpitäisin mielelläni jotain tämän tyyppistä:

Koodi:
UPPER_BOUNDARY_BOTH_LOW = 1700;
UPPER_BOUNDARY_SEVEN_LOW_EIGHT_HIGH = 3400;
UPPER_BOUNDARY_BOTH_HIGH = 6000;

if (realPower < UPPER_BOUNDARY_BOTH_LOW) {
    digitalWrite(upPin7, LOW);
    digitalWrite(upPin8, LOW);
}
else if (realPower >= UPPER_BOUNDARY_BOTH_LOW && realPower < UPPER_BOUNDARY_SEVEN_LOW_EIGHT_HIGH) {
    digitalWrite(upPin7, LOW);
    digitalWrite(upPin8, HIGH);
}
else if (realPower >= UPPER_BOUNDARY_SEVEN_LOW_EIGHT_HIGH && realPower < UPPER_BOUNDARY_BOTH_HIGH {
    digitalWrite(upPin7, HIGH);
    digitalWrite(upPin8, HIGH);
}
else {
    digitalWrite(upPin7, LOW);
    digitalWrite(upPin8, LOW);
}
Nuo vakiot voi tietysti nimetä mieleisikseen ja jotenkin kuvaavammin ja lyhyemmin.
Juuri tätä ratkaisua yritin ehdotella, ja juuri samasta syystä - näkee heti miten se toimii. Noita vakioita en tässä olisi jaksanut välttämättä laittaa, mutta parempi niiden kanssa tietysti.
 

mk

Aktiivinen jäsen
Viestejä
629
#69
Vs: arduino pwm

jolla sanoi:
tuossa 7 pinni jää pystyyn yli 3400
Niin sen siinä vaiheessa pitikin jäädä.
Lisäsit 3400-4300 välin myöhemmin, joka selkeästi indikoi, että olet oppinut, ainakin jotain.

Monilla tavoilla voi toki asian hoitaa, mutta suoraviivainen on yleensä paras.

Mutkia kannattaa ruveta miettimään aikaisintaan silloin kun tekstiä joutuu alvariinsa vierittämään.
Tai kun sulautetuissa järjestelmissä tila loppuu, mikä vanhemmille on pelkästään paluuta menneeseen.
 
J

jolla

Vieras
#70
Vs: arduino pwm

mk sanoi:
Niin sen siinä vaiheessa pitikin jäädä.
Lisäsit 3400-4300 välin myöhemmin, joka selkeästi indikoi, että olet oppinut, ainakin jotain.

Monilla tavoilla voi toki asian hoitaa, mutta suoraviivainen on yleensä paras.

Mutkia kannattaa ruveta miettimään aikaisintaan silloin kun tekstiä joutuu alvariinsa vierittämään.
Tai kun sulautetuissa järjestelmissä tila loppuu, mikä vanhemmille on pelkästään paluuta menneeseen.
juu, hyvin huonosti artikuloin koko homman kun äkkiä sain inspiksen aamupäivällä että koeilenkin tällä keinoin ja tekasen scriptinpätkän ja testaan, mutta kun se ei vanhalta eläkeläisukolta heti onnistunut, enkä muistanut että vuosi sitten väänsin jokseenkin samanlaisen solartrackeriin ja savukaasulla toimivaan......niin pyysin röyhkeästi apua täältä ja samalla se muuttui ja kehittyi avullanne varsin nopeasti toimivaksi
näillä kymmenillä en todellakaan opi enää mitään vaan täysin päinvastoin, kaikki se vähäinenkin opittu tieto katoaa vauhdilla
kiitos neuvoista ja vinkeistä kaikille, olivat tarpeen jälleen ja täällä ne on luettavissa kun taas tulee seuraava blackout

lisää
alkuperäiseen ongelmaan, miksi koko ketjun avasin, löytyy selitys https://learn.openenergymonitor.org/pv-diversion/mk2/switchdev
elikkä kun tehot nousi, triacin aiheuttama häiriö sekoitti ct anturien arvot ja vielä tuossa alkuperäisessä kokoonpanossa oli useampien ct anturien laskutoimitukset jotka on korvattu tuotto/kulutus saman anturin läpi jolloin laskutoimitus jää pois
mk2pv ei toimi ilman näitä lisäviritelmiä toivotulla tavalla tässä paikassa moitteetta kuin pienillä virtamäärillä, paremmassa sähköverkossa saattaa toimia ja eihän sitä edes välttämättä huomaa jos ei mittauksin seuraa
 
J

jolla

Vieras
#71
Vs: arduino pwm

mietin tässä mielessäni, tarvitseeko noita kahta ylä limittiä koko koodiissa lainkaan, riittäisikö pelkät kynnykset? tuossa mk' n mallissahan niitä ei ole
 

repomies

Hyperaktiivi
Viestejä
7 277
#72
Vs: arduino pwm

^ todennäköisesti ei tarvitse kaikkein ylintä limittiä (UPPER_BOUNDARY_BOTH_HIGH), itse en olisi ehkä laittanut moista. Mutta keskelle sellaisen tarvitset (UPPER_BOUNDARY_SEVEN_LOW_EIGHT_HIGH), muuten joudut koodaamaan hankalammin luettavan ratkaisun kuin mikä tuo tj86430 antama erinomainen "repomies approved +1" vastaus oli.
 

mk

Aktiivinen jäsen
Viestejä
629
#73
Vs: arduino pwm

Kyllä ja ei.
Tässähän on kyse tehon jaosta, eikä ylärajalle ole tarvetta.
Vastaavasti ala-raja on 0, eikä sitäkään ole missään mainittu.

#60 kertoo vaihtoehdot.
Aluevaihtoehdossa voi koodata pelkän alueen rajan.
Pinnivaihtoehdossa täytyy koodata toiminta-alue.
Molemmissa vaihtoehdoissa alin ja ylin raja sisältää myös sen toisen(min ja max) arvon.

Toisten mielestä dokumentointi on varsinaista koodia tärkeämpää.
Vaikka kuvaavat nimet on puuduttavia niin niitä kannattaa viljellä.
Ja jos joskus tulee vaikka kolmas vastus niin selkeys säilyy.
Esim. vastukset_000, vastukset_100 tai vastukset_HLH, jne.
Selkeyttä lisää myös se, että jättää laskun näkyviin.
Esim. kolmio_1 = 1234 + 1200, kolmio_2 = 1234 + 600, jne.
 
J

jolla

Vieras
#74
Vs: arduino pwm

koko päivän satanut, kyllä sieltä näköjään sateellakin käyttösähköt heruu vielä
tuosta kuvasta näkee että aika hyvin nollilla pysyttelee
 

Liitteet

Ylös Bottom