buenas, tengo un problema, probando con millis() voy probando comportamientos, asi que hice un código simple, que en el monitor serial me impima el tiempo de millis(), que cada segundo prenda un led y que cada tres segundo, imprima un texto, todo funciona bien, pero cuando reseteo el arduino, me imprime durante tres segundos el texto que es lo que yo no quiero, sino que comience a los tres segundo, que me falto? ademas se me descontrola los numeros que muestra de millis.
unsigned long time;
unsigned long t=0;
unsigned long Dt=1000;
int ledpin= 13;
int ledestado = LOW;
unsigned long tiempoP=0;
unsigned long intervalo=1000;
unsigned long condicion;
unsigned long ConT = 0;
unsigned long palabra = 3000;
void setup()
{
Serial.begin(9600);
pinMode(ledpin, OUTPUT);
}
void loop(){
{
time = millis();
if (time-t > Dt) {
t= time;
Serial.print("Tiempo: ");
Serial.println(time);
}
unsigned long tiempo = millis();
if (tiempo - tiempoP >=intervalo){
tiempoP = tiempo;
if (ledestado== LOW){
ledestado = HIGH;}
else {
ledestado =LOW;
}
digitalWrite(ledpin, ledestado);
}
}
unsigned long condicion = millis();
if (condicion - palabra >= ConT){
ConT= condicion;
Serial.println("SE CUMPLE LOS 3 SEG.");
}
}
A ver de este modo
const byte ledpin = 13;
unsigned long Dt = 1000;
unsigned long ConT = 3000;
unsigned long intervalo = 1000;
unsigned long t = 0;
unsigned long palabra = 0;
unsigned long tiempoP = 0;
unsigned long timeMillis;
bool ledestado = LOW;
void setup() {
Serial.begin(9600);
pinMode(ledpin, OUTPUT);
}
void loop(){
timeMillis = millis();
if (timeMillis - t > Dt) {
Serial.print("Tiempo: ");
Serial.println(timeMillis);
t = timeMillis;
}
if (timeMillis - tiempoP >= intervalo) {
tiempoP = timeMillis;
if (ledestado == LOW)
ledestado = HIGH;
else
ledestado = LOW;
digitalWrite(ledpin, ledestado);
}
if (timeMillis - palabra >= ConT) {
palabra = timeMillis;
Serial.println("SE CUMPLE LOS 3 SEG.");
}
}
No hace falta que en cada consulta uses una variable para llevar el estado de millis(), solo cambia microsegundos.
Tus procesos no son tan precisos como para tomarte ese cuuidado.
Mira el resto de los cambios.
En lo ultimo trabajabas con ConT y no con palabra.
Gracias Surbyte, claro de esa manera usando la variable timeMillis, la puedo llamar desde cualquier parte del codigo, y me ahorro ademas memoria.
Si pero no cambia mucho, solo es mas fácil a los efectos de entender todo el código.
Pero entendiste tu error?
unsigned long condicion = millis();
if (condicion - palabra >= ConT){
ConT= condicion;
Serial.println("SE CUMPLE LOS 3 SEG.");
}
mira ahi.. condicion es tu millis()
palabra valia en tu caso 3000
pero luego el que cambiabas es ConT asi que al arrancar te encuentras con supongamos condicion = 200
200 - 3000 = ? eso da como diferencia de numeros sin signo un valor con overflow o sea
0x0000 00C8 = 200 decimal
[u] 0x0000 0<U+202D>BB8<U+202C> [/u] = 3000 decimal
0xFFFF F510<U+202C>
un número grande mayor a ConT que creo vale 0 ademas
Espero haberlo hecho bien.
Ok, si cuando vi el arreglo, me di cuenta, gracias