Fórum témák
- • Internetes rádióvevő
- • Felajánlás, azaz ingyen elvihető
- • Akkumulátor töltő
- • Elektronikai témájú könyvek újságok
- • Rádióamatőrök topikja
- • LED szalag
- • Klíma szervizelés, javítás
- • TDA7294 végerősítő
- • Háromfázisú aggregátor
- • Elfogadnám, ha ingyen elvihető
- • Nagyfeszültségű tápegység
- • Szintetizátor javítás
- • Alternativ HE találkozó(k)
- • Kondenzátor
- • Dobozolási technikák, műszerdobozok
- • Boombox javítás
- • Sütő javítás
- • 3D nyomtatás
- • Erősítő mindig és mindig
- • Arduino
- • Mosógép vezérlők és általános problémáik
- • Számítógép hiba, de mi a probléma?
- • Hangszórójavítás (otthon)
- • Laptop javítás, tuning
- • Elektromos távirányítós kapunyitó
- • Autós erősítős kérdések, problémák
- • Mikrohullámú sütő javítás, magnetron csere, stb.
- • Villanymotor
- • Vegyes barkácsfogások
- • Digitális óra
- • Hűtőgép probléma
- • TV hiba, mi a megoldás?
- • Szünetmentes táp javítása, élesztése
- • Erősítő építése elejétől a végéig
- • Műhelyünk felszerelése, szerszámai
- • Kombikazán működési hiba
- • Függvénygenerátor építése
- • SMD, mi a típusa?
- • Hibrid erősítő
- • Suzuki Swift elektronika
- • Videomagnó problémák
- • Általános antennás kérdések, válaszok
- • Érdekességek
- • STK erősítők javítások
- • DC-DC konverter max. kapacitív terhelése
- • Audiofil, High End Audio
- • Központi fűtés (vezérlés)
- • IMI villanymotor
- • Borhűtő vezérlő panel
- • Androidos okos telefonok
- • Klíma beszerelése, fűtés-hűtés házilag
- • Súlymérés
- • Varrógép elektronika
- • Analóg oszcilloszkóp javítása
- • Videoton EA-7386-s erösítő
» Több friss téma
|
A klónok CH340 Soros-USB illesztőjének drivere ( Letöltés)
Szia!
Melyik változóid kapcsolgatják a reléket? Ezt megmondanád még? Valahol a program elején is lesz valami gond ezzel. Remélem, hogy az if szerkezetek amiket mondtam azok kapcsolják az ital reléit. Eddig ezt gondoltam, de nem vagyok 100%-ban biztos most már..
Még az is lehet, hogy azon a helyen, mint pl.: If vodka==1 az egy másik if-belseje és ne is fut le. Ennyire nem ismerem a kódodat.
Ezért javasoltam én is, hogy szétszedve esetleg könnyebb lenne de lehet, hogy most már nem lenne kifizetődő!
Sziasztok! Egy viszonylag egyszerű, de "jól kell sikerülnie elsőre" projekt miatt kérem a tanácsotokat. Adott a képen látható szekrénysor, a felső részébe egyszínű 4000K-s LED világítást szeretnék varázsolni. Mikrokapcsolókkal érzékelném az ajtónyitást, 4 eres lapos fekete vezeték (telefonkábel) egy érpárját használnám, ezek mind arduino lábakhoz kapcsolódnának (esetleg multiplexelve?). A 3 elem, amin nincs ajtó, akkor kapcsolódna fel, ha belép valaki a szobába, és adott idő, vagy gombnyomás után le. Az LG Magic Remote egy gombját használnám, tehát RF kapcsolattal. Mivel nem vezet fel semmilyen elem vagy vezeték, így 2db meglévő 12V 7Ah akksit használnék felváltva. A szekrény tetején a plafon felé irányítva egy 12V-os WS2812 szalag lenne, mikrofonvezérelt módban, FET-tel kikapcsolva alapesetben. Az elemekben az egyenletesebb fényelosztás miatt LED szalagok lennének, elemenként 2 csík (a polcok miatt néhol 4, 30 led/méter). A kérdéseim:
1, PIR lenne a legjobb a mozgásérzékelésre? Sleep módból ez fel tud kelteni egy kontrollert? Mennyit fogyaszt kb. nyugalomban? 2 szenzorral (a szekrény bal szélére tenném őket, oldalról nézne a nappaliajtóra, szűkre maszkolva a szögüket) tudom mérni, hogy ki-vagy bemegy valaki, tehát számolni, hogy van-e valaki bent?
2, Dimmelés szerintem csak az ajtónyitás utáni 1-2 másodpercben lenne, akkor így "IRL" FET-ek mehetnek közvetlenül a pinekre, nem kell FET meghajtó átamkör?
3, Fognak a FETek érezhetően melegedni, ha szinte csak kapcsolók? Rossz esetben 1,6m LED/FET, az kb. 7W, 0,6A. Arra gondoltam, hogy egy hosszúkás, de kisebb felületű bordára felteszem az összeset, egy termisztorral figyelve, ha szerintetek az szükséges.
4, Lehet-e a PIR modult, RF modult lekapcsolni energiamegtakarítás érdekében, ha éppen nem kell figyelniük? Milyen módszerrel?
A lényeg:
8 kimenő FET, 9 mikrokapcsoló, 2 PIR, ws2812, RF szenzor, mikrofon, akku-ellenőrző áramkör. Az idő legnagyobb részében sleep mode, ami általában a PIR megszakítására ébredne, majd 5 perc múlva pl. újra sleep módba lépne, ha nem történik semmi. Viszont ilyenkor sleepben az RF-re is reagálnia kellene (amíg a PIR szerint valaki van a szobában, tehát 3 interrupt). Melyik a legjobb, legkevesebbet fogyasztó arduino IDE-vel programozható chip erre a feladatra?
Köszönöm, hogy elolvastad!
Az akkumulátoros üzemmódot gyorsan meg fogod unni.
Köszönöm a választ a kérdéseimre. Ha a 3 nyitott rész megy teljes fényerőn, az 1A, abból kb. 5 órát bírnia kellene. Amit elfelejtettem leírni, hogy egy LDR is lenne majd benne, hogy teljes világosságban ne merítse magát. Mivel alkalmanként megy pl 3-5 percet, a szekrények meg akkor vannak nyitva 10-15 másodpercre, amikor keresünk benne valamit, hetekig bírnia kell jól megírt sleep móddal.
1: Automata helységvilágítás. Kb. bármivel fel lehet kelteni egy kontrollert.
2: A helységvilágítás dimmelésének látomértelmét, a szekrényekét már nem annyira. Ebben az esetben utóbbihoz elég csak egy mikrokapcsoló.
3: Ha dimmeléshez nem használsz túl nagy PWM frekvenciát, akkor nem fognak melegedni a FET-ek. 200 - 250 Hz elég, ha nem akartok filmet forgatni a szobában.
4: Én a helységvilágításra használnék egy normál kapcsolót a falon és azt egészíteném ki távirányítóval, alternatív kapcsolással.
5: Az akkumulátoros üzemmódot gyorsan meg fogod unni. Olyan lesz, mint az akkus csavarozó. Tök jó, de általában akkor merül le, amikor három kézzel fogod a munkadarabot miután nagynehezen a helyére igazítottad, a negyedikkel a csavart és az ötödik kezedben van a gép.
A kontroller fogyasztása ebben a rendszerben minimális lesz, szinte mindegy is, hogy altatod-e vagy sem. A mikrofont mire akarod kötni? Dobbantasz egyet/leejtesz valamit a szobában és fel- vagy lekapcsolódik a világítás. Játéknak jó, világítást vezérelni vele, nem is tudom...
Idézet: „1, PIR lenne a legjobb a mozgásérzékelésre? Sleep módból ez fel tud kelteni egy kontrollert? Mennyit fogyaszt kb. nyugalomban? 2 szenzorral (a szekrény bal szélére tenném őket, oldalról nézne a nappaliajtóra, szűkre maszkolva a szögüket) tudom mérni, hogy ki-vagy bemegy valaki, tehát számolni, hogy van-e valaki bent?”
Ha követni akarod a bentlévők számát, arra éppen a PIR nem a legjobb. Ő csak azt tudja, hogy van-e mozgás, és ha igen akkor ad egy kontaktot. A fogyasztása nem számottevő amúgy, van olyan riasztó érzékelő, ami akkumulátorról megy, rádiós és PIR. Nyilván nem mászik fel senki szívesen a sarkokba elemet cserélni.
Ha kell a számlálás, akkor inkább infrakaput használnék erre, vagy együtt a két módszert. Az infrakapu is fog tévedni, elég ha arra gondolunk, hogy pont az ajtóban sikerül megállnod, aztán meggondolod magad egy sörért. Itt lehetne például azt, hogy az infra ébreszt, és ha a PIR is megszólal, akkor bent van valaki, amíg az infra azt nem mondja hogy kiment. Ennek is vannak még buktatói, át kell gondolni.
Idézet: „4, Lehet-e a PIR modult, RF modult lekapcsolni energiamegtakarítás érdekében, ha éppen nem kell figyelniük? Milyen módszerrel?”
Legrosszabb esetben elveszed tőlük a tápot, aztán ha szükséges akkor újrainicializálod (RF).
Erre a feladatra nem kell nagy tempó, szóval azt is megteheted, hogy visszaveszed az órajelet a uC-ben, és annyival kevesebbet fog fogyasztani.
2.) Ha nem túl nagy az áram és a frekvencia, elég a soros és GND-re lehúzó ellenállás.
Én minden LED-es lámpámnál bekapcsoláskor kb. 0.5-1mp alatt dimmelem fel a fényerőt, lekapcsoláskor kicsit lassabban kapcsolom ki. Sokkal kellemesebben hat, mint ha ms-ok alatt mint a villámnál bevillan a lámpa. Kicsit olyan, mintha a hagyományos izzót utánozná.
Azt kellene még átgondolni, hogy lesz-e hajnali öltözködés a szekrényből, amikor a szobában más még aludni szeretne, de minden szekrény nyitásra az arcába világít több Watt-nyi LED...
Nem tudom, hogy az Arduino korrekten támogatja-e az alvó üzemmódot, de én eddig csak Arduino alatt a regiszterek piszkálásával használtam, jól is működött. Viszont a panelon található LED-eket ki kell forrasztani, USB-soros konvertereket le kell választani (vagy mini pro-t kell venni)! Különben nem ér az egész altatás semmit.
3). 0.6A-re nem kell se TO-220-as tok, se borda NTC-vel. AO3400-et nézd meg.
1, messze van az ajtó, nem akarok kábelezni, minél letisztultabbra hagynám a szobát, úgyis kerül bele majd mindenféle "lom"
2, A szekrénynél én is annyira látom csak értelmét, ahogy Kovidivi írta, bekapcsoláskor néhány másodperc alatt növelni a fényerőt 100%-ra.
4, Eglo WW+CW+RGB távirányítós lámpa van a mennyezeten, ebben is egyetértünk.
A mikrofont a tévéhez közeli polcok alá vinném le, és ha Spotify megy róla akkor bekapcsolnám a WS-eket, és kb. ilyen lenne.
sargarigo: igen, az infrakapu lenne a legjobb, csak megjnt a szemben lévő falon való tükrözés, kábelezés miatt ejtettem ki. Mondjuk úgyis csak az a kritikus, hogy fel kell-e kelnie alvó módból vagy nem, arra meg elég a mozgásérzékelés is, nem kell feltétlenül számolni.
Kovidivi: ez nappali lesz, itt nem alszunk majd, szerencsére ez nem tényező. Inkább társasjátékok, könyvek, ajándékba kapott borok, ritkán használt dolgok lesznek, ezért is reménykedem egy relatíve jó üzemidőben.
Köszönöm az eddigi válaszaitokat!
Akkor a legegyszerűbbnek az tűnik, hogy a PIR indít, aztán öt perc után lekapcsol. Ha a PIR megint jelez akkor újabb öt perc, tehát újraindul a késleltetés. Ide igazából lehet hogy felesleges a uC is.
Köszönöm a segítséget, de a javasolt változatok is csak nullát adnak nekem.
( Megkerültem a problémát, így már működik: if (Kar=="A") )
Az if szerkezeteket amit mondtál azokat beleraktam. (remélem jól) itt a kód:
#include<LCD.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
#define DOUT A0 // DT
#define CLK A1 // SCK
#define clk 2
#define dt 3
#define sw 4
#define in1 5
#define in2 6
#define in3 7
#define in4 8
#define in5 9
#define in6 10
#define in7 11
#define in8 12
#define in9 13
volatile boolean TurnDetected;
volatile boolean up;
bool doonce = 0;
char screen = 0;
boolean changestate = 0;
long weight;
int pump1ml = 0;
int pump2ml = 0;
int pump3ml = 0;
int pump4ml = 0;
int pump5ml = 0;
int pump6ml = 0;
int pump7ml = 0;
int pump8ml = 0;
byte Vodka = 0;
byte Jager = 0;
byte Vorosbor = 0;
byte Rosebor = 0;
byte Narancs = 0;
byte Cola = 0;
byte Bodza = 0;
byte Whisky = 0;
void isr0 () {
TurnDetected = true;
up = (digitalRead(clk) == digitalRead(dt));
}
void setup() {
scale.begin(DOUT, CLK);
scale.set_scale();
scale.tare(); //Reset the scale to 0
lcd.begin(16, 2);
pinMode(sw, INPUT_PULLUP);
pinMode(clk, INPUT);
pinMode(dt, INPUT);
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
pinMode(in5, OUTPUT);
pinMode(in6, OUTPUT);
pinMode(in7, OUTPUT);
pinMode(in8, OUTPUT);
pinMode(in9, OUTPUT);
digitalWrite(in1, HIGH);
digitalWrite(in2, HIGH);
digitalWrite(in3, HIGH);
digitalWrite(in4, HIGH);
digitalWrite(in5, HIGH);
digitalWrite(in6, HIGH);
digitalWrite(in7, HIGH);
digitalWrite(in8, HIGH);
digitalWrite(in9, LOW);
attachInterrupt (0, isr0, RISING);
}
void loop() {
if (TurnDetected) {
delay(600);
doonce = 0;
if (changestate == 0) {
if (up) {
screen++;
if (screen > 8) {
screen = 8 ;
}
}
else {
screen = screen - 1;
if (screen < 0) {
screen = 0;
}
}
}
else {
if (up) {
switch (screen) {
case 0: pump1ml = pump1ml + 10;
break;
case 1: pump2ml = pump2ml + 10;
break;
case 2: pump3ml = pump3ml + 10;
break;
case 3: pump4ml = pump4ml + 10;
break;
case 4: pump5ml = pump5ml + 25;
break;
case 5: pump6ml = pump6ml + 25;
break;
case 6: pump7ml = pump7ml + 25;
break;
case 7: pump8ml = pump8ml + 10;
break;
}
}
else {
switch (screen) {
case 0: pump1ml = pump1ml - 10;
break;
case 1: pump2ml = pump2ml - 10;
break;
case 2: pump3ml = pump3ml - 10;
break;
case 3: pump4ml = pump4ml - 10;
break;
case 4: pump5ml = pump5ml - 25;
break;
case 5: pump6ml = pump6ml - 25;
break;
case 6: pump7ml = pump7ml - 25;
break;
case 7: pump8ml = pump8ml - 10;
break;
}
}
}
TurnDetected = false;
}
if (digitalRead(sw) == LOW) {
delay(600);
changestate = !changestate;
doonce = 0;
}
if (screen == 0 && doonce == 0) {
Vodka = 1;
lcd.clear();
lcd.print("Vodka");
lcd.setCursor(0, 1);
lcd.print(pump1ml);
lcd.setCursor(3, 1);
lcd.print("ml");
if (changestate == 0) {
lcd.setCursor(9, 0 );
lcd.print("Change?");
}
doonce = 1;
}
if (screen == 1 && doonce == 0) {
Jager = 1;
lcd.clear();
lcd.print("Jager");
lcd.setCursor(0, 1);
lcd.print(pump2ml);
lcd.setCursor(3, 1);
lcd.print("ml");
if (changestate == 0) {
lcd.setCursor(9, 0 );
lcd.print("Change?");
}
doonce = 1;
}
if (screen == 2 && doonce == 0) {
Vorosbor = 1;
lcd.clear();
lcd.print("Vorosbor");
lcd.setCursor(0, 1);
lcd.print(pump3ml);
lcd.setCursor(3, 1);
lcd.print("ml");
if (changestate == 0) {
lcd.setCursor(9, 0 );
lcd.print("Change?");
}
doonce = 1;
}
if (screen == 3 && doonce == 0) {
Rosebor = 1;
lcd.clear();
lcd.print("Rose bor");
lcd.setCursor(0, 1);
lcd.print(pump4ml);
lcd.setCursor(3, 1);
lcd.print("ml");
if (changestate == 0) {
lcd.setCursor(9, 0 );
lcd.print("Change?");
}
doonce = 1;
}
if (screen == 4 && doonce == 0) {
Narancs = 1;
lcd.clear();
lcd.print("Narancs");
lcd.setCursor(0, 1);
lcd.print(pump5ml);
lcd.setCursor(3, 1);
lcd.print("ml");
if (changestate == 0) {
lcd.setCursor(9, 0 );
lcd.print("Change?");
}
doonce = 1;
}
if (screen == 5 && doonce == 0) {
Cola = 1;
lcd.clear();
lcd.print("Cola");
lcd.setCursor(0, 1);
lcd.print(pump6ml);
lcd.setCursor(3, 1);
lcd.print("ml");
if (changestate == 0) {
lcd.setCursor(9, 0 );
lcd.print("Change?");
}
doonce = 1;
}
if (screen == 6 && doonce == 0) {
Bodza = 1;
lcd.clear();
lcd.print("Bodza");
lcd.setCursor(0, 1);
lcd.print(pump7ml);
lcd.setCursor(3, 1);
lcd.print("ml");
if (changestate == 0) {
lcd.setCursor(9, 0 );
lcd.print("Change?");
}
doonce = 1;
}
if (screen == 7 && doonce == 0) {
Whisky = 1;
lcd.clear();
lcd.print("Whiskey");
lcd.setCursor(0, 1);
lcd.print(pump8ml);
lcd.setCursor(3, 1);
lcd.print("ml");
if (changestate == 0) {
lcd.setCursor(9, 0 );
lcd.print("Change?");
}
doonce = 1;
}
if (screen == 8 && doonce == 0) {
lcd.clear();
if (changestate == 0) {
lcd.print("Start?");
doonce = 1;
}
else {
lcd.print("Wait!");
delay(2000);
weight = scale.read();
delay(100);
lcd.clear();
lcd.print("Pump 1 ON");
digitalWrite(in1, LOW);
digitalWrite(in9, HIGH);
while (scale.read() - weight < 3000) {
if (Vodka==1)
lcd.clear();
lcd.print(pump1ml);
lcd.print("ml");
delay((pump1ml/11)*1000);
digitalWrite(in1, HIGH);
digitalWrite(in9, LOW);
delay(2000);
weight = scale.read();
delay(100);
lcd.clear();
lcd.print("Pump 2 ON");
digitalWrite(in2, LOW);
digitalWrite(in9, HIGH);
while (scale.read() - weight < 3000) {
}
Vodka = 0;
} {
if (Jager==1)
lcd.clear();
lcd.print(pump2ml);
lcd.print("ml");
delay((pump2ml/12)*1000);
digitalWrite(in2, HIGH);
digitalWrite(in9, LOW);
delay(2000);
weight = scale.read();
delay(100);
lcd.clear();
lcd.print("Pump 3 ON");
digitalWrite(in3, LOW);
digitalWrite(in9, HIGH);
while (scale.read() - weight < 3000) {
}
Jager = 0;
} {
if (Vorosbor==1)
lcd.clear();
lcd.print(pump3ml);
lcd.print("ml");
delay((pump2ml/12)*1000);
digitalWrite(in3, HIGH);
digitalWrite(in9, LOW);
delay(2000);
weight = scale.read();
delay(100);
lcd.clear();
lcd.print("Pump 4 ON");
digitalWrite(in4, LOW);
digitalWrite(in9, HIGH);
while (scale.read() - weight < 3000) {
}
Vorosbor = 0;
} {
if (Rosebor==1)
lcd.clear();
lcd.print(pump4ml);
lcd.print("ml");
delay((pump2ml/12)*1000);
digitalWrite(in4, HIGH);
digitalWrite(in9, LOW);
delay(2000);
weight = scale.read();
delay(100);
lcd.clear();
lcd.print("Pump 5 ON");
digitalWrite(in5, LOW);
digitalWrite(in9, HIGH);
while (scale.read() - weight < 3000) {
}
Rosebor = 0;
} {
if (Narancs==1)
lcd.clear();
lcd.print(pump5ml);
lcd.print("ml");
delay((pump2ml/12)*1000);
digitalWrite(in5, HIGH);
digitalWrite(in9, LOW);
delay(2000);
weight = scale.read();
delay(100);
lcd.clear();
lcd.print("Pump 6 ON");
digitalWrite(in6, LOW);
digitalWrite(in9, HIGH);
while (scale.read() - weight < 3000) {
}
Narancs = 0;
} {
if (Cola==1)
lcd.clear();
lcd.print(pump6ml);
lcd.print("ml");
delay((pump2ml/12)*1000);
digitalWrite(in6, HIGH);
digitalWrite(in9, LOW);
delay(2000);
weight = scale.read();
delay(100);
lcd.clear();
lcd.print("Pump 7 ON");
digitalWrite(in7, LOW);
digitalWrite(in9, HIGH);
while (scale.read() - weight < 3000) {
}
Cola = 0;
} {
if (Bodza==1)
lcd.clear();
lcd.print(pump7ml);
lcd.print("ml");
delay((pump2ml/12)*1000);
digitalWrite(in7, HIGH);
digitalWrite(in9, LOW);
delay(2000);
weight = scale.read();
delay(100);
lcd.clear();
lcd.print("Pump 8 ON");
digitalWrite(in8, LOW);
digitalWrite(in9, HIGH);
while (scale.read() - weight < 3000) {
}
Bodza = 0;
} {
if (Whisky)
lcd.clear();
lcd.print(pump8ml);
lcd.print("ml");
delay((pump3ml/12)*1000);
digitalWrite(in8, HIGH);
digitalWrite(in9, LOW);
delay(2000);
changestate = 0;
}
Whisky = 0;
} {
}
}
}
Helló!
Szerintem nem jól tetted bele. DE nem tudom már rendesen követni a kódod, mert elég nagy. A kapcsos zárójelek nem tetszenek, de nem tudom, hogy így szeretnéd.e hogy fusson a programod. Szerintem nem, de tévedhetek.
while (scale.read() - weight < 3000) {
'elindul a ciklus, eddig ok
if (Vodka==1) 'Itt nincs már kezdő { -jel. Ez az if nem tart sokáig szerintem.
lcd.clear(); 'Max eddig
lcd.print(pump1ml);
lcd.print("ml");
delay((pump1ml/11)*1000);
digitalWrite(in1, HIGH);
digitalWrite(in9, LOW);
delay(2000);
weight = scale.read();
delay(100);
lcd.clear();
lcd.print("Pump 2 ON");
digitalWrite(in2, LOW);
digitalWrite(in9, HIGH);
while (scale.read() - weight < 3000) {
}
Vodka = 0;
} { 'Az első lezárná a if (Vodka==1) -if-et, ha lenne nyitó az if után. Nyitsz egy újat { majd jön egy újabb if { nélkül. A programod lefut, mert szintaktikailag a {} párosok elfogadhatóak, de nem biztos, hogy úgy fut ahogy kell. Ekkora kódnál nem tudom lekövetni, hogy bizonyos programrészletek '{}-közötti részek' mire vonatkoznak.
if (Jager==1)
lcd.clear();
De lehet ehhez hasonlóan szeretnéd megoldani, de akkor nem értem a kódodat, mit miért kellene tennie.
A 300-sor körül:
while (scale.read() - weight < 3000) {
}
Vodka = 0;
} {
Az első } - lezárja a while (scale.read() - weight < 3000) { ciklust.
A második } lezárja a 282. sorban lévő while (scale.read() - weight < 3000) { ciklust.
Így is még valamilyen else ágban vagyunk. (273. sor) és jön egy ilyen megint: {
Nem tudom lekövetni már, ne haragudj.
Újra kezdem inkább az egészet és megpróbálom kicsit egyszerűbben felépíteni.
Eredetileg ez a kód olyan koktél keverőhöz lett volna ahol csak 3 ital van és ott fixen kellett mind a 3 ital, szóval egyiknél sem lett volna 0ml a kiválasztott érték. Én meg ezt bővítettem de így visszagondolva egyszerűbb lett volna újat írni.
Szerintem minden adott már hozzá, csak fel kell bontani több részre, hogy átláthatóbb legyen. Én külön függvény(ek)be tenném az ital(ok) kiválasztását, azt betenném egy külön .cpp és a hozzá tartozó .h fájlba, (főprogramba #include) majd azt tesztelném. Első lépésnek ezt írnám meg, majd a kijelzőre és a soros monitorra pakolnám a kiválasztott italokat/mennyiségeket. Így tesztelhető.
Második lépésként megírnám azt az 1 db függvényt, ami az argumentumában megkapja, hogy milyen italt kérnek és mennyit. (itt kapcsolgatná a kért reléket és mérné a mennyiségeket.) Így csak 1db jól működő függvény kell. (A nagy része gyakorlatilag meg is van ám írva neked!)
Ha így csinálod, a fő program elég rövid lesz!
Valójában nem sok kell ám már hozzá!
És hogy induljak el vele, ebben tudsz segíteni?
Beszállok én is ha nem gond!
Most éppen ráérek és gépnél is vagyok
Az első és legnagyobb hibát abban látom, hogy a kapcsos zárójelek össze vissza hemzsegnek! Van ahol nyitod, van ahol zárod és újranyitod, és sok helyen az if-eknél sincs rendben.
Első kanyarban újraformáztam, anélkül hogy bármi mást csináltam volna vele. Konkrétan ahol if, vagy while van, ott a sor végéről újsorba tettem a nyitó kapcsos zárójelet. Ezután nyomtam az arduino ide-ben, egy ctrl+t kombót, ez újraformázza a behúzásokat. Vedd észre, hogy pár helyen még ilyen is van:
Tehát a kódod újraformázva, de még piszkálás nélkül:
#include<LCD.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
#define DOUT A0 // DT
#define CLK A1 // SCK
#define clk 2
#define dt 3
#define sw 4
#define in1 5
#define in2 6
#define in3 7
#define in4 8
#define in5 9
#define in6 10
#define in7 11
#define in8 12
#define in9 13
volatile boolean TurnDetected;
volatile boolean up;
bool doonce = 0;
char screen = 0;
boolean changestate = 0;
long weight;
int pump1ml = 0;
int pump2ml = 0;
int pump3ml = 0;
int pump4ml = 0;
int pump5ml = 0;
int pump6ml = 0;
int pump7ml = 0;
int pump8ml = 0;
byte Vodka = 0;
byte Jager = 0;
byte Vorosbor = 0;
byte Rosebor = 0;
byte Narancs = 0;
byte Cola = 0;
byte Bodza = 0;
byte Whisky = 0;
void isr0 () {
TurnDetected = true;
up = (digitalRead(clk) == digitalRead(dt));
}
void setup() {
scale.begin(DOUT, CLK);
scale.set_scale();
scale.tare(); //Reset the scale to 0
lcd.begin(16, 2);
pinMode(sw, INPUT_PULLUP);
pinMode(clk, INPUT);
pinMode(dt, INPUT);
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
pinMode(in5, OUTPUT);
pinMode(in6, OUTPUT);
pinMode(in7, OUTPUT);
pinMode(in8, OUTPUT);
pinMode(in9, OUTPUT);
digitalWrite(in1, HIGH);
digitalWrite(in2, HIGH);
digitalWrite(in3, HIGH);
digitalWrite(in4, HIGH);
digitalWrite(in5, HIGH);
digitalWrite(in6, HIGH);
digitalWrite(in7, HIGH);
digitalWrite(in8, HIGH);
digitalWrite(in9, LOW);
attachInterrupt (0, isr0, RISING);
}
void loop() {
if (TurnDetected)
{
delay(600);
doonce = 0;
if (changestate == 0)
{
if (up)
{
screen++;
if (screen > 8)
{
screen = 8 ;
}
}
else
{
screen = screen - 1;
if (screen < 0)
{
screen = 0;
}
}
}
else
{
if (up)
{
switch (screen)
{
case 0: pump1ml = pump1ml + 10;
break;
case 1: pump2ml = pump2ml + 10;
break;
case 2: pump3ml = pump3ml + 10;
break;
case 3: pump4ml = pump4ml + 10;
break;
case 4: pump5ml = pump5ml + 25;
break;
case 5: pump6ml = pump6ml + 25;
break;
case 6: pump7ml = pump7ml + 25;
break;
case 7: pump8ml = pump8ml + 10;
break;
}
}
else
{
switch (screen)
{
case 0: pump1ml = pump1ml - 10;
break;
case 1: pump2ml = pump2ml - 10;
break;
case 2: pump3ml = pump3ml - 10;
break;
case 3: pump4ml = pump4ml - 10;
break;
case 4: pump5ml = pump5ml - 25;
break;
case 5: pump6ml = pump6ml - 25;
break;
case 6: pump7ml = pump7ml - 25;
break;
case 7: pump8ml = pump8ml - 10;
break;
}
}
}
TurnDetected = false;
}
if (digitalRead(sw) == LOW)
{
delay(600);
changestate = !changestate;
doonce = 0;
}
if (screen == 0 && doonce == 0)
{
Vodka = 1;
lcd.clear();
lcd.print("Vodka");
lcd.setCursor(0, 1);
lcd.print(pump1ml);
lcd.setCursor(3, 1);
lcd.print("ml");
if (changestate == 0) {
lcd.setCursor(9, 0 );
lcd.print("Change?");
}
doonce = 1;
}
if (screen == 1 && doonce == 0)
{
Jager = 1;
lcd.clear();
lcd.print("Jager");
lcd.setCursor(0, 1);
lcd.print(pump2ml);
lcd.setCursor(3, 1);
lcd.print("ml");
if (changestate == 0) {
lcd.setCursor(9, 0 );
lcd.print("Change?");
}
doonce = 1;
}
if (screen == 2 && doonce == 0)
{
Vorosbor = 1;
lcd.clear();
lcd.print("Vorosbor");
lcd.setCursor(0, 1);
lcd.print(pump3ml);
lcd.setCursor(3, 1);
lcd.print("ml");
if (changestate == 0)
{
lcd.setCursor(9, 0 );
lcd.print("Change?");
}
doonce = 1;
}
if (screen == 3 && doonce == 0)
{
Rosebor = 1;
lcd.clear();
lcd.print("Rose bor");
lcd.setCursor(0, 1);
lcd.print(pump4ml);
lcd.setCursor(3, 1);
lcd.print("ml");
if (changestate == 0)
{
lcd.setCursor(9, 0 );
lcd.print("Change?");
}
doonce = 1;
}
if (screen == 4 && doonce == 0)
{
Narancs = 1;
lcd.clear();
lcd.print("Narancs");
lcd.setCursor(0, 1);
lcd.print(pump5ml);
lcd.setCursor(3, 1);
lcd.print("ml");
if (changestate == 0)
{
lcd.setCursor(9, 0 );
lcd.print("Change?");
}
doonce = 1;
}
if (screen == 5 && doonce == 0)
{
Cola = 1;
lcd.clear();
lcd.print("Cola");
lcd.setCursor(0, 1);
lcd.print(pump6ml);
lcd.setCursor(3, 1);
lcd.print("ml");
if (changestate == 0) {
lcd.setCursor(9, 0 );
lcd.print("Change?");
}
doonce = 1;
}
if (screen == 6 && doonce == 0)
{
Bodza = 1;
lcd.clear();
lcd.print("Bodza");
lcd.setCursor(0, 1);
lcd.print(pump7ml);
lcd.setCursor(3, 1);
lcd.print("ml");
if (changestate == 0)
{
lcd.setCursor(9, 0 );
lcd.print("Change?");
}
doonce = 1;
}
if (screen == 7 && doonce == 0)
{
Whisky = 1;
lcd.clear();
lcd.print("Whiskey");
lcd.setCursor(0, 1);
lcd.print(pump8ml);
lcd.setCursor(3, 1);
lcd.print("ml");
if (changestate == 0)
{
lcd.setCursor(9, 0 );
lcd.print("Change?");
}
doonce = 1;
}
if (screen == 8 && doonce == 0)
{
lcd.clear();
if (changestate == 0)
{
lcd.print("Start?");
doonce = 1;
}
else {
lcd.print("Wait!");
delay(2000);
weight = scale.read();
delay(100);
lcd.clear();
lcd.print("Pump 1 ON");
digitalWrite(in1, LOW);
digitalWrite(in9, HIGH);
while (scale.read() - weight < 3000)
{
if (Vodka == 1)
lcd.clear();
lcd.print(pump1ml);
lcd.print("ml");
delay((pump1ml / 11) * 1000);
digitalWrite(in1, HIGH);
digitalWrite(in9, LOW);
delay(2000);
weight = scale.read();
delay(100);
lcd.clear();
lcd.print("Pump 2 ON");
digitalWrite(in2, LOW);
digitalWrite(in9, HIGH);
while (scale.read() - weight < 3000)
{
}
Vodka = 0;
}
{
if (Jager == 1)
lcd.clear();
lcd.print(pump2ml);
lcd.print("ml");
delay((pump2ml / 12) * 1000);
digitalWrite(in2, HIGH);
digitalWrite(in9, LOW);
delay(2000);
weight = scale.read();
delay(100);
lcd.clear();
lcd.print("Pump 3 ON");
digitalWrite(in3, LOW);
digitalWrite(in9, HIGH);
while (scale.read() - weight < 3000)
{
}
Jager = 0;
}
{
if (Vorosbor == 1)
lcd.clear();
lcd.print(pump3ml);
lcd.print("ml");
delay((pump2ml / 12) * 1000);
digitalWrite(in3, HIGH);
digitalWrite(in9, LOW);
delay(2000);
weight = scale.read();
delay(100);
lcd.clear();
lcd.print("Pump 4 ON");
digitalWrite(in4, LOW);
digitalWrite(in9, HIGH);
while (scale.read() - weight < 3000)
{
}
Vorosbor = 0;
}
{
if (Rosebor == 1)
lcd.clear();
lcd.print(pump4ml);
lcd.print("ml");
delay((pump2ml / 12) * 1000);
digitalWrite(in4, HIGH);
digitalWrite(in9, LOW);
delay(2000);
weight = scale.read();
delay(100);
lcd.clear();
lcd.print("Pump 5 ON");
digitalWrite(in5, LOW);
digitalWrite(in9, HIGH);
while (scale.read() - weight < 3000)
{
}
Rosebor = 0;
}
{
if (Narancs == 1)
lcd.clear();
lcd.print(pump5ml);
lcd.print("ml");
delay((pump2ml / 12) * 1000);
digitalWrite(in5, HIGH);
digitalWrite(in9, LOW);
delay(2000);
weight = scale.read();
delay(100);
lcd.clear();
lcd.print("Pump 6 ON");
digitalWrite(in6, LOW);
digitalWrite(in9, HIGH);
while (scale.read() - weight < 3000)
{
}
Narancs = 0;
}
{
if (Cola == 1)
lcd.clear();
lcd.print(pump6ml);
lcd.print("ml");
delay((pump2ml / 12) * 1000);
digitalWrite(in6, HIGH);
digitalWrite(in9, LOW);
delay(2000);
weight = scale.read();
delay(100);
lcd.clear();
lcd.print("Pump 7 ON");
digitalWrite(in7, LOW);
digitalWrite(in9, HIGH);
while (scale.read() - weight < 3000)
{
}
Cola = 0;
}
{
if (Bodza == 1)
lcd.clear();
lcd.print(pump7ml);
lcd.print("ml");
delay((pump2ml / 12) * 1000);
digitalWrite(in7, HIGH);
digitalWrite(in9, LOW);
delay(2000);
weight = scale.read();
delay(100);
lcd.clear();
lcd.print("Pump 8 ON");
digitalWrite(in8, LOW);
digitalWrite(in9, HIGH);
while (scale.read() - weight < 3000)
{
}
Bodza = 0;
}
{
if (Whisky)
lcd.clear();
lcd.print(pump8ml);
lcd.print("ml");
delay((pump3ml / 12) * 1000);
digitalWrite(in8, HIGH);
digitalWrite(in9, LOW);
delay(2000);
changestate = 0;
}
Whisky = 0;
}
{
}
}
}
Köszönöm a segítségedet! De sajnos még mindig ugyan azt csinálja. Hiába 0 a kiválasztott érték mindegyiknél. Csak az elsőnél kapcsol ki a többinél behúz és csak akkor ugrik tovább ha a load cell érzékel valamennyi súlyt (hogy mennyit azt nem tudom, ha csak hozzáérek akkor át ugrik).
Mert még nem csináltunk semmit, csak átformáztam hogy olvashatóbb legyen! Most jön a kód értelmezése. Végigmegyek rajta hogy lássam mit csinál, aztán megpróbáljuk egyszerűsíteni! Türelem! A hozzászólás módosítva: Aug 27, 2020
Bogarászom, bogarászom.. Ennek pontosan hogyan kellene működnie?
Mire jó a screen változó, mit tud a changestate, a vodka, jager, stb? Kérlek írd le konkrétan hogy mit vársz tőlük, és összehozzuk! Ez a kód így ahogy van eléggé khm.. kusza
Például az alábbi ismétlődik többször:
if (screen == 0 && doonce == 0)
{
Vodka = 1;
lcd.clear();
lcd.print("Vodka");
lcd.setCursor(0, 1);
lcd.print(pump1ml);
lcd.setCursor(3, 1);
lcd.print("ml");
if (changestate == 0) {
lcd.setCursor(9, 0 );
lcd.print("Change?");
}
doonce = 1;
}
Ezt meg lehetne oldani így:
if (doonce == 0)
{
drink(screen);
}
...
void drink(char screen)
{
lcd.clear();
switch (screen)
{
case 0:
{
Vodka = 1;
lcd.print("Vodka");
lcd.setCursor(0, 1);
lcd.print(pump1ml);
break;
}
case 1:
{
Jager = 1;
lcd.print("Jager");
lcd.setCursor(0, 1);
lcd.print(pump2ml);
break;
}
case 2:
{
Vorosbor = 1;
lcd.print("Vorosbor");
lcd.setCursor(0, 1);
lcd.print(pump3ml);
break;
}
...
lcd.setCursor(3, 1);
lcd.print("ml");
if (changestate == 0)
{
lcd.setCursor(9, 0 );
lcd.print("Change?");
}
doonce = 1;
}
}
}
Vedd észre, hogy sokkal rövidebb darabokból áll a kód, ami így tömörebb, és áttekinthetőbb! Emellett kisebb a hibalehetőség is!
Várom a fenti kérdésre a válaszod, és innen folytatjuk! A hozzászólás módosítva: Aug 27, 2020
szia!
A 372. sortól még mindig nem jó. Nyit valamit, de nem tudom mit. A Ugyanazok a hibák vannak, amiket már írtam párszor. Még nem jó.
Azaz még kell formázni rajta.
Ez már nem formázási hiba, tudom hogy ott van! Azért kérdeztem hogy pontosan mit akar a kolléga, mert most már az alapokig le kell menni, és újra írni az egészet! Egyszerűen nincs értelme tovább masszírozni az eredeti kódot!
Az lenne a lényege, hogy van 8 féle ital és hogyha mind a 8-nál 0ml-t állítok be akkor ne induljon el a program. Csak akkor ha valamelyiknél minimum 1ml-t állítok be(Lényegében mindegy, hogy 1 vagy 10 ml csak akkor indulhat ha a kiválasztott érték nagyobb mint 0).
Ha csak ennyi, akkor elég ha beírod az alábbiakat:
if (screen > 0)
{
... itt van minden amit tiltani akarsz nulla esetén
}
Feltételezem, hogy a screen változó határozta meg a 'ml' mennyiségét.
Ha ez még kevés a boldogulásodhoz, hogy légyszi vezesd le, hogy szerinted mit kellene csinálnia a kódodnak, miért kell a vodka = 1, stb! Jó lenne pontosan specifikálni, mert nem látom hol az átfedés a tényleges kód, és az elvárt működés közben.
Bocsánat mindenkitől, hosszú lesz!
Elkezdtem racionalizálni a kódod, és pár dolog feltűnt! Alább felsorolás jelleggel leírom, esetleg hasznos lehet:
1.) 25.sor boolean changestate = false; // nem nulla, hanem false! Megérti így is, de te viszont belekavarodhatsz! Mindenhol átírtam 0 nullát false-ra!
2.) Az elején screen változó beállítása elég jó, kiszerveztem függvénybe. Mivel egyszerű és lényegre törő kódrész, tudjuk hogy jól működik, ne legyen szem előtt. Ő lesz a turned().
3.) Ezen belül viszont nem kezeled a screen==8 állapotot!!!!! A switch elmegy nullától hétig, a nyolc viszont nem szerepel a felsorolásban (124-es sortól)! Létezik a switch-case szerkezetnek egy "default:" értéke is, ő kapja a vezérlést ha fel nem sorolt értéket kap. Esetleg ezt is lehet használni.
4.) 197. sor: Azt mondod, hogy ha megnyomtad a gombot, akkor a changestate váltson értéket. Szerintem mivel egészen konkrét eseményről van szó (megnyomtad a gombot), inkább azt kellene jelezni, tehát nem changestate = !changestate, hanem changestate = true. Így nem függ ez előző értékétől, mindig biztos fix értéket kap. Mellesleg a changestate-et én átnevezném mondjuk accept-re, vagy valami hasonlóra.
5.) Amikor a case szerkezetben vizsgálod a vodkát és a vörösbort, akkor érdemes konkrét számok helyett cimkéket használni, és akkor nem kell fejben tartani hogy a vodka az az 1-es. Ezért felvettem a hét #define sort.
Itt jön a kód jelenlegi állapota, még nem vagyok készen vele. Ha jól látom a screen==8 érték lenne az ami indítja a mérést, ezt még át kell nézzem. (Mellesleg a Whisky az nem Whiskey? )
Valamiért a kódnézetben minden sor után újsort tett a HE, ez nem én voltam.
#include<LCD.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
#define DOUT A0 // DT
#define CLK A1 // SCK
#define clk 2
#define dt 3
#define sw 4
#define in1 5
#define in2 6
#define in3 7
#define in4 8
#define in5 9
#define in6 10
#define in7 11
#define in8 12
#define in9 13
volatile boolean TurnDetected;
volatile boolean up;
bool doonce = 0;
char screen = 0;
boolean changestate = false; // nem nulla, hanem false! Megérti így is, de te viszont belekavarodhatsz!
long weight;
int pump1ml = 0;
int pump2ml = 0;
int pump3ml = 0;
int pump4ml = 0;
int pump5ml = 0;
int pump6ml = 0;
int pump7ml = 0;
int pump8ml = 0;
byte Vodka = 0;
byte Jager = 0;
byte Vorosbor = 0;
byte Rosebor = 0;
byte Narancs = 0;
byte Cola = 0;
byte Bodza = 0;
byte Whisky = 0;
#define VODKA 0
#define JAGER 1
#define VOROSBOR 2
#define ROSEBOR 3
#define NARANCS 4
#define COLA 5
#define BODZA 6
#define WHISKY 7
void isr0 () {
TurnDetected = true;
up = (digitalRead(clk) == digitalRead(dt));
}
void setup() {
scale.begin(DOUT, CLK);
scale.set_scale();
scale.tare(); //Reset the scale to 0
lcd.begin(16, 2);
pinMode(sw, INPUT_PULLUP);
pinMode(clk, INPUT);
pinMode(dt, INPUT);
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
pinMode(in5, OUTPUT);
pinMode(in6, OUTPUT);
pinMode(in7, OUTPUT);
pinMode(in8, OUTPUT);
pinMode(in9, OUTPUT);
digitalWrite(in1, HIGH);
digitalWrite(in2, HIGH);
digitalWrite(in3, HIGH);
digitalWrite(in4, HIGH);
digitalWrite(in5, HIGH);
digitalWrite(in6, HIGH);
digitalWrite(in7, HIGH);
digitalWrite(in8, HIGH);
digitalWrite(in9, LOW);
attachInterrupt (0, isr0, RISING);
}
void turned(boolean TurnDetected
{
if (TurnDetected)
{
delay(600);
doonce = 0;
// if (changestate == false) // lentebb ugyanez, csak tömörebben
if (!changestate)
{
if (up)
{
screen++;
if (screen > 8) screen = 8 ; // ha csak egy sor az if, akkor mehet egybe!
}
else
{
// screen = screen - 1; // egyszerűbben így
screen --;
if (screen < 0) screen = 0; // ha csak egy sor az if, akkor mehet egybe
}
}
else
{
if (up)
{
switch (screen)
{
case 0: pump1ml = pump1ml + 10; break;
case 1: pump2ml = pump2ml + 10; break;
case 2: pump3ml = pump3ml + 10; break;
case 3: pump4ml = pump4ml + 10; break;
case 4: pump5ml = pump5ml + 25; break;
case 5: pump6ml = pump6ml + 25; break;
case 6: pump7ml = pump7ml + 25; break;
case 7: pump8ml = pump8ml + 10; break;
case 8: // ???
default:
}
}
else
{
switch (screen)
{
case 0: pump1ml = pump1ml - 10; break;
case 1: pump2ml = pump2ml - 10; break;
case 2: pump3ml = pump3ml - 10; break;
case 3: pump4ml = pump4ml - 10; break;
case 4: pump5ml = pump5ml - 25; break;
case 5: pump6ml = pump6ml - 25; break;
case 6: pump7ml = pump7ml - 25; break;
case 7: pump8ml = pump8ml - 10; break;
case 8: // ???
default:
}
}
}
TurnDetected = false;
}
}
void drink(char screen)
{
lcd.clear();
switch (screen)
{
case VODKA:
{
Vodka = 1;
lcd.print("Vodka");
lcd.setCursor(0, 1);
lcd.print(pump1ml);
break;
}
case JAGER:
{
Jager = 1;
lcd.print("Jager");
lcd.setCursor(0, 1);
lcd.print(pump2ml);
break;
}
case VOROSBOR:
{
Vorosbor = 1;
lcd.print("Vorosbor");
lcd.setCursor(0, 1);
lcd.print(pump3ml);
break;
}
case ROSEBOR:
{
rosebor = 1;
lcd.print("Rosebor");
lcd.setCursor(0, 1);
lcd.print(pump4ml);
break;
}
case NARANCS:
{
narancs = 1;
lcd.print("Narancs");
lcd.setCursor(0, 1);
lcd.print(pump5ml);
break;
}
case COLA:
{
cola = 1;
lcd.print("Cola");
lcd.setCursor(0, 1);
lcd.print(pump6ml);
break;
}
case BODZA:
{
bodza = 1;
lcd.print("Bodza");
lcd.setCursor(0, 1);
lcd.print(pump6ml);
break;
}
case WHISKEY:
{
whisky = 1;
lcd.print("Whisky");
lcd.setCursor(0, 1);
lcd.print(pump7ml);
break;
}
}
lcd.setCursor(3, 1);
lcd.print("ml");
if (changestate == false)
{
lcd.setCursor(9, 0 );
lcd.print("Change?");
}
doonce = 1;
}
void loop()
{
turned(TurnDetected);
if (digitalRead(sw) == LOW)
{
delay(600);
//changestate = !changestate;
changestate = true;
doonce = 0;
}
if (doonce == 0) drink(screen);
if (screen == 8 && doonce == 0)
{
lcd.clear();
if (changestate == false)
{
lcd.print("Start?");
doonce = 1;
}
else {
lcd.print("Wait!");
delay(2000);
weight = scale.read();
delay(100);
lcd.clear();
lcd.print("Pump 1 ON");
digitalWrite(in1, LOW);
digitalWrite(in9, HIGH);
while (scale.read() - weight < 3000)
{
if (Vodka == 1)
lcd.clear();
lcd.print(pump1ml);
lcd.print("ml");
delay((pump1ml / 11) * 1000);
digitalWrite(in1, HIGH);
digitalWrite(in9, LOW);
delay(2000);
weight = scale.read();
delay(100);
lcd.clear();
lcd.print("Pump 2 ON");
digitalWrite(in2, LOW);
digitalWrite(in9, HIGH);
while (scale.read() - weight < 3000)
{
}
Vodka = 0;
}
{
if (Jager == 1)
lcd.clear();
lcd.print(pump2ml);
lcd.print("ml");
delay((pump2ml / 12) * 1000);
digitalWrite(in2, HIGH);
digitalWrite(in9, LOW);
delay(2000);
weight = scale.read();
delay(100);
lcd.clear();
lcd.print("Pump 3 ON");
digitalWrite(in3, LOW);
digitalWrite(in9, HIGH);
while (scale.read() - weight < 3000)
{
}
Jager = 0;
}
{
if (Vorosbor == 1)
lcd.clear();
lcd.print(pump3ml);
lcd.print("ml");
delay((pump2ml / 12) * 1000);
digitalWrite(in3, HIGH);
digitalWrite(in9, LOW);
delay(2000);
weight = scale.read();
delay(100);
lcd.clear();
lcd.print("Pump 4 ON");
digitalWrite(in4, LOW);
digitalWrite(in9, HIGH);
while (scale.read() - weight < 3000)
{
}
Vorosbor = 0;
}
{
if (Rosebor == 1)
lcd.clear();
lcd.print(pump4ml);
lcd.print("ml");
delay((pump2ml / 12) * 1000);
digitalWrite(in4, HIGH);
digitalWrite(in9, LOW);
delay(2000);
weight = scale.read();
delay(100);
lcd.clear();
lcd.print("Pump 5 ON");
digitalWrite(in5, LOW);
digitalWrite(in9, HIGH);
while (scale.read() - weight < 3000)
{
}
Rosebor = 0;
}
{
if (Narancs == 1)
lcd.clear();
lcd.print(pump5ml);
lcd.print("ml");
delay((pump2ml / 12) * 1000);
digitalWrite(in5, HIGH);
digitalWrite(in9, LOW);
delay(2000);
weight = scale.read();
delay(100);
lcd.clear();
lcd.print("Pump 6 ON");
digitalWrite(in6, LOW);
digitalWrite(in9, HIGH);
while (scale.read() - weight < 3000)
{
}
Narancs = 0;
}
{
if (Cola == 1)
lcd.clear();
lcd.print(pump6ml);
lcd.print("ml");
delay((pump2ml / 12) * 1000);
digitalWrite(in6, HIGH);
digitalWrite(in9, LOW);
delay(2000);
weight = scale.read();
delay(100);
lcd.clear();
lcd.print("Pump 7 ON");
digitalWrite(in7, LOW);
digitalWrite(in9, HIGH);
while (scale.read() - weight < 3000)
{
}
Cola = 0;
}
{
if (Bodza == 1)
lcd.clear();
lcd.print(pump7ml);
lcd.print("ml");
delay((pump2ml / 12) * 1000);
digitalWrite(in7, HIGH);
digitalWrite(in9, LOW);
delay(2000);
weight = scale.read();
delay(100);
lcd.clear();
lcd.print("Pump 8 ON");
digitalWrite(in8, LOW);
digitalWrite(in9, HIGH);
while (scale.read() - weight < 3000)
{
}
Bodza = 0;
}
{
if (Whisky)
lcd.clear();
lcd.print(pump8ml);
lcd.print("ml");
delay((pump3ml / 12) * 1000);
digitalWrite(in8, HIGH);
digitalWrite(in9, LOW);
delay(2000);
changestate = 0;
}
Whisky = 0;
}
{
}
}
}
Itt a megoldás a nem töltés problémádra:
fillEnable = false; // alapból tiltjuk
if (pump1ml > 0 || pump2ml > 0 || pump3ml > 0 || pump4ml > 0 || pump5ml > 0 || pump6ml > 0 || pump7ml > 0|| pump8ml > 0)
fillEnable = true;
Ez azt nézi, hogy van-e bárki aki több mint 0ml. Ha van, akkor engedélyezi a töltést. Ezután már csak egy feltételvizsgálat kell a fő kódban. A hozzászólás módosítva: Aug 29, 2020
Van ez a részlet a kódodban: while (scale.read() - weight < 3000). Neki mi lenne a feladata? Alább pedig a delay((pump1ml / 11) * 1000);. Részletezhetnéd kicsit a relék működését, mert ez a rész eléggé zavaros. Pontosan hogyan kellene ennek működni? Amúgy a jó hír, hogy mindjárt készen vagyunk!
A relék úgy működnének, hogy van 9-db relé abból 8-db szelepeket kapcsol és a maradék 1 pedig egy kis villanymotort. És a lényeg az, hogy egy kiválasztott italhoz tartozik egy szelep és egyszerre kell kapcsolnia a villanymotor reléjének és az adott ital reléjének . Egészen addig amíg el nem éri a megadott mennyiséget súlyban átszámítva, ml-ben van megadva de mivel súlyszenzor érzékeli ezért kell bele ez a kódrész: while (scale.read() - weight < 3000). Lehet jobb lett volna flow sensor-ral, pontosabb lett volna, de szerintem így se lesz nagy pontatlanság.
És tényleg whiskey kösz, hogy jelezted.
|
|