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
Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

Re: Výtah se 3 podlažími

Příspěvek od pavel1tu » 28 pro 2018, 20:41

Pokud jsi nikdy nic takového neprogramoval, vytvoř si nejprve "pavouka" - logický graf co se kdy má stát, když něco.
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

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+- » 30 pro 2018, 18:23

#define PINbtnPatro3 9 Když to takhle napíšu tak mi vyskakuje hláška expected unqualified-id before numeric constant
Nevíte jak se toho zbavit.

Kód: Vybrat vše

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Stepper.h>
#define PINsensPatro1 1
#define PINsensPatro2 2
#define PINsensPatro3 3
#define PINbtnVytah1  4
#define PINbtnVytah2  5
#define PINbtnVytah3  6
#define PINbtnPatro1  7
#define PINbtnPatro2  8
#define PINbtnPatro3  9
#define motorPin1     10
#define motorPin2     11
#define motorPin3     12 
#define motorPin4     13 
int krokMotoru = 0;
LiquidCrystal_I2C lcd(0x27, 20, 4);

bool PINsensPatro1, PINsensPatro2, PINsensPatro3;  //snimace pater
bool PINbtnVytah1, PINbtnVytah2, PINbtnVytah3; //tlacitka ve vytahu
bool PINbtnPatro1, PINbtnPatro2, PINbtnPatro3; //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(PINbtnVytah1, INPUT);
pinMode(PINbtnVytah2, INPUT);
pinMode(PINbtnVytah3, INPUT);
pinMode(PINbtnPatro1, INPUT);
pinMode(PINbtnPatro2, INPUT);
pinMode(PINbtnPatro3, INPUT);
pinMode(PINsensPatro1,INPUT);
pinMode(PINsensPatro2,INPUT);
pinMode(PINsensPatro3,INPUT);
lcd.begin();
}
void loop(){    //zde přidělit proměnným hodnoty z digitálních vstupů

  if(PINsensPatro1){
    aktualniPatro = 1;}
    
  if(PINsensPatro2){
    aktualniPatro = 2;}
    
  if(PINsensPatro3){
    aktualniPatro = 3;}
    
  if(vytahStoji && stisknutoPrivolavaciTlacitko)
  {
    if(aktualniPatro < pozadovanePatro){
      jedNahoru = true;
    }
    
    if(aktualniPatro > pozadovanePatro){
      jedDolu = true;}
      
    if(aktualniPatro == pozadovanePatro){
      jedNahoru = false;
      jedDolu = false;}          
  }
  if(vytahjedeNahoru && stisknutoPrivolavaciTlacitko){
    
    if(aktualniPatro<pozadovanePatro){
      stop==pozadovanePatro && jedNahoru}

    if(aktualniPatro>pozadovanePatro){
      jedNahoru = true;}
  }
   if(vytahjedeDolu && stisknutuPrivolavaciTlacitko){
    
     if(aktualniPatro<pozadovanePatro){
      jedDolu = true;}
      
     if(aktualniPatro>pozadovanePatro){
       stop==pozadovanePatro && jedDolu}
   }
  void VypisPatra(){
 lcd.setCursor(0,0);
 lcd.print("Patro:"); 
 lcd.print(digitalRead(akualniPatro));
  }
  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);
}  
}

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

Re: Výtah se 3 podlažími

Příspěvek od petan » 30 pro 2018, 19:09

No, to je úplně jasný. Ty nejdřív definuješ pro PINsensPatro1 jako číslo a pak úplně stejný názvy použiješ jako proměnný.
To define# slouží jenom kvůli tomu, aby si místo čísla mohl psát nějaký název. A protože tam máš čísla a pak pomocí stejných názvů vytváříš proměnné hodí ti to chybu. Proměnná nesmí začínat a nesmí se pojmenovat číslem.

Kód: Vybrat vše

//NÁZVY PINŮ ARDUINA
#define PINsensPatro1 1
#define PINsensPatro2 2
#define PINsensPatro3 3

//STAVY PINŮ ARDUINA
bool PINsensPatro1, PINsensPatro2, PINsensPatro3;  //snimace pater	//TOTO JE ŠPATNĚ

bool sensPatro1, sensPatro2, sensPatro3;  //snimace pater	//TOTO JE DOBŘE

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

Re: Výtah se 3 podlažími

Příspěvek od petan » 30 pro 2018, 19:15

Tohle má dělat co?
Porovnáváš (==) pod podmínkou. A i kdyby to mělo nějaký smysl, chybí ti tam středník.

Kód: Vybrat vše

if (aktualniPatro<pozadovanePatro) {
	stop == pozadovanePatro && jedNahoru
}
Dál máš uvnitř funkce loop() definovanou další funkci. Máš tedy dvě funkce v sobě. To nelze. Musíš nejdřív jednu funkci ukončit a teprv potom definovat další. Touto to začíná:

Kód: Vybrat vše

void VypisPatra() {
	lcd.setCursor(0, 0);
	lcd.print("Patro:");
	lcd.print(digitalRead(akualniPatro));
}

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+- » 30 pro 2018, 19:40

