Výtah se 3 podlažími

Nedaří se vám s projektem a nenašli jste vhodné místo, kde se zeptat? Napište sem.
Pravidla fóra
Tohle subfórum je určeno pro konzultaci ucelených nápadů, popřípadě řešení komplexnějších projektů, které opravdu není možné rozdělit na menší části.
Většinu problémů jde rozdělit na menší a ptát se na ně v konkrétních subfórech.
Odpovědět
jankop
Příspěvky: 577
Registrován: 06 zář 2017, 20:04
Reputation: 0
Bydliště: Brno
Kontaktovat uživatele:

Re: Výtah se 3 podlažími

Příspěvek od jankop » 21 pro 2018, 21:41

Marty nezlob se, ale ty nemáš správně ani ten program na vypsání patra. Do té petanovy skicy doplnit zobrazení pater na displeji je hodně jednoduché.
Nemáš logiku řízení motoru a čtení senzorů, nemáš ani to pitomý zobrazení patra na displeji, ale říkáš
Vše už jsem udělal jen nevím jak ten motor řídit tak
Nemáš vůbec nic a říkáš, že chceš poradit, ve skutečnosti chceš, aby to někdo udělal za tebe. Nevidím od tebe absolutně žádnou snahu něco vytvořit.
Tohle už zní skoro jako vtip -
Ten kod který tady mám je na vypisování pater

petan
Příspěvky: 356
Registrován: 23 črc 2017, 10:19
Reputation: 0
Kontaktovat uživatele:

Re: Výtah se 3 podlažími

Příspěvek od petan » 21 pro 2018, 22:18

Nechtel jsem Martyho hned odradit. Nejsme tu na elektrika.cz :lol: Ale asi budes muset trochu maknout :P

Ale zas to nebudu psat vsechno, ze. Na to je tu kategorie nabidka prace. A pokud je to maturita, tak to plati dvojnasob...

Uz jsem se tu rozepisoval v tomto vlaknu:
https://arduino-forum.cz/viewtopic.php?f=33&t=469

Marty+-
Příspěvky: 35
Registrován: 12 pro 2018, 12:12
Reputation: 0

Re: Výtah se 3 podlažími

Příspěvek od Marty+- » 25 pro 2018, 10:01

Chci se zeptat. Toto je kod který jsem napsal a rád bych věděl jestli je to dobrá cesta.Není to všechno co tam má být.Jen jestli to vede jákým dobrým směrem.

Kód: Vybrat vše

int i=1; // hodnota představuje místo výtahu (výtah v prvním patře)
int btnpatro3=4;  //  3.patro
int btnpatro2=3; //   2.patro
int btnpatro1=2;  //  1.patro

int btnVytah3=7;
int btnVytah2=6;
int btnVytah1=5;

int buttonState=0;
int buttonState2=0;
int buttonState3=0;

int motorPin1 = 11; 
int motorPin2 = 10; 
int motorPin3 = 9; 
int motorPin4 = 8;


void setup() {
    
 pinMode(motorPin1, OUTPUT); 
 pinMode(motorPin2, OUTPUT); 
 pinMode(motorPin3, OUTPUT); 
 pinMode(motorPin4, OUTPUT); 
  int delayTime = 50; 
  
  Serial.begin(9600);
  pinMode(btn2,INPUT);
  pinMode(btn3,INPUT);
  pinMode(btn1,INPUT);
}

void loop() {
 // Serial.println("Jsi na i patre"); 
buttonState = digitalRead(btn1);
buttonState2 = digitalRead(btn2);
buttonState3 = digitalRead(btn3);
 zobrazuje(cislo[i]);
 
 //3.patro
  if(buttonState3==HIGH){
  
    if(i<3){
      while(i<3) {
      i--;
      dolu();
    Serial.print("jsi na");
    Serial.print(i);
    Serial.println("patro");
   zobrazuje(cislo[i]);
      }
    }
    
  i=3; //hodnota vytahu 3
     zobrazuje(cislo[i]);    
  }

// 2.patro
  if(buttonState2 == HIGH){
  if(i>2){
    while(i>2)
    {
    i++;
    nahoru();
    Serial.print("jsi na");
    Serial.print(i);
    Serial.println("patro");
   zobrazuje(cislo[i]);
  show(numbers[i]);
    }  
    i=2;  
    zobrazuje(cislo[i]);  
  }
      if(i<2){
      while(i<2){
        i--;
        dolu();
    Serial.print("jsi na");
    Serial.print(i);
    Serial.println("patro");
   zobrazuje(cislo[i]);
  
      }
      i=2;
   zobrazuje(cislo[i]);
      delay(1000);
    } 
    }
// 1.patro
  if(buttonState == HIGH){
    if(i>1){
      while(i>1){
      
      i++;
      nahoru();
    Serial.print("jsi na");
    Serial.print(i);
    Serial.println("patro");
   zobrazuje(cislo[i]);
    }
    }
    i=1;       
 zobrazuje(cislo[i]);
    delay(1000);
  }    
} 

