Re: Výtah se 3 podlažími
Napsal: 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.
České fórum pro všechny nadšence do Arduina a dalších technologií.
https://forum.hwkitchen.cz/
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);
}
}
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
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));
}
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);
}
Co?