|
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
marko11 Član
Pridružen-a: Ned 14 Dec 2003 17:47 Prispevkov: 879 Aktiv.: 3.83 Kraj: Dobrepolje
|
Objavljeno: Sob Jan 28, 2023 4:57 pm Naslov sporočila: Arduino Nano- stanje releja |
|
|
Hi
Spodaj pripet program deluje OK, po mojih pričakovanjih. Program zapisuje KWh na SD kartico v obdobju 15.minut, zapiše tudi datum in uro, ter zunanjo temperaturo.
Pulz iz števca prihaja na prekinitveni pin D2 (int0)
To je poraba toplotne črpalke.
Rad pa bi še, da mi izpisuje na SD kartico še podatek kdaj se vklopi odtaljevanje (defrost).
Probal sem že razne načine pa mi ne uspe napisati kode za ta del.
Kako naj deluje:
ko se vklopi odtaljevanje pritegne Rele in on drži cca 5-10 minut. Preko kontaktov releja imam pullup vezavo na Arduino Nano pin D6. Mora pa še vedno delovati zapis porabe.
Rad bi samo to, ko Rele potegne, da se v tem trenutku zapišejo na SD kartico podatki datum in čas vklopa releja, ter zunanja temperatura, ter besedica " ON " in to samo enkrat pri vklopu releja in to je vse.
Pri meni pa to stalno zapisuje, nikakor mi ne uspe samo en zapis.
Prosim za kakšen dober namig. Hvala.
lp, marko
Koda: |
void loop() {
dt = clock.getDateTime();
sensors_zunaj.requestTemperatures ();
float t1 = sensors_zunaj.getTempCByIndex (0);
if ((stevec_1 == 900) && (Zastavica == 0)){ // 900 = 15 min
stevec_1 = 0;
Serial.println(x, DEC); //print x to serial monitor
sensors_zunaj.requestTemperatures ();
float t1 = sensors_zunaj.getTempCByIndex (0);
Serial.println (t1);
P = (a / 0.25);
P = P * 1000;
dt = clock.getDateTime();
Serial.print("Datum in ura: ");
Serial.print(dt.year); Serial.print("-");
Serial.print(dt.month); Serial.print("-");
Serial.print(dt.day); Serial.print(" ");
Serial.print(dt.hour); Serial.print(":");
Serial.print(dt.minute); Serial.print(",");
Serial.print(dt.second); Serial.println("");
Serial.print(kWh,4); // napiši izračunano vrednost kWh ob prekinitvi
Serial.print(" skupne kWh ");
Serial.println("");
Serial.print(a,4);
Serial.print(" kWh v 15 minutah ");
Serial.println("");
Serial.print(P);
Serial.print(" Wati v 15 minutah ");
Serial.println("");
myfile = SD.open("arduino.txt", FILE_WRITE);
if(myfile){ // izpisi na SD kartico
myfile.print(dt.day); myfile.print(".");
myfile.print(dt.month); myfile.print(".");
myfile.print(dt.year); myfile.print("; ");
myfile.print(dt.hour); myfile.print(":");
myfile.print(dt.minute); myfile.print(",");
myfile.print(dt.second); myfile.print("; ");
myfile.print(kWh,4);
myfile.print("; ");
myfile.print(a,4);
myfile.print("; ");
myfile.print(P);
myfile.print("; ");
myfile.println(t1);
myfile.close();
a = 0.0000;
}
}
}
// ==================================================================
void ISR_meritev() {
Zastavica = 1;
x++;
kWh = kWh + Pulz;
a = a + Pulz;
Zastavica = 0;
}
|
|
|
Nazaj na vrh |
|
|
lojzek Član
Pridružen-a: Pet 25 Jan 2008 8:00 Prispevkov: 3366 Aktiv.: 16.46
|
Objavljeno: Ned Jan 29, 2023 8:58 am Naslov sporočila: |
|
|
Detekcijo odtaljevanja bi jaz naredil z eno pomožno spremenljivko. Ko program prvič zazna odtaljevanje, izvede potrebno kodo, potem pa še pomožno spremenljivko postavi na 1. Ko je ta pomožna spremenljivka na 1, naj program ne preverja, če je odtaljevanje v teku. Ko program zazna konec odtaljevanja (rele =0), pomožno spremenljivko postavi na 0 in spet dovoli preverjanje vklopa odtaljevanja.
Nisem pa gledal celega tvojega programa, Arduino jezika ne znam. |
|
Nazaj na vrh |
|
|
marko11 Član
Pridružen-a: Ned 14 Dec 2003 17:47 Prispevkov: 879 Aktiv.: 3.83 Kraj: Dobrepolje
|
Objavljeno: Sre Feb 01, 2023 12:38 pm Naslov sporočila: |
|
|
Nekako mi je uspelo. V void loop() sem vstavil del kode, ki je spodaj in zaenkrat deluje kar v redu.
Verjetno se da celotno kodo še izboljšati..... kako, ja pa premalo znanja.
Pomanjkljivos je to, da včasih, ko potegne rele vpiše po dva rezultata, me pa to ne moti.
Koda: |
buttonState = digitalRead(buttonPin);
if (buttonState != lastButtonState) {
if(buttonState == LOW) {
buttonPushCounter++;
Serial.println("ON");
Serial.print("število pritiskov: ");
Serial.println(buttonPushCounter);
myfile = SD.open("arduino.txt", FILE_WRITE);
if(myfile){ // izpisi na SD kartico
myfile.print(dt.day); myfile.print(".");
myfile.print(dt.month); myfile.print(".");
myfile.print(dt.year); myfile.print("; ");
myfile.print(dt.hour); myfile.print(":");
myfile.print(dt.minute); myfile.print(",");
myfile.print(dt.second); myfile.print("; ");
myfile.print(0, DEC);
myfile.print("; ");
myfile.print(0, DEC);
myfile.print("; ");
myfile.print(0, DEC);
myfile.print("; ");
myfile.print(t1);
myfile.print("; ");
myfile.println(9, DEC);
myfile.close();
}
} else {
Serial.println("OFF");
}
delay(500);
}
lastButtonState = buttonState;
|
lp, marko |
|
Nazaj na vrh |
|
|
mato1111 Član
Pridružen-a: Pet 28 Dec 2012 14:42 Prispevkov: 614 Aktiv.: 4.25 Kraj: Vrhnika
|
Objavljeno: Sre Feb 01, 2023 1:20 pm Naslov sporočila: |
|
|
marko11 je napisal/a: |
Pomanjkljivos je to, da včasih, ko potegne rele vpiše po dva rezultata... |
Mogoce je vzrok odskakovanje kontakta (debounce). Programsko resis tako, da beres vhod recimo vsakih 40ms namesto v vsaki zanki. |
|
Nazaj na vrh |
|
|
lojzek Član
Pridružen-a: Pet 25 Jan 2008 8:00 Prispevkov: 3366 Aktiv.: 16.46
|
Objavljeno: Sre Feb 01, 2023 6:05 pm Naslov sporočila: |
|
|
Da, pri vseh tipkah, relejih, stikalih enkoderjih,... skratka pri vseh kontaktih na vhodu mikrokontrolerja je potrebno narediti debounce. Hardverski, softverski, ali pa oba skupaj. |
|
Nazaj na vrh |
|
|
NacMan Član
Pridružen-a: Čet 12 Jul 2007 20:01 Prispevkov: 30 Aktiv.: 0.14 Kraj: Krško
|
Objavljeno: Sre Feb 01, 2023 9:44 pm Naslov sporočila: |
|
|
Lahko samo tole razložiš (iz prvega post-a, v tvoji glavni zanki?
Koda: |
P = (a / 0.25);
P = P * 1000;
|
In še: O kakem števcu je govora, tisti ki pošlje pulz, in sproži ISR...
Koda: |
void ISR_meritev() {
Zastavica = 1;
x++;
kWh = kWh + Pulz;
a = a + Pulz;
Zastavica = 0;
}
|
Hvala. _________________ love the smell of a napalm in the morning |
|
Nazaj na vrh |
|
|
marko11 Član
Pridružen-a: Ned 14 Dec 2003 17:47 Prispevkov: 879 Aktiv.: 3.83 Kraj: Dobrepolje
|
Objavljeno: Pet Feb 03, 2023 12:30 pm Naslov sporočila: |
|
|
NacMan je napisal/a: |
Lahko samo tole razložiš (iz prvega post-a, v tvoji glavni zanki?
Koda: |
P = (a / 0.25);
P = P * 1000;
|
In še: O kakem števcu je govora, tisti ki pošlje pulz, in sproži ISR...
Koda: |
void ISR_meritev() {
Zastavica = 1;
x++;
kWh = kWh + Pulz;
a = a + Pulz;
Zastavica = 0;
}
|
Hvala. |
Tukaj pretvorim kWh v Watte porabljenih v 15 minutah
Razlaga: (1/60)*15min=0,25h
Primer: P=(0,195kWh/0,25h) = 0,780 kW
P= 0,780*1000= 780W
Imam števec porabe kWh, ki daje 400 pulzov za kWh.
Lp, |
|
Nazaj na vrh |
|
|
NacMan Član
Pridružen-a: Čet 12 Jul 2007 20:01 Prispevkov: 30 Aktiv.: 0.14 Kraj: Krško
|
Objavljeno: Pet Feb 03, 2023 1:44 pm Naslov sporočila: |
|
|
Ok, sem nekako tako predvideval
Hvala za razlago. Zanimiv projekt. _________________ love the smell of a napalm in the morning |
|
Nazaj na vrh |
|
|
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 275 dni
Powered by phpBB © 2001, 2005 phpBB Group
|