Stránka 4 z 7

Re: Výtah se 3 podlažími

Napsal: 28 pro 2018, 20:41
od pavel1tu
Pokud jsi nikdy nic takového neprogramoval, vytvoř si nejprve "pavouka" - logický graf co se kdy má stát, když něco.

Re: Výtah se 3 podlažími

Napsal: 30 pro 2018, 18:23
od Marty+-
#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);
}  
}

Re: Výtah se 3 podlažími

Napsal: 30 pro 2018, 19:09
od petan
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

Re: Výtah se 3 podlažími

Napsal: 30 pro 2018, 19:15
od petan
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));
}

Re: Výtah se 3 podlažími

Napsal: 30 pro 2018, 19:40
od Marty+-
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?

Re: Výtah se 3 podlažími

Napsal: 01 led 2019, 12:10
od Marty+-
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);
}  

Re: Výtah se 3 podlažími

Napsal: 01 led 2019, 13:24
od petan
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);

Re: Výtah se 3 podlažími

Napsal: 01 led 2019, 13:43
od petan
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.

Re: Výtah se 3 podlažími

Napsal: 01 led 2019, 13:47
od Marty+-
Ty podmínky co jsem napsal dávají trochu smysl? :?
Místo stop bych měl napsat co??

Re: Výtah se 3 podlažími

Napsal: 01 led 2019, 13:49
od Marty+-
Pro motor nemusím mít knihovnu ?