Stránka 1 z 2
Millis - funguje keď držím tlačidlo
Napsal: 21 led 2018, 20:10
od martinius96
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..
Re: Millis - funguje keď držím tlačidlo
Napsal: 21 led 2018, 20:28
od jankop
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ě?
Re: Millis - funguje keď držím tlačidlo
Napsal: 21 led 2018, 20:32
od ohruska
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.
Re: Millis - funguje keď držím tlačidlo
Napsal: 21 led 2018, 20:36
od martinius96
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.
Re: Millis - funguje keď držím tlačidlo
Napsal: 21 led 2018, 20:45
od jankop
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?
Re: Millis - funguje keď držím tlačidlo
Napsal: 21 led 2018, 20:47
od ohruska
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;
}
}
Re: Millis - funguje keď držím tlačidlo
Napsal: 21 led 2018, 20:53
od ohruska
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;
}
}
}
Re: Millis - funguje keď držím tlačidlo
Napsal: 21 led 2018, 20:56
od martinius96
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.
Re: Millis - funguje keď držím tlačidlo
Napsal: 21 led 2018, 21:03
od ohruska
Protože se celá smyčka prováděla jenom když bylo tlačítko zmáčknuté. Je to tom větvení programu.
Re: Millis - funguje keď držím tlačidlo
Napsal: 21 led 2018, 21:06
od jankop
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.