void nahoru() { 

  for(int b=0; b<700; b++){
  zobrazuje(cislo[i]);
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin4, HIGH);
  delay(3);
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin3, HIGH);
  digitalWrite(motorPin4, LOW);
  delay(3);
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, HIGH);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin4, LOW);
  delay(3);
  digitalWrite(motorPin1, HIGH);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin4, LOW);  
  delay(3);
  }

}

void dolu() { 
  
 for(int a=0;a<700;a++){
  zobrazuje(cislo[i]);
 digitalWrite(motorPin1, HIGH); 
 digitalWrite(motorPin2, LOW); 
 digitalWrite(motorPin3, LOW); 
 digitalWrite(motorPin4, LOW); 
 delay(3);
 digitalWrite(motorPin1, LOW); 
 digitalWrite(motorPin2, HIGH); 
 digitalWrite(motorPin3, LOW); 
 digitalWrite(motorPin4, LOW); 
 delay(3);
 digitalWrite(motorPin1, LOW); 
 digitalWrite(motorPin2, LOW); 
 digitalWrite(motorPin3, HIGH); 
 digitalWrite(motorPin4, LOW); 
 delay(3);
 digitalWrite(motorPin1, LOW); 
 digitalWrite(motorPin2, LOW); 
 digitalWrite(motorPin3, LOW); 
 digitalWrite(motorPin4, HIGH); 
 delay(3);
 
 }
}




petan
Příspěvky: 356
Registrován: 23 črc 2017, 10:19
Reputation: 0
Kontaktovat uživatele:

Re: Výtah se 3 podlažími

Příspěvek od petan » 25 pro 2018, 13:39

No, konečně nějakej kód... Jako, nejlepší ověření je zkusit si ten program nahrát do Arduina. Když máš HW, tak to můžeš rovnou odzkoušet. Ale jak to vypadá, tak sis nezkusil program ani přeložit! Tak do psích náušnic, trošku se do toho taky zapoj...

Kde jsou definovaný proměnný "btn1", atd.? Nemá tam spíš být btnPatro, nebo tak něco?

Kód: Vybrat vše

pinMode(btn1,INPUT);
pinMode(btn2,INPUT);
pinMode(btn3,INPUT);

buttonState = digitalRead(btn1);
buttonState2 = digitalRead(btn2);
buttonState3 = digitalRead(btn3);
V Setupu bude lepší, když si pinMode dáš všechny pod sebe. Program pak bude přehlednější. Takhle nastavuješ výstupy, pak něco mezi tím, pak zas vstupy... Chyba to není, ale je to přehlednější.

