Výtah se 3 podlažími
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.
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.
- 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
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"
Pavel1TU
"Správně napsaný kod lze číst jako knihu"
Re: Výtah se 3 podlažími
#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.
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
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.
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
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.
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á:
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
}
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
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?
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
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
Co?
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
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
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.
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
Ty podmínky co jsem napsal dávají trochu smysl?
Místo stop bych měl napsat co??
Místo stop bych měl napsat co??
Re: Výtah se 3 podlažími
Pro motor nemusím mít knihovnu ?
Kdo je online
Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 8 hostů