|
A klónok CH340 Soros-USB illesztőjének drivere ( Letöltés)
Első lépésként megnézed, hogy az 1-es DIP kapcsoló hogyan áll. Ha kell öntözni, akkor az öntözés idejéig kinyitod az 1-es szelepet. Ha lejárt az időzítés, megnézed a 2-es kapcsolót. Ha ott nem kell öntözni, ugrasz a 3-as kapcsoló vizsgálatára, tehát a másodiknál megadott időzítést figyelembe sem kell venni. Ha kell öntözni a hármas pozícióban, akkor a beállított ideig ezt megteszed, majd elzárod a vizet és mész a negyedik kapcsolóhoz stb. Már ha jól értem a kérdést.
ez a kód ami működik és ebbe kellene beletenni ezt a dip kapcsolós történetet
#include <LiquidCrystal.h>
const int szelep1 = 22;
const int szelep2 = 23;
const int szelep3 = 24;
const int szelep4 = 25;
const int szelep5 = 26;
const int szelep6 = 27;
const int szelep7 = 28;
const int szelep8 = 29;
const int szelep9 = 30;
const int szelep10 = 31;
const int szelep11 = 32;
const int szelep12 = 33;
const int szelep13 = 34;
const int szelep14 = 35;
const byte interpin = 2;
const byte interpin2 = 3;
unsigned long currentMillis;
unsigned long previousMillis;
unsigned long beintervall;
unsigned long time;
unsigned long elozoido = 0;
unsigned long startmillis;
unsigned int jelenlegiido = 0;
unsigned int felfele;
volatile unsigned long interval = 300000;
int ertek = 15000;
int stat;
int perc;
int masodperc;
int hours;
int mp;
int aperc;
int amasodperc;
int ahours;
int amp;
int buttonstate = 0;
int buttonstate2 = 0;
int lastbuttonstate = LOW;
int lastbuttonstate2 = LOW;
long intervall = 120000;
long lastdebounce = 0;
long debouncedelay = 50;
byte szamoca[8] = {
0b00010,
0b00100,
0b00100,
0b11111,
0b11111,
0b11111,
0b01110,
0b00100
};
LiquidCrystal lcd(9,8,7,6,5,4);
void setup(){
lcd.begin(16,2);
pinMode(szelep1, OUTPUT);
pinMode(szelep2, OUTPUT);
pinMode(szelep3, OUTPUT);
pinMode(szelep4, OUTPUT);
pinMode(szelep5, OUTPUT);
pinMode(szelep6, OUTPUT);
pinMode(szelep7, OUTPUT);
pinMode(szelep8, OUTPUT);
pinMode(szelep9, OUTPUT);
pinMode(szelep10, OUTPUT);
pinMode(szelep11, OUTPUT);
pinMode(szelep12, OUTPUT);
pinMode(szelep13, OUTPUT);
pinMode(szelep14, OUTPUT);
pinMode(interpin,INPUT_PULLUP);
pinMode(interpin2,INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(interpin), minfel, FALLING);
attachInterrupt(digitalPinToInterrupt(interpin2), minle, FALLING);
lcd.createChar(0, szamoca);
lcd.setCursor(1,0);
lcd.print("Boda & Veszka");
lcd.setCursor(6,1);
lcd.write((byte)0);
delay(5000);
lcd.clear();
}
void loop(){
beintervall = interval;
currentMillis=millis();
if(currentMillis-previousMillis<interval){
time= interval-(currentMillis-previousMillis);
}else{
stat++;
previousMillis=millis();
}
if (stat == 0){
digitalWrite(szelep1, HIGH);
digitalWrite(szelep2, LOW);
digitalWrite(szelep3, LOW);
digitalWrite(szelep4, LOW);
digitalWrite(szelep5, LOW);
digitalWrite(szelep6, LOW);
digitalWrite(szelep7, LOW);
digitalWrite(szelep8, LOW);
digitalWrite(szelep9, LOW);
digitalWrite(szelep10, LOW);
digitalWrite(szelep11, LOW);
digitalWrite(szelep12, LOW);
digitalWrite(szelep13, LOW);
digitalWrite(szelep14, LOW);
}
if (stat == 1){
digitalWrite(szelep1, LOW);
digitalWrite(szelep2, HIGH);
digitalWrite(szelep3, LOW);
digitalWrite(szelep4, LOW);
digitalWrite(szelep5, LOW);
digitalWrite(szelep6, LOW);
digitalWrite(szelep7, LOW);
digitalWrite(szelep8, LOW);
digitalWrite(szelep9, LOW);
digitalWrite(szelep10, LOW);
digitalWrite(szelep11, LOW);
digitalWrite(szelep12, LOW);
digitalWrite(szelep13, LOW);
digitalWrite(szelep14, LOW);
}
if (stat ==2){
digitalWrite(szelep1, LOW);
digitalWrite(szelep2, LOW);
digitalWrite(szelep3, HIGH);
digitalWrite(szelep4, LOW);
digitalWrite(szelep5, LOW);
digitalWrite(szelep6, LOW);
digitalWrite(szelep7, LOW);
digitalWrite(szelep8, LOW);
digitalWrite(szelep9, LOW);
digitalWrite(szelep10, LOW);
digitalWrite(szelep11, LOW);
digitalWrite(szelep12, LOW);
digitalWrite(szelep13, LOW);
digitalWrite(szelep14, LOW);
}
if (stat ==3){
digitalWrite(szelep1, LOW);
digitalWrite(szelep2, LOW);
digitalWrite(szelep3, LOW);
digitalWrite(szelep4, HIGH);
digitalWrite(szelep5, LOW);
digitalWrite(szelep6, LOW);
digitalWrite(szelep7, LOW);
digitalWrite(szelep8, LOW);
digitalWrite(szelep9, LOW);
digitalWrite(szelep10, LOW);
digitalWrite(szelep11, LOW);
digitalWrite(szelep12, LOW);
digitalWrite(szelep13, LOW);
digitalWrite(szelep14, LOW);
}
if (stat ==4){
digitalWrite(szelep1, LOW);
digitalWrite(szelep2, LOW);
digitalWrite(szelep3, LOW);
digitalWrite(szelep4, LOW);
digitalWrite(szelep5, HIGH);
digitalWrite(szelep6, LOW);
digitalWrite(szelep7, LOW);
digitalWrite(szelep8, LOW);
digitalWrite(szelep9, LOW);
digitalWrite(szelep10, LOW);
digitalWrite(szelep11, LOW);
digitalWrite(szelep12, LOW);
digitalWrite(szelep13, LOW);
digitalWrite(szelep14, LOW);
}
if (stat ==5){
digitalWrite(szelep1, LOW);
digitalWrite(szelep2, LOW);
digitalWrite(szelep3, LOW);
digitalWrite(szelep4, LOW);
digitalWrite(szelep5, LOW);
digitalWrite(szelep6, HIGH);
digitalWrite(szelep7, LOW);
digitalWrite(szelep8, LOW);
digitalWrite(szelep9, LOW);
digitalWrite(szelep10, LOW);
digitalWrite(szelep11, LOW);
digitalWrite(szelep12, LOW);
digitalWrite(szelep13, LOW);
digitalWrite(szelep14, LOW);
}
if (stat ==6){
digitalWrite(szelep1, LOW);
digitalWrite(szelep2, LOW);
digitalWrite(szelep3, LOW);
digitalWrite(szelep4, LOW);
digitalWrite(szelep5, LOW);
digitalWrite(szelep6, LOW);
digitalWrite(szelep7, HIGH);
digitalWrite(szelep8, LOW);
digitalWrite(szelep9, LOW);
digitalWrite(szelep10, LOW);
digitalWrite(szelep11, LOW);
digitalWrite(szelep12, LOW);
digitalWrite(szelep13, LOW);
digitalWrite(szelep14, LOW);
}
if (stat ==7){
digitalWrite(szelep1, LOW);
digitalWrite(szelep2, LOW);
digitalWrite(szelep3, LOW);
digitalWrite(szelep4, LOW);
digitalWrite(szelep5, LOW);
digitalWrite(szelep6, LOW);
digitalWrite(szelep7, LOW);
digitalWrite(szelep8, HIGH);
digitalWrite(szelep9, LOW);
digitalWrite(szelep10, LOW);
digitalWrite(szelep11, LOW);
digitalWrite(szelep12, LOW);
digitalWrite(szelep13, LOW);
digitalWrite(szelep14, LOW);
}
if (stat ==8){
digitalWrite(szelep1, LOW);
digitalWrite(szelep2, LOW);
digitalWrite(szelep3, LOW);
digitalWrite(szelep4, LOW);
digitalWrite(szelep5, LOW);
digitalWrite(szelep6, LOW);
digitalWrite(szelep7, LOW);
digitalWrite(szelep8, LOW);
digitalWrite(szelep9, HIGH);
digitalWrite(szelep10, LOW);
digitalWrite(szelep11, LOW);
digitalWrite(szelep12, LOW);
digitalWrite(szelep13, LOW);
digitalWrite(szelep14, LOW);
}
if (stat ==9){
digitalWrite(szelep1, LOW);
digitalWrite(szelep2, LOW);
digitalWrite(szelep3, LOW);
digitalWrite(szelep4, LOW);
digitalWrite(szelep5, LOW);
digitalWrite(szelep6, LOW);
digitalWrite(szelep7, LOW);
digitalWrite(szelep8, LOW);
digitalWrite(szelep9, LOW);
digitalWrite(szelep10, HIGH);
digitalWrite(szelep11, LOW);
digitalWrite(szelep12, LOW);
digitalWrite(szelep13, LOW);
digitalWrite(szelep14, LOW);
}
if (stat ==10){
digitalWrite(szelep1, LOW);
digitalWrite(szelep2, LOW);
digitalWrite(szelep3, LOW);
digitalWrite(szelep4, LOW);
digitalWrite(szelep5, LOW);
digitalWrite(szelep6, LOW);
digitalWrite(szelep7, LOW);
digitalWrite(szelep8, LOW);
digitalWrite(szelep9, LOW);
digitalWrite(szelep10, LOW);
digitalWrite(szelep11, HIGH);
digitalWrite(szelep12, LOW);
digitalWrite(szelep13, LOW);
digitalWrite(szelep14, LOW);
}
if (stat ==11){
digitalWrite(szelep1, LOW);
digitalWrite(szelep2, LOW);
digitalWrite(szelep3, LOW);
digitalWrite(szelep4, LOW);
digitalWrite(szelep5, LOW);
digitalWrite(szelep6, LOW);
digitalWrite(szelep7, LOW);
digitalWrite(szelep8, LOW);
digitalWrite(szelep9, LOW);
digitalWrite(szelep10, LOW);
digitalWrite(szelep11, LOW);
digitalWrite(szelep12, HIGH);
digitalWrite(szelep13, LOW);
digitalWrite(szelep14, LOW);
}
if (stat ==12){
digitalWrite(szelep1, LOW);
digitalWrite(szelep2, LOW);
digitalWrite(szelep3, LOW);
digitalWrite(szelep4, LOW);
digitalWrite(szelep5, LOW);
digitalWrite(szelep6, LOW);
digitalWrite(szelep7, LOW);
digitalWrite(szelep8, LOW);
digitalWrite(szelep9, LOW);
digitalWrite(szelep10, LOW);
digitalWrite(szelep11, LOW);
digitalWrite(szelep12, LOW);
digitalWrite(szelep13, HIGH);
digitalWrite(szelep14, LOW);
}
if (stat ==13){
digitalWrite(szelep1, LOW);
digitalWrite(szelep2, LOW);
digitalWrite(szelep3, LOW);
digitalWrite(szelep4, LOW);
digitalWrite(szelep5, LOW);
digitalWrite(szelep6, LOW);
digitalWrite(szelep7, LOW);
digitalWrite(szelep8, LOW);
digitalWrite(szelep9, LOW);
digitalWrite(szelep10, LOW);
digitalWrite(szelep11, LOW);
digitalWrite(szelep12, LOW);
digitalWrite(szelep13, LOW);
digitalWrite(szelep14, HIGH);
}
if (stat ==14){
stat=0;
}
mp = time/1000; // eltelt másodpercek összesen
masodperc = mp%60; // másodperc 0..59
perc = (mp/60)%60; // perc 0..59
hours = (mp/3600)%24; // óra 0..23
amp = interval/1000; // eltelt másodpercek összesen
amasodperc = amp%60; // másodperc 0..59
aperc = (amp/60)%60; // perc 0..59
ahours = (amp/3600)%24; // óra 0..23
lcd.setCursor(0,1);
lcd.print("Akt.:");
lcd.setCursor(6,1);
lcd.print(hours);
lcd.setCursor(7,1);
lcd.print(":");
lcd.setCursor(8,1);
if (perc < 10){lcd.print(' ');}
lcd.print(perc);
lcd.setCursor(10,1);
lcd.print(":");
lcd.setCursor(11,1);
if (masodperc < 10){lcd.print(' ');}
lcd.print(masodperc);
lcd.setCursor(0,0);
lcd.print("Beal.:");
lcd.setCursor(7,0);
lcd.print(ahours);
lcd.setCursor(8,0);
lcd.print(":");
lcd.setCursor(9,0);
if(aperc < 10){lcd.print(' ');}
lcd.print(aperc);
lcd.setCursor(11,0);
lcd.print(":");
lcd.setCursor(12,0);
if (amasodperc < 10){lcd.print(' ');}
lcd.print(amasodperc);
}
void minfel(){
int reading = digitalRead(interpin);
if (reading != lastbuttonstate) {
lastdebounce = millis();
}
if ((millis() - lastdebounce) > debouncedelay) {
if (reading != buttonstate) {
buttonstate = reading;
if (buttonstate == LOW) {
}
}
}
interval += ertek;
lastbuttonstate = reading;
}
void minle(){
int reading2 = digitalRead(interpin2);
if (reading2 != lastbuttonstate2) {
lastdebounce = millis();
}
if ((millis() - lastdebounce) > debouncedelay) {
if (reading2 != buttonstate2) {
buttonstate2 = reading2;
if (buttonstate2 == LOW) {
}
}
}
interval -= ertek;
lastbuttonstate2 = reading2;
}
(#) |
(Felhasználó 120038) válasza Bakman hozzászólására (») |
Júl 11, 2016 |
|
/ |
|
|
Megoldható amit szeretnél, nem annyira bonyulult.
Értem. Szóval az a gond a sorbakötéssel, hogy ha kikapcsolod a kört, attól még vár öt percet, mire ráfutna a következőre, addig nem csinálna semmit. Ez ok.
Akkor már csak programozni kell. Amint írtam az is simán megoldható. Az időzítéssél úgy csinálnám, hogy csak akkor várjon öt percet, ha az aktuálisat be kell kapcsolni, különben keresse a többit.
Akkor nem is kell for ciklus, mert ezt a fő loop maga megoldja. Szóval:
Loop-on belül:
Definiálj egy változót, ami i=1 től indul. Ez a változó fog növekedni 14-ig.
ha digitalread(i)==high akkor: 'Ez a kapcsoló digitális lába
kapcsolja be az i+14-lábat, relét
várjon öt percet, ami egy do while ciklusban kell legyen így a fő loop nem megy tovább. (remélem ez Arduino-ban is így lesz)
A fentebbi while után letellik az öt perc, ezért kell egy i=i+1, növeljük azt a lábat, amit kapcsolni kell. A fentebbi ha digitalread(i)==high feltétel megoldja neked, hogy ha a kapcsoló értéke 0, akkor az if-en belüli rész nem fog lefutni, nem is fog várni ÖT percet, mert az a rész átugródik, kihaggya.
Namost a fő loop végére kell még, hogy ha eljut az i==15 ig, akkor i=1, hogy necsak 1x fusson minden.
Így, ha minden ok, akkor tömb sem kell bele. Nincs itthon összerakva Arduino-m, a kódokat inkább ferjből nyomom, ha bemásolod a kódod, könyebb lesz.
(#) |
Tibicsek válasza (Felhasználó 120038) hozzászólására (») |
Júl 11, 2016 |
|
/ |
|
|
Az előző hozzászólásban bemásoltam az egész kódot A hozzászólás módosítva: Júl 11, 2016
(#) |
(Felhasználó 120038) válasza Tibicsek hozzászólására (») |
Júl 11, 2016 |
|
/ |
|
|
Ok, még valami!
Annyit azért tudnom kellene még, hogy egyszerre csak 1 kör mehet? Mert a fenti példám csak arra jó. Szóval 1 kör 5 perc, pl második kimarad, harmadik bekapcsol 5 percre (rögtön az első lekapcsolása után), utána 4 kör megint öt percre, 5. kimarad, hatodik bekapcsol 5 percre, utána hetedik öt percre és így tovább?
Uhh de hosszú kód.
Én mindenképpen rövidebb ciklusokba helyezném az egészet.
Agent…Z hozzászólását értelmezd.
Egyébként ha bonyolultabb feladatnak állsz neki, javaslom, hogy elöbb jól köröljárva a fealadatot fogalmazd meg azt és írd le.
Utána készítessz egy folyamat ábrát, és meglepődsz mennyivel egyszerűbb, átláthatóbb és módosíthatóbb kódot tudsz majd írni.
(#) |
Tibicsek válasza (Felhasználó 120038) hozzászólására (») |
Júl 11, 2016 |
|
/ |
|
|
igen! így hirtelen ez elég bonyolult nekem tudom, hogy így is elég szájbarágós a dolog, de nemtudnád esetleg konkrét kód formájában is kifejteni nekem? A hozzászólás módosítva: Júl 11, 2016
Annak idelyén Delphiben én is így kezdtem . Eszeme jutott valami, nekiállta és írtam a kódot. Persze a végén már nem tudtam , hogy az elején mi micsoda.
Ja és a kódon belül vizuálisan tagolni, és bőven lehet kommentelni. A hozzászólás módosítva: Júl 11, 2016
Nem vagyok egy C guru. Mint írtam inkább Delphi -zek. Meg volt egy kis PHP régebben.
Amúgy én PIC el foglalkozgatok és Paskal-ban. Félek, hogy konkrét kóddal csak félre vezetnélek.
Ha volna 1-2 órám megoldanám, de már biztos nem ma este. Addigra meg rutinos Arduino-sok többet segítenek. Én csak általánosságban írtam, hogy a kód ne egy végtelen hosszú regény legyen. Tagolni kell, ha lehet fügvényekre bontani, és azokat meghívni. A hozzászólás módosítva: Júl 11, 2016
Egy kicsit Off ezért bocs mindenkitől, de valami hasonló módon kéne. Még ez is messze nem tökéletes.:
Bővebben: Link
De látom Agent_Z már dolgozik rajta! A hozzászólás módosítva: Júl 11, 2016
(#) |
(Felhasználó 120038) válasza (Felhasználó 120038) hozzászólására (») |
Júl 11, 2016 |
|
/ |
|
|
94.void loop(){
95.beintervall = interval;
96.currentMillis=millis();
//Ez fog növekedni 1 től 14 ig, ezek lesznek a kapcsolók. (Fizikailag is ezeken a lábakon kell lenniük)
stat=1;
//Csak ennyi kell bele, nem kell az a rengeteg sor!
//Ha jól láttam, akkor a stat lépked végig a pin kapcsolólábain.
if digitalRead(stat) == HIGH
{
//Itt kellene megoldanod, hogy 5 percet várjon:
Start_time= millis(); //Ezt majd definiálod valahol, mármint a start time-ot. Azért raktam bele, mert nem értettem teljesen a tiédet
delay (5); //Tuti ami fix alapon...
while currentMillis-Start_time<=300000 //Azaz Öt percig ez fog menni!!!
{
digital.write(stat+21,HIGH);//Ez kapcsolja be ha minden igaz az 1-es kapcsolóhoz tartozó relét!!!
delay 500;
//Itt szebb lenne, ha nem kapcsolná mindig be, csak 1x. Azt úgy lehetne, hogy egy változót definiálnál a while elött pl kapcsolhat=1. Így az egész digital.write sort egy if-be kellene tenni.
ha kapcolhat=1 akkor digital.write....
és rögtön utána az if-en belül kapcsolhat=0.
Így csak egyszer kapcsolná be az 5 perc alatt. AAz újabb lábnál meg úgyis felveszi az 1-et.
// Csakhogy így a kijelzésekre NEM FUT RÁ, azt is meg kell hívnod majd innen.
}
//Ha megvan az öt perc, akkor ki kell kapcsolni!!!!
digital.write(stat+21,LOW);
delay(100);
//Akkor léphetünk a másik kapcsoló lábra:
stat=stat+1;
//Figyelni kell, hogy ha ez 15, akkor legyen újra 1.
if stat==15
{
stat=1;
}
}
//Az a baj, hogy idáig nem is ér el a programod, mert először 5 percig dekkol a while ciklusban.
//Ki kell szervezned mindent, vagy a fenti ciklusom lezáró karakterét a megfelelő helyre kell tenned.
//Ez már a te gondod lesz, mert nem látom át teljesen a kódod.
//Este van, meg sörözök is...
Láthatod, hogy kitöröltem eddig mindent!!!
Persze lehet kicsit többet is a kelleténél, de nem is az volt a lényeg.
332.mp = time/1000; // eltelt másodpercek összesen
Láthatod, hogy rengeteg sort kitöröltem. A kód sajnos nem biztos, inkább csak tájékoztató, gondolatindító.
Sajnos nem láttam át teljesen a programod, ezért csak fejből írtam bele, plusz mint mondtam nincs itthon összerakva arduino. Szerintem érteni fogod, hogy mit is akartam vele kezdeni.
(#) |
Tibicsek válasza (Felhasználó 120038) hozzászólására (») |
Júl 11, 2016 |
|
/ |
|
|
a visszaszámlálás idejét nekem válztoztatnom kell és csak így tudtam megoldani, hogy lefelé számoljon ezt tudjam változtatni az egésznek ez lényege A hozzászólás módosítva: Júl 11, 2016
(#) |
(Felhasználó 120038) válasza (Felhasználó 120038) hozzászólására (») |
Júl 11, 2016 |
|
/ |
|
|
Igen, csak nem jó teljesen..
A stat=1 sort ki kell venni belőle, mert a fő loop mindig felülírja! Szóval a setup-ban kell neki kezdőértéket adni.
(#) |
(Felhasználó 120038) válasza Tibicsek hozzászólására (») |
Júl 11, 2016 |
|
/ |
|
|
Semmi, gond!
Az úgy ok, csak annyi kell, hogy egy külső függvénybe teszed a kiíratást stb, majd a while ciklusomból hívogatod azokat. Ekkor minden ok lesz, kapcsolis, meg ki is ír mindent.
(#) |
Tibicsek válasza (Felhasználó 120038) hozzászólására (») |
Júl 11, 2016 |
|
/ |
|
|
Én most adom fel az egészet teljesen bekavarodtam Ez a stat változó honnan látja nekem a kapcsolókat?
(#) |
(Felhasználó 120038) válasza Tibicsek hozzászólására (») |
Júl 11, 2016 |
|
/ |
|
|
Ne add fel!
Egyelőre sehol sem. Írtam korábban, hogy ilyenkor az kell, hogy a kapcsolók lábai az 1-14 ig legyenek bekötve az ARDUINO-ba. Ha nem tudod fizikailag bekötni 1 től, hanem pl 2-15-ig, akkor a stat nem 1 től indul, hanem 2-től. Ennek a megoldásnak az a kikötése hogy egyesével növekedve legyen a lábkiosztás fizikailag. Ha össze vissza van (Úgy kötötted), akkor kicsit neccesebb, mert akkor kell tömböket is használni.
A megoldásom minden 5 perc után növeli 1-el az értékét, azaz FIZIKAILAG is úgy kell bekötni, hogy a 2 jelentése a kódban az az ARDUINO 2-es lábát is jelenti.
Ha ez nem megoldható, akkor kell a tömbös megoldás, mert akkor 5 percenként növelem a TÖMB INDEXÉT (ami majd a stat lesz), és az adott indexű elem meg tartalmazza majd a láb számát, amire fizikailag kötve lett.
Minden megoldható, csak akarni kell szerintem.
A lényeg, hogy amit írtam az megszakítja öt percre a loop futását, és addig azt teszi ami benne van.
(#) |
(Felhasználó 120038) válasza (Felhasználó 120038) hozzászólására (») |
Júl 11, 2016 |
|
/ |
|
|
Ezért kérdeztem, hogy mennyi digitális láb van. Ha van 28 minimum akkor ok.
Azért nem kell definiálni sokmindent, csak a setup-ban kell belőni, hogy a kapcsolókhoz kötött arduino lábak, például 1-14 ig mindegyik INPUT!! Sejtésem szerint a kapcsoló 0 állása lehuzza egy ellenálláson keresztül 0V-ra a lábat, 1-es állásban meg felhúzza 5v-ra. (Te raktad össze... )
A kódban meg olvasgatok róla, semmi egyéb.
(#) |
Tibicsek válasza (Felhasználó 120038) hozzászólására (») |
Júl 12, 2016 |
|
/ |
|
|
belső felhúzó ellenállást használok
(#) |
(Felhasználó 120038) válasza Tibicsek hozzászólására (») |
Júl 12, 2016 |
|
/ |
|
|
Akkor ok minden.
Szerintem a setup-ban kell beállítani a dip kapcsolókhoz kötött Arduino lábait, hogy azok inputok legyenek, megfelelő kezdőértékkel.
A többit meg megírtad már, nem lesz ez olyan vészes, mint ahogy elsőnek látszik.
Nézd meg ezt: Ez annyit csinál, hogy ahol léptetted a stat változódat az ELSE után, ugye az a rész csak egyszer fut le mindig, ha letelik az idő. Itt vannak vezérelve a kimenetek.
A többi programrészhez nem nyúltam. Elméletben ennek működnie kell.
#include <LiquidCrystal.h>
const int szelep[]= {22,23,24,25,26,27,28,29,30,31,32,33,34,35}; //nem kell sorban lenniük
const int dipbemenet[] = {4,5,6,7,8,9,10,11,12,13,14,15,16,17}; //ezeknek sem
bool mindendipNull;
const byte interpin = 2;
const byte interpin2 = 3;
unsigned long currentMillis;
unsigned long previousMillis;
unsigned long beintervall;
unsigned long time;
unsigned long elozoido = 0;
unsigned long startmillis;
unsigned int jelenlegiido = 0;
unsigned int felfele;
volatile unsigned long interval = 300000;
int ertek = 15000;
int stat;
int perc;
int masodperc;
int hours;
int mp;
int aperc;
int amasodperc;
int ahours;
int amp;
int buttonstate = 0;
int buttonstate2 = 0;
int lastbuttonstate = LOW;
int lastbuttonstate2 = LOW;
long intervall = 12000;
long lastdebounce = 0;
long debouncedelay = 50;
byte szamoca[8] = {
0b00010,
0b00100,
0b00100,
0b11111,
0b11111,
0b11111,
0b01110,
0b00100
};
LiquidCrystal lcd(9,8,7,6,5,4);
//******************************************************************
void setup(){
lcd.begin(16,2);
for(int i=0;i<14;i++){pinMode(szelep[i], OUTPUT);}
pinMode(interpin,INPUT_PULLUP);
pinMode(interpin2,INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(interpin), minfel, FALLING);
attachInterrupt(digitalPinToInterrupt(interpin2), minle, FALLING);
lcd.createChar(0, szamoca);
lcd.setCursor(1,0);
lcd.print("Boda & Veszka");
lcd.setCursor(6,1);
lcd.write((byte)0);
delay(5000);
lcd.clear();
}
//******************************************************************
void loop(){
beintervall = interval;
currentMillis=millis();
if(currentMillis-previousMillis<interval){
time= interval-(currentMillis-previousMillis);
}else{
previousMillis=millis();
mindendipNull = true; //beállítok egy bool-t, hogy minden kapcsoló 0-ban van.
for(int temp=0;temp<14;temp++){ //utána lekérdezem õket. Ha csak egy is 1-es, akkor törlöm a bool-t, amit korábban beállítottam.
if(digitalRead(dipbemenet[temp])){mindendipNull = false;} //Ez azért kell, mert késõbb ez a feltétele, hogy a while ciklus lefusson.
} //mert ha minden kapcsoló 0, akkor soha nem lép ki a ciklusból. Mert keresi az 1-et.
if(!mindendipNull){ //Itt a while ciklus feltétele.
while(!digitalRead(dipbemenet[stat])){stat++;} //lekérdezi az aktuális bemenetet addig, amíg 1-est nem talál. 0-nál növeli a stat-ot.
for(int a=0;a<14;a++){ //beállítja a kimeneteket.
if(stat == a){ //a stat értékének megfelelõ kimenet lesz 1-es, a többi 0.
for(int b=1;b<15;b++){
if(b == a+1){digitalWrite(szelep[b],HIGH);}else{digitalWrite(szelep[b],LOW);}
}
} } }
stat++; // itt növeli a stat-ot, a következõ ciklusban ezzel az értékkel kezdi a bemenetek vizsgálatát.
if (stat >=14){stat=0;}
}
mp = time/1000; // eltelt másodpercek összesen
masodperc = mp%60; // másodperc 0..59
perc = (mp/60)%60; // perc 0..59
hours = (mp/3600)%24; // óra 0..23
amp = interval/1000; // eltelt másodpercek összesen
amasodperc = amp%60; // másodperc 0..59
aperc = (amp/60)%60; // perc 0..59
ahours = (amp/3600)%24; // óra 0..23
lcd.setCursor(0,1);
lcd.print("Akt.:");
lcd.setCursor(6,1);
lcd.print(hours);
lcd.setCursor(7,1);
lcd.print(":");
lcd.setCursor(8,1);
if (perc < 10){lcd.print(' ');}
lcd.print(perc);
lcd.setCursor(10,1);
lcd.print(":");
lcd.setCursor(11,1);
if (masodperc < 10){lcd.print(' ');}
lcd.print(masodperc);
lcd.setCursor(0,0);
lcd.print("Beal.:");
lcd.setCursor(7,0);
lcd.print(ahours);
lcd.setCursor(8,0);
lcd.print(":");
lcd.setCursor(9,0);
if(aperc < 10){lcd.print(' ');}
lcd.print(aperc);
lcd.setCursor(11,0);
lcd.print(":");
lcd.setCursor(12,0);
if (amasodperc < 10){lcd.print(' ');}
lcd.print(amasodperc);
}
//******************************************************************
void minfel(){
int reading = digitalRead(interpin);
if (reading != lastbuttonstate) {
lastdebounce = millis();
}
if ((millis() - lastdebounce) > debouncedelay) {
if (reading != buttonstate) {
buttonstate = reading;
if (buttonstate == LOW) {
}
}
}
interval += ertek;
lastbuttonstate = reading;
}
//******************************************************************
void minle(){
int reading2 = digitalRead(interpin2);
if (reading2 != lastbuttonstate2) {
lastdebounce = millis();
}
if ((millis() - lastdebounce) > debouncedelay) {
if (reading2 != buttonstate2) {
buttonstate2 = reading2;
if (buttonstate2 == LOW) {
}
}
}
interval -= ertek;
lastbuttonstate2 = reading2;
}
(#) |
(Felhasználó 120038) válasza Panhard hozzászólására (») |
Júl 12, 2016 |
|
/ |
|
|
Szia!
Na így kell a tömböket definiálni!
A kódod nem értem teljesen, ezért ha valótlant állítok, akkor elnézést!
1. Nem értem pontosan, hogy a setup-ban miért kell 14*5 másodpercet várni.
2. Ha jól értem a kódot, akkor a loop rögtön egy 5 perces várakozásal kezd, de mit kapcsol be? (Ha kell egyáltalán, mert mi van, ha minden dip 0-n áll?)
3. A while ciklus végetlen lesz, ha minden dip 0. Így sem lesz akkor kijelzés.
Annyi kellene a kódomba, hogy az adott tömb elemét kell betenni a read-ba, és a hozzátartozó relét meg kapcsolni, ami szintén a másik tömbben van. Elég a while előtt bekapcsolni rögtön az if után, így csak egyszer futna le. Letellik az öt perc, keresi a következő, bekapcsolandó lábat.
Nem lenne jobb, ha csak akkor várna, ha kell? A while ciklusban ami az időt nézi, kell egy delay(100), valamint az egész kiíratást egy függvénybe, amit innen hív meg. Plusz persze lehetne egy olyan láb, ami kikapcsol mindent, azt is kellene itt figyelni, akkor nem menne még 5 percet, kiugrasztaná a while-ból, illetve a loop következő feldolgozásánál nem futna bele.
Ez csak a véleményem, legalábbis én így állnék neki.
Koszi, megoldottam. Hat azert kellet volna ket if hogy kiszurjem az egyenloseget is.
(#) |
Panhard válasza (Felhasználó 120038) hozzászólására (») |
Júl 12, 2016 |
|
/ |
|
|
1. A setup-ban nincs 14*5 mp várakozás, csaz 5mp. Azt nem én tettem bele, de attól nem lesz rosszabb a program, csak kicsit később indul be. Ha erre gondolsz:
for(int i=0;i<14;i++){pinMode(szelep[i], OUTPUT);}
Ez a ciklus 14-szer fut le, itt állítja be a lábakat kimenetté. Amíg ez fut, innen nem lép ki, tehát nem adódik hozzá az 5000ms késleltetés.
2. Az 5 perces várakozással kezdés az igaz, erre nem figyeltem.
3. Az igaz, hogy a while ciklus végtelen lenne, ha minden dip 0 , de azért van előtte egy for ciklus is, ami megvizsgálja a bemeneteket, és ha mind 0, akkor a while ciklus le sem fut.
Ezt csak hamar éjszakás műszakban csináltam, nem kell véglegesnek venni. Nyilván lehet rajta még szépíteni, de a lényeg, hogy így működne. Ez csak olyan segítő, tájékoztató jellegű dolog.
(#) |
proba válasza (Felhasználó 120038) hozzászólására (») |
Júl 12, 2016 |
|
/ |
|
|
Szerintem lehet olyat is, a kimenetekre soros kapcsoló a jelfogó vezérlése felé, és egy ellenállás ami a kapcsoló utáni logikai állapottal ellentétes állapotba húzza a bemenetet. ( lehetőleg jó nagy, hogy ezen keresztül ne induljon a relé, és a szintet se rontsa el) A lábat bemenetnek programozva , meg lehet állapítani be van e kapcsolva, ha be van, akkor egyértelmű melyik kimenetet kell kapcsolni. Így minden bemenet vizsgálható, ha meg ki van kapcsolva, még szoftverhiba sem kapcsolja be. A hozzászólás módosítva: Júl 12, 2016
(#) |
(Felhasználó 120038) válasza Panhard hozzászólására (») |
Júl 12, 2016 |
|
/ |
|
|
Szia!
Nem láttam, átnézem jobban!
Hoppá! Tényleg! Nem vettem észre a } karaktert! Bocsánat! Kicsit idegen tőlem ez a nyelv, bele kell rázódnom.
A while-nál sem vágom a {} karakterláncokat. Lehet tényleg jó, nem látom át!
Amúgy elsőre én is hasonlót javasoltam neki, de rájöttem, hogy nincs feltétlenül szüksége rá. A tömbös megoldás sokkal de sokkal jobb lesz neki szerintem, mert akkor kötögetheti a lábakat szabadon.
Éjszakás? Szinte nem is aludtam, bébicsőszködöm, illetve nincs légkondi. Holnaptól lehűlés!
(#) |
(Felhasználó 120038) válasza proba hozzászólására (») |
Júl 12, 2016 |
|
/ |
|
|
Üdv!
Igen. Erre nem gondoltam, megmondom őszintén nem vágom ennyire a dolgod, de igazad lehet.
Felvetettem egy hasonló lehetőséget, de nem gondoltam át rendesen, ezért el is vetettem.
Nagyon szépen köszönöm ezt a sok-sok segítséget! lehet, hogy hülyeségek lesznek, de van 1-2 kérdésem ugye van a szelep[] tömb és a dipbemenet[] tömb ennek egyes elemeire hogyan tudok rákérdezni? vagy ilyet nemlehet? ez nekem még annyira nemtiszta, de próbálom megtanulni ezt is Ha esetleg Kecskemét felé jártok szóljatok! Vendégeim vagytok egy sörre!
Sziasztok!
A segítségeteket szeretném kérni!
Kezdőként szerkesztettem egy kódot,ami szépen működött eddig,de most valamiért hibát ír ki!
Sajnos annyira még nem értek hozzá,még kezdő szinten vagyok.
Ezt a hibát írja ki
Arduino: 1.6.4 (Windows 8.1), Board: "Arduino Mega or Mega 2560, ATmega2560 (Mega 2560)"
DS1307_AND_ DHT22_LCD.ino: In function 'void loop()':
DS1307_AND_ DHT22_LCD:83: error: 'class DateTime' has no member named 'dayOfWeek'
'class DateTime' has no member named 'dayOfWeek'
This report would have more information with
"Show verbose output during compilation"
enabled in File > Preferences.
#include <Wire.h>
#include "RTClib.h" //Óra könyvtár
#include "DHT.h" //Hőmérséklet és páratartalom könyvtár
#include <LiquidCrystal_I2C.h>
#define DHTPIN 7 //Hőmérséklet szenzor a 7-es pinre kötve
DHT dht(DHTPIN, DHTTYPE);
int ledPin = 13;
LiquidCrystal_I2C lcd(0x27, 20, 4);
byte e1[8] = {B10,B100,B1110,B10001,B11111,B10000,B1110}; // Ez az é betű
byte o1[8] = {B100,B100,B0,B1110,B10001,B10001,B1110}; // Ez a hosszú ó betű
byte o2[8] = {B1010,B0,B1110,B10001,B10001,B10001,B1110}; // Ez a rövid ö betű
byte o3[8] = {B1010,B1010,B0,B1110,B10001,B10001,B1110}; // Ez a hosszú ő betű
byte a1[8] = {B10,B100,B1110,B1,B1111,B10001,B1111}; // Ez az á betű
byte u1[8] = {B10,B100,B10001,B10001,B10001,B10011,B1101}; // Ez a hosszú ú betű
byte u2[8] = {B1010,B0,B0,B10001,B10001,B10011,B1101}; // Ez a rövid ü betű
byte u3[8] = {B1010,B1010,B0,B10001,B10001,B10011,B1101}; // Ez a hosszú ű betű
void setup () {
Serial.begin(9600);
Wire.begin();
dht.begin();
RTC.begin();
lcd.begin(20, 4);
lcd.backlight();
lcd.createChar(1, e1); // Ez az é betű
lcd.createChar(2, o2); // Ez a rövid ö betű
lcd.createChar(3, o1); // Ez a hosszú ó betű
lcd.createChar(4, o3); // Ez a hosszú ő betű
lcd.createChar(8, a1); // Ez az á betű
lcd.createChar(5, u1); // Ez a hosszú ú betű
lcd.createChar(6, u2); // Ez a rövid ü betű
lcd.createChar(7, u3); // Ez a hosszú ű betű
pinMode(8,OUTPUT);
if (! RTC.isrunning()) {
Serial.println("RTC is NOT running!");
// Beállítja az RTC dáum és idő vázlatát
RTC.adjust(DateTime(__DATE__, __TIME__));
}
}
void loop () {
DateTime now = RTC.now();
// Év,hónap,nap megjelenítése a kijelzőn
lcd.setCursor(0, 0);
lcd.print(now.year(), DEC);
lcd.print('.');
lcd.print(now.month(), DEC);
lcd.print('.');
lcd.print(now.day(), DEC);
lcd.print(' ');
lcd.setCursor(10, 0);
if (now.hour()<10)
lcd.print('0');
lcd.print(now.hour(), DEC);
lcd.print(':');
if (now.minute()<10)
lcd.print('0');
lcd.print(now.minute(), DEC);
lcd.print(':');
if (now.second()<10)
lcd.print('0');
lcd.print(now.second(), DEC);
lcd.setCursor(6, 1);
int dayofweek = now.dayOfWeek();
switch(dayofweek){
case 1:
lcd.print("Hetfo");
lcd.setCursor(7, 1);
lcd.write(1);
lcd.setCursor(10, 1);
lcd.write(4);
break;
case 2:
lcd.print("Kedd");
break;
case 3:
lcd.print("Szerda");
break;
case 4:
lcd.print("Csutortok");
lcd.setCursor(8, 1);
lcd.write(6);
lcd.setCursor(10, 1);
lcd.write(2);
lcd.setCursor(13, 1);
lcd.write(2);
break;
case 5:
lcd.print("Pentek");
lcd.setCursor(7, 1);
lcd.write(1);
break;
case 6:
lcd.print("Szombat");
break;
case 0:
lcd.print("Vasarnap");
lcd.setCursor(9, 1);
lcd.write(0);
break;
delay(1000);
}
{
// DHT22 szenzor paraméterei megjelenítése LCD kijelző
float h = dht.readHumidity();
float t = dht.readTemperature();
// set the cursor to (0,0):
lcd.setCursor(0, 2);
// print from 0 to 9:
lcd.setCursor(0, 2);
lcd.print("Homerseklet: ");
lcd.setCursor(1, 2); //Kurzor 3. sor 2. karakternél
lcd.write(4); //Átírjuk az o betüt ő-re
lcd.setCursor(3, 2); //Kurzor 3. sor 4-es karakternél
lcd.write(1); //Átírjuk az e betüt é-re
lcd.setCursor(6, 2); //Kurzor 3. sor 7-es karakternél
lcd.write(1); //Átírjuk az e betüt é-re
lcd.setCursor(13, 2); //Kurzor 3. sor 14-es karakternél
lcd.print(t); //Hőmérséklet érték kiírása
lcd.print((char)223); //Fokjel előhívása memoriából
lcd.print("C");
// set the cursor to (16,1):
lcd.setCursor(0, 3);
lcd.print("Paratartalom: ");
lcd.setCursor(1, 3);
lcd.write(8); //Átírjuk az a betüt á-re
lcd.setCursor(14, 3); // A páratartalom kijelzés a 14.sortól kezdődik
lcd.print(h);
lcd.print("%");
delay(200);
}
}
Nagyon köszönöm a segítséget
Cseréltél oprendszert a legutóbbi jó futás óta?
|
|