Takže stačí jenom napsat #definePINsensPatro1
if (aktualniPatro...)
Měl být pokus o podmínku, že když výtah je třeba zavolán do 3 patra a pak má jet dolů a cestou někdo ve 2 patře zmáčkne tlačítko výtah se zastaví a pak pojede tam kam měl jet poprvé.
VypisPatra má vypisovat jen ve kterém je patře.
To hodím jen do samotné funkce a pak by to mohlo něco psát?

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+- » 01 led 2019, 12:10

Kod je bez chyb.Ale jinak je jich tam dost.Nwm jak bych měl zapsat podmínku, že dyž někdo jede nahoru např.3 patro a někdo ve druhém patře zmáčkne tlačítko tak u něj výah zastaví a pak jede dál.Jak jsem to zapsal tak to není dobře.Byl bych vděčný za návrh. ;)

Kód: Vybrat vše

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Stepper.h>
#define PINsensPatroprvni 1
#define PINsensPatrodruhy 2
#define PINsensPatrotreti 3
#define PINbtnVytahprvni  4
#define PINbtnVytahdruhy  5
#define PINbtnVytahtreti  6
#define PINbtnPatroprvni  7
#define PINbtnPatrodruhy  8
#define PINbtnPatrotreti  9
#define motorPin1     10
#define motorPin2     11
#define motorPin3     12 
#define motorPin4     13 
int krokMotoru = 0;
LiquidCrystal_I2C lcd(0x27, 20, 4);

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;
byte vytahStoji=0;
byte stisknutoPrivolavaciTlacitko;
byte pozadovanePatro;
byte jedNahoru=2;
byte jedDolu=1;
byte stop=0;


void setup() {
  // put your setup code here, to run once:
pinMode(motorPin1, OUTPUT); 
pinMode(motorPin2, OUTPUT); 
pinMode(motorPin3, OUTPUT); 
pinMode(motorPin4, OUTPUT); 
pinMode(PINbtnVytahprvni, INPUT);
pinMode(PINbtnVytahdruhy, INPUT);
pinMode(PINbtnVytahtreti, INPUT);
pinMode(PINbtnPatroprvni, INPUT);
pinMode(PINbtnPatrodruhy, INPUT);
pinMode(PINbtnPatrotreti, INPUT);
pinMode(PINsensPatroprvni,INPUT);
pinMode(PINsensPatrodruhy,INPUT);
pinMode(PINsensPatrotreti,INPUT);
lcd.begin();
}

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;}          
  }
  if(jedNahoru && stisknutoPrivolavaciTlacitko){
    
    if(aktualniPatro<pozadovanePatro){
      stop==pozadovanePatro && jedNahoru;}

    if(aktualniPatro>pozadovanePatro){
      jedNahoru = true;}
  }
   if(jedDolu && stisknutoPrivolavaciTlacitko){
    
     if(aktualniPatro<pozadovanePatro){
      jedDolu = true;}
      
     if(aktualniPatro>pozadovanePatro){
       stop==pozadovanePatro && jedDolu;}
   }
}
void VypisPatra(){
 lcd.setCursor(0,0);
 lcd.print("Patro:"); 
 lcd.print(digitalRead(aktualniPatro));
  }
  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);
}  

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

Re: Výtah se 3 podlažími

Příspěvek od petan » 01 led 2019, 13:24

Marty+- píše:
01 led 2019, 12:10
Kod je bez chyb.Ale jinak je jich tam dost.
Co? :D

Ty podmínky jsou právě to, co budeš muset vymyslet. Když se na ten program koukneš, tak si v podstatě ještě nic nenapsal. Je to spíš tvůj job. Něco napiš, pak to vyzkoušej, když to nefunguje, tak to přepiš a vyzkoušej znovu. Když už máš připojenej displej, tak si můžeš nechat na displej vypisovat aktuální stav programu - uvidíš, co se uvnitř procesoru děje.
Když ti to někdo napíše, tak se to nenaučíš. A nebo si to můžeš zadat do kategorie Nabídka práce :lol:

Jen taková nápověda. Místo byte bych použil bool proměnné. Stejně Každá reprezentuje jenom hodnotu ano/ne. Třeba proměnná "jedeNahoru" může být buď pravda, nebo nepravda. Takže bool. Ten byte, jak jsem psal předtím by šel asi taky použít ale to je pro tebe asi jinej level. Přehlednější to bude, když budeš vyhodnocovat jenom bool proměnné.

A ještě takový pošťouchnutí - chybí ti přiřazování stavu pinů do proměnných. Jak se do proměnné sensPatro1 dostane aktuální stav vstupního pinu? Nápověda ... sensPatro1 = digitalRead(PINsensPatroprvni);

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

Re: Výtah se 3 podlažími

Příspěvek od petan » 01 led 2019, 13:43

Ještě jsem si všiml:

K čemu tam máš knihovnu stepper když ji nikde nepoužíváš a logický stav výstupních pinů řešíš přímo v programu? knihovna se používá takhle.

Pozor na používání názvů proměnných jako "stop", "step", atd. Může se stát, že stejný název např. funkce používá nějaká knihovna (třeba ten stepper). Je lepší pojmenovávat proměnné více specificky. Proměnné nesmějí začínat číslem a nesmí být použity klíčová slova jazyka.

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+- » 01 led 2019, 13:47

Ty podmínky co jsem napsal dávají trochu smysl? :?
Místo stop bych měl napsat co??

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+- » 01 led 2019, 13:49

Pro motor nemusím mít knihovnu ?

Odpovědět

Kdo je online

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