Do proměnné buttonState ukládáš digitální stav vstupu. Je to proměnná jenom true/false. Nemusíš tedy používat typ proměnné int, ale bool. Sice to s int taky funguje, ale je to špatný přístup. Ušetří se tím taky paměť - bool zabírá polovinu paměti int.
Pokud použijet bool proměnnou v konstrukci if..., můžeš to napsat takhle: if(proměnná){. Pokud je proměnná true, tak se automaticky podmínka provede, pokud false, tak se neprovede. Je to takovej čistší způsob. Pokud by si chtěl nahradit if(proměnná == false){, můžeš to napsat takto: if(!proměnná){. Vykřičník neguje proměnnou.

LOW == false; HIGH == true. Je to jenom jiné pojmenování. Doporučuji používat true/false.

Co má podle tebe dělat tento řádek? zobrazuje(cislo(i)); a řádek show(numbers(i));?
Funkci zobrazuje a shownemáš nikde definovanou. Proměnnou cislo taky ne. Navíc, když to napíšeš takhle, tak proměnná cislo musí být pole. To mi vůbec nedává smysl...

Ve funkci nahoru() a dolu() máš použitou konstrukci for(int b=0; b<700; b++){. Proměnná b (případně a) je v tomto případě deklarovaná jenom uvnitř smyčky. Můžeš tedy pokaždé použít stejný název proměnné. Pokud je smyčka pouze jedna, je taková zvyklost jako název proměnné použít název i. To sice nemá na funkčnost vliv, ale líp to vypadá :)
Uvnitř máš čekání pomocí delay 12ms. Pokud spustíš jednu z těchto funkcí, tak program "zamrzne" na 8,4s. Sice to možná přejede mezi patry, ale když máš čidla, tak tohle kurva vůbec nemusíš použít. Stačí hlídat, jestli je výtah v požadovaném patře a pokud ne, tak sepnout motor na jeden směr. Koukni se, co jsem psal předtím. Tam jsou ty podmínky udělaný. Úplně ten cyklus smaž a hlídej to snímačem!

To je co, jsem zahlídl jen tak letmým pohledem... K samotnému programu.

Představ si, že budeš mít výtah s 30, nebo 60 patry. To budeš do nekonečna pro každé patro a každou pozici výtahu definovat část kódu? Celou tvoji logiku programu můžeš nahradit tím, co jsem ti předtím psal. Doporučuju ti se vyvarovat zejména konstrukci while. Jednat v tomhle případě je zbytečná a to tě tak zacyklí, že pokud nevíš, jak program jede, tak se do toho pěkně zamotáš. Teď není nic, co by nešlo udělat bez IF...

Představ si, že je výtah třeba v 1. patře (podle proměnné, kterou sis definoval hned na začátku programu tam i je). Stiskneš tlačítko pro jízdu do 3. patra. proměnná i (mimochodem zcela nelogicky pojmenovaná) je menší než 3, takže se provede podmínka. Pak se provede podmínka while. Odečte (!) se proměnná i (nyní 0) a výtah jede dolu. Má vůbec kam? Bacha, aby se neproboural do sklepa! Tam jede už zmíněných 8,4s. Pak to na displej vypíše text (toto by šlo vypíchnout do sólo funkce) a vrátí se to zpět na řádek while... Podmínka je stále splněna, protože odečítáš, takže se ti program zacyklí a výtah dojede tak leda do Číny.

Kód: Vybrat vše

if(buttonState3==HIGH){
  
    if(i<3){
      while(i<3) {
      i--;
      dolu();
    Serial.print("jsi na");
    Serial.print(i);
    Serial.println("patro");
   //zobrazuje(cislo[i]);
      }
    }
    
  i=3; //hodnota vytahu 3
     //zobrazuje(cislo[i]);    
  }
  
Jasný, u jiných tlačítek se to chová trochu jinak, protože podmínky nejsou zcela totožný.Ale to budeš pro každý patro vymejšlet samostatnou konstrukci? vzpomeň si na těch 30 pater... Z tohohle pohledu ANO, program lze tak napsat (po pár úpravách by to i jakštakš fungovalo), ale v žádném případě tohle NENÍ dobrá cesta.

Ještě jednou se koukni na můj předchozí kód. Připoj do Arduina ty 3 snímače pater co jsi zde psal na začátku. Ty budou říkat ve kterým poschodí se reálně výtah nachází. Pak si pomocí tlačítek do nějaké proměnné nastavíš do jakého patra chceš jet. A pak jednoduchou podmínkou (viz ten kód) rozhodneš, jestli má jet výtah nahoru, nebo dolu, nebo stát. Nemusíš hlídat žádný počet cyklů, žádný čas. Jednom porovnáváš reálné proměnné. Sám HW výtahu ti řekne, kdy přesně je ve správném patře. Toto lze pak naaplikovat třeba na 100 pater a program se ti zvětší jenom o přiřazení aktuálního patra do proměnné. Logika bude stále na pár řádků.

petan
Příspěvky: 356
Registrován: 23 črc 2017, 10:19
Reputation: 0
Kontaktovat uživatele:

Re: Výtah se 3 podlažími

Příspěvek od petan » 25 pro 2018, 14:36

Ještě takovej ideovej návrh programu...jak bych to dělal já

Kód: Vybrat vše


void loop(){
	//uložit aktuální patro do proměnné
	//hlídat stisk tlačítka, po stisku uložit požadované patro do proměnné
	
	//logika ovládání - pokud není v aktuálním patře, tak jet (viz předchozí kód)
	//má jet nahoru, tak VytahNahoru()
	//má jet dolu, rak vytahDolu()
	
	//VypisPatra();
}

void VytahNahoru(){
	//posun výtahu nahoru
	//žádná logika pro hlídání atd tu není, jenom kód k jetí nahoru
	//jedno spuštění funkce = jeden krok krokového motoru
}

void VytahDolu(){
	//posun výtahu dolu
	//žádná logika pro hlídání atd tu není, jenom kód k jetí dolu
	//jedno spuštění funkce = jeden krok krokového motoru
}

void VypisPatra(){
	//print("aktualni patro: ");
	//print(aktualniPatro);
	//Dalsi radek
	//print("Pozadovane patro: ");
	//print (pozadovanePatro);
	//print ("stav vytahu: ");
	//podle stavy vypasat - stoji/jeden nahoru/jede dolu
}
K tomu pohybu motoru bych ještě dodal, že bych vyseparoval nastavování jednotlivých výstupů do samostatné funkce a podle nějakého parametru bych spouštěl jednotlivé kroky. Asi to nedává moc smysl, ale myslím to třeba takhle:

Kód: Vybrat vše

int krokMotoru = 0;

void JedNahoru(){
	krokMotoru++;
	if(krokMotoru > 3){
		krokMotoru = 0;
	}
	RizeniMotoru(krokMotoru);
}

void JedDolu(){
	krokMotoru--;
	if(krokMotoru < 0){
		krokMotoru = 3;
	}
	RizeniMotoru(krokMotoru);
}

void RizeniMotoru(int step){
if(step < 0 || step > 3){
	//jenom takovej sichr.
	//Pokud je proměnná step menší než 0, nebo větší než 3, tak se do proměnné přiřadí 0, tedy první krok
	step = 0;
}

switch(step){
	case 0:
		digitalWrite(motorPin1, HIGH);
  		digitalWrite(motorPin2, LOW);
 	 	digitalWrite(motorPin3, LOW);
  		digitalWrite(motorPin4, LOW);
		break;
	case 1:
		digitalWrite(motorPin1, LOW);
  		digitalWrite(motorPin2, HIGH);
 	 	digitalWrite(motorPin3, LOW);
  		digitalWrite(motorPin4, LOW);
		break;
	case 2:
		digitalWrite(motorPin1, LOW);
  		digitalWrite(motorPin2, LOW);
 	 	digitalWrite(motorPin3, HIGH);
  		digitalWrite(motorPin4, LOW);
		break;
	case 3:
		digitalWrite(motorPin1, LOW);
  		digitalWrite(motorPin2, LOW);
 	 	digitalWrite(motorPin3, LOW);
  		digitalWrite(motorPin4, HIGH);
		break;		
}

delay(3);
}
Výhoda je, že pokud je motor třeba ve 3. kroku a ty se rozhodneš jet na druhou stranu, tak ti motor nepřeskočí (nezačne od nuly), ale naváže v posledním aktivním kroku...
Všimni si, že volám funkci RizeniMotoru s parametrem. Zavolám tedy třeba RizeniMotoru(2). Do proměnné step (pozor, tato proměnná platí jenom v této funkci!) se přiřadí číslo 2. Pak s tím pracuju dál - podle aktuálního číslo se spustí jednotlivý krok, potom čekání a pak pokračuje program, odkud byla funkce vyvolána.

Marty+-
Příspěvky: 35
Registrován: 12 pro 2018, 12:12
Reputation: 0

Re: Výtah se 3 podlažími

Příspěvek od Marty+- » 27 pro 2018, 12:01

Když radíš nepoužívat int. Jak mám přiřadit senzorům a tlačítkům jejich pin výstupy. Nikdy jsem nepsal program bez int. Tak se jen chci informovat.

petan
Příspěvky: 356
Registrován: 23 črc 2017, 10:19
Reputation: 0
Kontaktovat uživatele:

Re: Výtah se 3 podlažími

Příspěvek od petan » 27 pro 2018, 17:14

Však já nemyslím číslo pinu ale stav pinu. Takhle:

Kód: Vybrat vše

int cisloPinu = 5;	//Číslo pinu - udává fyzické číslo pinu arduina
#define cisloPinu 5	//druhá varianta, viz text níž
bool stavPinu;	//stav pinu - udává logickou hodnotu na pinu - log.1, nebo log.0

pinMode(cisloPinu, INPUT);
stavPinu = digitalRead(cisloPinu);
Místo číslo pinu můžeš použít #define. Když si nadefinuješ proměnou int, tak ta zabírá v programu nějakou paměť. Ale pokud použiješ #define, tak už kompilátor v počítači nahradí všechny texty "cisloPinu" textem "5". Viz zde: https://www.arduino.cc/reference/en/lan ... ax/define/

Marty+-
Příspěvky: 35
Registrován: 12 pro 2018, 12:12
Reputation: 0

Re: Výtah se 3 podlažími

Příspěvek od Marty+- » 28 pro 2018, 13:26

Takhle by to mohlo bejt.

Kód: Vybrat vše

#define sensPatro01 1
#define sensPatro02 2
#define sensPatro03 3
#define btnVytah01  4
#define btnVytah02  5
#define btnVytah03  6
#define btnPatro01  7
#define btnPatro02  8
#define btnPatro03  9
#define motorPin1  10
#define motorPin2  11
#define motorPin3  12 
#define motorPin4  13 

bool sensPatro1, sensPatro2, sensPatro3;  //snimace pater
bool btnVytah1, btnVytah2, btnVytah3; //tlacitka ve vytahu
bool btnPatro1, btnPatro2, btnPatro3; //tlacitka v patrech
byte stavVytahu;  //musis vedet, co vytah dela, abys podle toho mohl resit nejakou logiku. Tezko muzes privolat vytah dolu, když jede nahoru
      //0 - vytah stoji, 1 - vytah jede dolu, 2 - vytah jede nahoru, atd. Pripadne to řesit pomoci bool proměnnych
byte aktualniPatro;


void setup() {
  // put your setup code here, to run once:
pinMode(motorPin1, OUTPUT); 
pinMode(motorPin2, OUTPUT); 
pinMode(motorPin3, OUTPUT); 
pinMode(motorPin4, OUTPUT); 
pinMode(btnVytah1, INPUT);
pinMode(btnVytah2, INPUT);
pinMode(btnVytah3, INPUT);
pinMode(btnPatro1, INPUT);
pinMode(btnPatro2, INPUT);
pinMode(btnPatro3, INPUT);
pinMode(sensPatro1,INPUT);
pinMode(sensPatro2,INPUT);
pinMode(sensPatro3,INPUT);
}

void loop(){    //zde přidělit proměnným hodnoty z digitálních vstupů

  if(sensPatro1){
    aktualniPatro = 1;
  }

  if(sensPatro2){
    aktualniPatro = 2;
  }

  if(sensPatro3){
    aktualniPatro = 3;
  }

  if(vytahStoji && stisknutoPrivolavaciTlacitko){
    if(aktualniPatro < pozadovanePatro){
      jedNahoru = true;
    }
    
    if(aktualniPatro > pozadovanePatro){
      jedDolu = true;
    }

    if(aktualniPatro == pozadovanePatro){
      jedNahoru = false;
      jedDolu = false;
    }
    
  }
  
  //a tak dále :)
  
}

petan
Příspěvky: 356
Registrován: 23 črc 2017, 10:19
Reputation: 0
Kontaktovat uživatele:

Re: Výtah se 3 podlažími

Příspěvek od petan » 28 pro 2018, 18:33

možno tak...

Akorát bych si změnil název třeba z sensPatro01 třeba na PINsensPatro1. Aby ti bylo jasný, že to není proměnná senzoru, ale pouze ten pin.

Většinou, když mám něco za #define, nebo konstantu, tak nechávám některá písmena velký (v tomto případě PIN), aby bylo jasné, že to nemůžu už měnit. Jinak na ostatní proměnné CamelCase

Už ti to jezdí? :D

Marty+-
Příspěvky: 35
Registrován: 12 pro 2018, 12:12
Reputation: 0

Re: Výtah se 3 podlažími

Příspěvek od Marty+- » 28 pro 2018, 19:48

Nejezdí. :twisted: Teďka chci využít ty dva programy, které si sem posílal naposledy.

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 1 host