Millis - funguje keď držím tlačidlo

Wiring, C++, C, Java, ...
Pravidla fóra
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
martinius96
Příspěvky: 585
Registrován: 01 srp 2017, 19:29
Bydliště: Poprad
Kontaktovat uživatele:

Millis - funguje keď držím tlačidlo

Příspěvek od martinius96 » 21 led 2018, 20:10

Ahoj, mám jednoduchý sketch, kde chcem po stlačení tlačidla spustiť relé a otočiť servo motor po pauze 5 sekund.. Problem je ten, že sa podmienka vykona po millis a ak mam vtedy pustene tlačidlo, tak sa to nevykoná.. Keď tlačidlo stlačím znova po 5s.. napr na 1 milisekundu, tak sa to vykoná :-) Čo mám zle?

Kód: Vybrat vše

#include <Servo.h>  //kniznica pre servo
Servo myservo; //objekt serva
#define Relay1  4
unsigned long predchadzajucimillis = 0;        // will store last time LED was updated
unsigned long previousMillis = 0;        // will store last time LED was updated
const long interval5s = 5000;           // interval at which to blink (milliseconds)
void setup()                //do these things once
{
Serial.begin(9600);           //set data transmission rate to communicate with computer
pinMode(8,INPUT);  
pinMode(Relay1,OUTPUT);
pinMode(Relay1,HIGH);
myservo.attach(9);           //servo na pin 9 
myservo.write(0);           //uvodny uhol

}  
void loop()
{
if (digitalRead(8) == HIGH){   
  Serial.println("Otvorene");       //print the word "open"
  unsigned long aktualmillis = millis();
  if (aktualmillis - predchadzajucimillis >= interval5s) {
  predchadzajucimillis = aktualmillis;
  Serial.println("Podmienka splnena"); 
  myservo.write(180);          //otherwise, servo position is 150 degrees
  Serial.println("Servo 180°"); 
  Serial.println("");           //print nothing, go to next line
  Serial.println("closed");     //print the word "closed"
  Serial.print("waiting 30 second"); //print "waiting 5 seconds"
  Serial.println("");           //print nothing, go to next line
  digitalWrite(Relay1,HIGH); 
  }
Vo funkcii mam viacero podobnych digitalReadov..

jankop
Příspěvky: 1057
Registrován: 06 zář 2017, 20:04
Bydliště: Brno
Kontaktovat uživatele:

Re: Millis - funguje keď držím tlačidlo

Příspěvek od jankop » 21 led 2018, 20:28

Co znamená tohle pinMode(Relay1, HIGH); ? Čekal bych třeba digitalWrite().
Jak máš tlačítko ošetřeno? Obvykle bývá aktivní v LOW, ty ho testuješ na HIGH. Je to správně?

ohruska
Příspěvky: 235
Registrován: 08 pro 2017, 20:56

Re: Millis - funguje keď držím tlačidlo

Příspěvek od ohruska » 21 led 2018, 20:32

Podle mě máš špatné větvení programu.
celá smyčka se provede pokud budeš držet tlačítko déle jak 5s, nebo ho zmáčkneš 2x v intervalu větším jak 5s.

martinius96
Příspěvky: 585
Registrován: 01 srp 2017, 19:29
Bydliště: Poprad
Kontaktovat uživatele:

Re: Millis - funguje keď držím tlačidlo

Příspěvek od martinius96 » 21 led 2018, 20:36

Ten kód nie je odomňa.. mám tam byť iba OUTPUT.. pán ma poprosil o úpravu kódu..
Ano, testujem hodnotu HIGH na vstupe. Stlačenie (dobu stlačenia) nie je potrebné overovať.
Chcem aby po stlačení tlačidla (keď sa zaznamená stav) aby sa vykonalo všetko, čo je vo vnútri funkcie..
Problém je ten, že ja ho stlačím, pustím a ten millis, ktorý mi má po 5 sekundách otočiť servo, tak sa nevykoná a vykoná sa, až druhý krát stlačím tlačidlo.. :-) Chcel by som to, že ak ho stlačím raz, tak sa vykoná všetko, čo je v ňom dnu.

jankop
Příspěvky: 1057
Registrován: 06 zář 2017, 20:04
Bydliště: Brno
Kontaktovat uživatele:

Re: Millis - funguje keď držím tlačidlo

Příspěvek od jankop » 21 led 2018, 20:45

Mám trochu problém porozumět tvým myšlenkovým pochodům, ale nemá být příkaz

Kód: Vybrat vše

unsigned long aktualmillis = millis();
před testem tlačítka?

ohruska
Příspěvky: 235
Registrován: 08 pro 2017, 20:56

Re: Millis - funguje keď držím tlačidlo

Příspěvek od ohruska » 21 led 2018, 20:47

Přidal jsem proměnnou a.
Zkus něco takového:

Kód: Vybrat vše

#include <Servo.h>  //kniznica pre servo
Servo myservo; //objekt serva
#define Relay1  4
unsigned long predchadzajucimillis = 0;        // will store last time LED was updated
unsigned long previousMillis = 0;        // will store last time LED was updated
const long interval5s = 5000;           // interval at which to blink (milliseconds)

int a=0;
void setup()                //do these things once
{
Serial.begin(9600);           //set data transmission rate to communicate with computer
pinMode(8,INPUT);  
pinMode(Relay1,OUTPUT);
pinMode(Relay1,HIGH);
myservo.attach(9);           //servo na pin 9 
myservo.write(0);           //uvodny uhol

}  
void loop()
{
if (digitalRead(8) == HIGH) a=1;
   
//Serial.println("Otvorene");       //print the word "open"
unsigned long aktualmillis = millis();
if (aktualmillis - predchadzajucimillis >= interval5s) {
  predchadzajucimillis = aktualmillis;
  Serial.println("Podmienka splnena"); 
  myservo.write(180);          //otherwise, servo position is 150 degrees
  Serial.println("Servo 180°"); 
  Serial.println("");           //print nothing, go to next line
  Serial.println("closed");     //print the word "closed"
  Serial.print("waiting 30 second"); //print "waiting 5 seconds"
  Serial.println("");           //print nothing, go to next line
  digitalWrite(Relay1,HIGH); 
  a=0;
  }
}
  

ohruska
Příspěvky: 235
Registrován: 08 pro 2017, 20:56

Re: Millis - funguje keď držím tlačidlo

Příspěvek od ohruska » 21 led 2018, 20:53

Promiň, asi takto:

Kód: Vybrat vše

#include <Servo.h>  //kniznica pre servo
Servo myservo; //objekt serva
#define Relay1  4
unsigned long predchadzajucimillis = 0;        // will store last time LED was updated
unsigned long previousMillis = 0;        // will store last time LED was updated
const long interval5s = 5000;           // interval at which to blink (milliseconds)

int a=0;
void setup()                //do these things once
{
Serial.begin(9600);           //set data transmission rate to communicate with computer
pinMode(8,INPUT);  
pinMode(Relay1,OUTPUT);
pinMode(Relay1,HIGH);
myservo.attach(9);           //servo na pin 9 
myservo.write(0);           //uvodny uhol

}  
void loop()
{
if (digitalRead(8) == HIGH) a=1;
if (a==1) {  
//Serial.println("Otvorene");       //print the word "open"
unsigned long aktualmillis = millis();
if (aktualmillis - predchadzajucimillis >= interval5s) {
  predchadzajucimillis = aktualmillis;
  Serial.println("Podmienka splnena"); 
  myservo.write(180);          //otherwise, servo position is 150 degrees
  Serial.println("Servo 180°"); 
  Serial.println("");           //print nothing, go to next line
  Serial.println("closed");     //print the word "closed"
  Serial.print("waiting 30 second"); //print "waiting 5 seconds"
  Serial.println("");           //print nothing, go to next line
  digitalWrite(Relay1,HIGH); 
  a=0;
  }
}
}
  

martinius96
Příspěvky: 585
Registrován: 01 srp 2017, 19:29
Bydliště: Poprad
Kontaktovat uživatele:

Re: Millis - funguje keď držím tlačidlo

Příspěvek od martinius96 » 21 led 2018, 20:56

ohruska píše:
21 led 2018, 20:53
Promiň, asi takto:

Kód: Vybrat vše

#include <Servo.h>  //kniznica pre servo
Servo myservo; //objekt serva
#define Relay1  4
unsigned long predchadzajucimillis = 0;        // will store last time LED was updated
unsigned long previousMillis = 0;        // will store last time LED was updated
const long interval5s = 5000;           // interval at which to blink (milliseconds)

int a=0;
void setup()                //do these things once
{
Serial.begin(9600);           //set data transmission rate to communicate with computer
pinMode(8,INPUT);  
pinMode(Relay1,OUTPUT);
pinMode(Relay1,HIGH);
myservo.attach(9);           //servo na pin 9 
myservo.write(0);           //uvodny uhol

}  
void loop()
{
if (digitalRead(8) == HIGH) a=1;
if (a==1) {  
//Serial.println("Otvorene");       //print the word "open"
unsigned long aktualmillis = millis();
if (aktualmillis - predchadzajucimillis >= interval5s) {
  predchadzajucimillis = aktualmillis;
  Serial.println("Podmienka splnena"); 
  myservo.write(180);          //otherwise, servo position is 150 degrees
  Serial.println("Servo 180°"); 
  Serial.println("");           //print nothing, go to next line
  Serial.println("closed");     //print the word "closed"
  Serial.print("waiting 30 second"); //print "waiting 5 seconds"
  Serial.println("");           //print nothing, go to next line
  digitalWrite(Relay1,HIGH); 
  a=0;
  }
}
}
  
Ano, funguje to :-) Ďakujem pekne, ale prečo to chodi a predtym to nešlo, i keď je zmena len minimalna? ;)
jankop píše:
21 led 2018, 20:45
Mám trochu problém porozumět tvým myšlenkovým pochodům, ale nemá být příkaz

Kód: Vybrat vše

unsigned long aktualmillis = millis();
před testem tlačítka?
Toto nezmenilo efekt, fungovalo to tak isto ako predtým.

ohruska
Příspěvky: 235
Registrován: 08 pro 2017, 20:56

Re: Millis - funguje keď držím tlačidlo

Příspěvek od ohruska » 21 led 2018, 21:03

Protože se celá smyčka prováděla jenom když bylo tlačítko zmáčknuté. Je to tom větvení programu.

jankop
Příspěvky: 1057
Registrován: 06 zář 2017, 20:04
Bydliště: Brno
Kontaktovat uživatele:

Re: Millis - funguje keď držím tlačidlo

Příspěvek od jankop » 21 led 2018, 21:06

jankop píše:
21 led 2018, 20:45
Mám trochu problém porozumět tvým myšlenkovým pochodům, ale nemá být příkaz

Kód: Vybrat vše

unsigned long aktualmillis = millis();
před testem tlačítka?
Teď jsem to zkoušel a funguje to. Když deklaruješ aktualmillis, tak má nedefinovanou hodnotu a získá ji až po prvním stisku tlačítka. Stačí dát opravdu ten jeden řádek před test tlačítka.

Odpovědět

Kdo je online

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