Up
Hola muy buenas.
Tengo que hacer un programa muy simple en arduino pero mis habilidades de programacion estan algo (muy) oxidadas.
El programa lo que tiene que hacer es que cuando pulses un botón (pulsar y soltar) empiece a contar como un cronometro y cuando pulse el segundo botón pare y me diga en el monitor del ordenador el tiempo que ha tardado. A estos botones en el programa los llamo sensores. No se hacer los print para que me de el tiempo y tampoco se si lo que he hecho esta bien. Agradezco toda ayuda posible.
Mi programa ahora mismo:
int segundos = 0;
int decimas = 0;
long milisegundos = 0;
int sensor1 = 10;
int sensor2 = 9;
void setup(){
Serial.begin(9600);
pinMode(sensor1, INPUT);
digitalWrite(sensor1, LOW);
pinMode(sensor2, INPUT);
digitalWrite(sensor2, LOW);
}
void loop(){
if(digitalRead(sensor1) == HIGH){
segundos = 0;
decimas = 0;
milisegundos = millis();
if(milisegundos % 100 == 0){ //Only enter if it has passed tenth of a second
decimas++;
if(decimas == 10){ //When it has passed 10 tenths of a second it count one second
decimas = 0;
segundos++;
}
}
if(digitalRead(sensor2) == HIGH){
}
}
}
Gracias de antemano
EDIT: El programa ahora mismo es un frankestein fruto de varias busquedas por la web.
Yo lo primero no llamaria a los botones "sensores"
Pondría como variables globales el tiempo y el estado del boton primero, que se haya pulsado vaya. Y que mientras el boton primero haya sido pulsado, aumentar el tiempo como sea que se haga (no se). Luego si pulsan el segundo boton devolver el tiempo y resetear el valor del estado del primer boton por así decirlo
El nombre da igual, lo llamo sensores por que en la practica sera un sensor IR que da una salida digital de 5v pero para simular pondre en una protoboard dos botones. Respecto a lo de contar el tiempo note he entendido muy bien. Luego con mas tiempo cuando llegue a casa lo miro.El mensaje está oculto porque el usuario está en tu lista de ignorados.
Gracias
No se programar en arduino pero...
¿Qué devuelve la función millis()?
Además, si HIGH es el evento de soltar el botón, eso entra en el if, inicializa las variables y cuando termina.... ¿qué?
y si no es el evento de soltar el botón y tan sólo comprueba que ese botón esté arriba, la condición se cumpliría siempre y siempre estarías inicializando los segundos a cero.
PD: indenta el código, aunque sea un poco, al menos para poder leerlo
Código:void loop(){ if(digitalRead(sensor1) == HIGH){ segundos = 0; decimas = 0; milisegundos = millis(); if(milisegundos % 100 == 0){ //Only enter if it has passed tenth of a second decimas++; if(decimas == 10){ //When it has passed 10 tenths of a second it count one second decimas = 0; segundos++; } } if(digitalRead(sensor2) == HIGH){ } } }
El mensaje está oculto porque el usuario está en tu lista de ignorados.
Gracias por la info, creo que al final consegui acabarlo (haber si lo testeo) pero me lo apunto!!El mensaje está oculto porque el usuario está en tu lista de ignorados.
haberloEl mensaje está oculto porque el usuario está en tu lista de ignorados.
aqui te lo pongo, no te rias si esta muy malEl mensaje está oculto porque el usuario está en tu lista de ignorados.
int segundos = 0;
int decimas = 0;
long milisegundos = 0;
int sensor1 = 10;
int sensor2 = 9;
void setup() {
Serial.begin(9600);
pinMode(sensor1, INPUT);
pinMode(sensor2, INPUT);
}
void loop() {
if (digitalRead(sensor1) == HIGH) {
segundos = 0;
decimas = 0;
milisegundos = millis();
if (milisegundos % 100 == 0) {
decimas++;
if (decimas == 10) {
decimas = 0;
segundos++;
}
}
if (digitalRead(sensor2) == HIGH) {
Serial.print("Tiempo (segundos)");
Serial.print(segundos);
Serial.println();
Serial.print("Decimas");
Serial.print(decimas);
Serial.println();
Serial.print("Milisegundos");
Serial.print(milisegundos);
Serial.println();
}
}
}
Gracias por la ayuda
Gracias por tu ayuda, la señal sera high cuando pulse el boton, en la cita a otro forero de arriba he dejado el programa a mi ultima version, milis es para contar el tiempo pero nose si lo estoy usando bien en el programa. La funcion que tiene que hacer el programa es: HIGH en sensor1 -> empiezo a contar -> HIGH sensor2 -> paro de contar y muestro en pantalla el tiempo en formato "Segundos xx (siguiente linea) Decimas x (siguiente linea) milisegundos x.El mensaje está oculto porque el usuario está en tu lista de ignorados.
Gracias de antemano!!!
EDIT: despues del primer if del loop tengo igualadas las variables a 0 para borrar los datos anteriores y poder contar de nuevo sin tener que iniciar la placa de nuevo. Gracias
Pues no tendria ni idea de como hacerlo, aun asi necesito precisión ya que va a contar lapsus de tiempo menores a 1 segundo el 90% de las veces asi que necesito que el tiempo que me de sea 0,xxx segundos, minimo 3 decimas. Aun asi me lo apunto para mirarlo, no es mala idea!!El mensaje está oculto porque el usuario está en tu lista de ignorados.
Se avecina tocho
Ya he comentado que no se programar en arduino, pero siguen pareciéndome raras un par de cosas:El mensaje está oculto porque el usuario está en tu lista de ignorados.
Supongo que loop se ejecuta constantemente (cada milisegundo)Código:int segundos = 0; int decimas = 0; long milisegundos = 0; int sensor1 = 10; int sensor2 = 9; void setup() { Serial.begin(9600); pinMode(sensor1, INPUT); pinMode(sensor2, INPUT); } void loop() { if (digitalRead(sensor1) == HIGH) { segundos = 0; decimas = 0; milisegundos = millis(); if (milisegundos % 100 == 0) { decimas++; if (decimas == 10) { decimas = 0; segundos++; } } if (digitalRead(sensor2) == HIGH) { Serial.print("Tiempo (segundos)"); Serial.print(segundos); Serial.println(); Serial.print("Decimas"); Serial.print(decimas); Serial.println(); Serial.print("Milisegundos"); Serial.print(milisegundos); Serial.println(); } } }
Si HIGH se detecta cuando apretamos un botón, para que el programa funcione necesitará que ese sensor1 esté en HIGH, ya que la parte que controla el sensor2 se incluye dentro del if que comprueba que sensor1 se encuentre en HIGH
Además, millis() me da el número de ms desde el inicio de la placa, con lo que sea cuando sea que pulse el sensor 1 el sistema almacena el momento y al pulsar el sensor 2 me muestra la información de cuando pulsé 1, no calcula cuando he pulsado 1 para compararlo con la pulsación de 2
Sin tener ni puta idea, yo haría algo así... que igual es una aberración fruto de mi ignorancia
Esto nos daría (espero) el tiempo en segundos completos, en décimas completas y en milisegundos desde la última pulsación del sensor1 cuando pulsemos el sensor2Código:int sensor1 = 10; int sensor2 = 9; long milisegundos1 = 0; long milisegundos2 = 0; int segundos = 0 int decimas = 0 void setup() { Serial.begin(9600); pinMode(sensor1, INPUT); pinMode(sensor2, INPUT); } void loop() { if (digitalRead(sensor1) == HIGH) { milisegundos1 = millis(); } if (digitalRead(sensor2) == HIGH) { milisegundos2 = millis(); Serial.print("Tiempo (segundos)"); segundos = (milisegundos2 - milisegundos1)/1000; Serial.print(segundos); Serial.println(); Serial.print("Decimas"); decimas = (milisegundos2 - milisegundos1)/100; Serial.print(decimas); Serial.println(); Serial.print("Milisegundos"); Serial.print((milisegundos2 - milisegundos1)); Serial.println(); } }
ejemplo:
comienzo la ejecución.
tras 1234 ms pulso el sensor1
tras 2345 ms pulso el sensor2
- el programa muestra 1 segundos
- el programa muestra 11 decimas
- el programa muestra 1111 milisegundos
tras 4567 ms pulso el sensor 2 de nuevo
- el programa muestra 3 segundos
- el programa muestra 34 decimas
- el programa muestra 3423 milisegundos
tras 5000 ms pulso el sensor 1
tras 9845 ms pulso el sensor 2
- el programa muestra 4 segundos
- el programa muestra 48 decimas
- el programa muestra 4845 milisegundos[/I]
tras 10000 ms pulso el sensor 1
tras 10100 ms pulso el sensor 2
- el programa muestra 0 segundos
- el programa muestra 1 decimas
- el programa muestra 100 milisegundos
Última edición por horticultor; 11/01/2017 a las 09:53
Tienes varias cosas mejorables, las variables que sabes que son constantes deberias marcarlas como tal, y en el 95% de los casos medir el transcurso del tiempo no es necesario, basta con apuntar el momento inicio y restarlo luego con el momento final. Te paso el código arreglado, falta que completes una parte.
Hace tiempo que no toco nada de Arduino, puede que se me haya escapado algo.Código:// Pines de los botones const int sensor1 = 10; const int sensor2 = 9; // Momento en el que arrancamos el cronometro unsigned long horaInicio = 0; void setup() { Serial.begin(9600); pinMode(sensor1, INPUT); pinMode(sensor2, INPUT); } void loop() { if (digitalRead(sensor1) == HIGH) { horaInicio = millis(); } if (digitalRead(sensor2) == HIGH) { // Comprobamos que antes de pulsar el segundo boton hayan pulsado el primero. Si no lo han hecho se ejecuta el cuerpo del if. if(horaInicio == 0){ //Tu eliges, le mandas un mensaje diciendo como se usa, le insultas por tarugo, lo dejo a tu imaginacion return; } unsigned long horaActual = millis(); // Tiempo transcurrido en ms unsigned long tiempoTranscurrido = horaActual - horaInicio; /* ..... Resto del codigo, imprimes por serial el tiempoTranscurrido o haces lo que quieras con el. Recuerda que la variable tiempoTranscurrido está en milisegundos. Si quieres forzar a que despues de pulsar el segundo boton sea necesario volver a pulsar el primero para arrancar de nuevo el cronometro, descomenta esta linea. */ //horaInicio = 0; } }
Saludos
Edit:
Para no tener ni puta idea hiciste una aproximación muy buenaEl mensaje está oculto porque el usuario está en tu lista de ignorados.
Última edición por DulceLimon; 12/01/2017 a las 14:14 Razón: No había leido todas las respuestas
@DulceLimon
Gracias
Al final el estilo de programación de muchos lenguajes es similar, tienen sus cosillas de sintaxis y funciones, pero se dan un aire
madre, haber si mañana le dedico un ratillo haber si descifro tu programa, al final he tenido otro tipo de problemas, si no consigo solucionarlo lo comentare por aqui. Mil gracias!!!!El mensaje está oculto porque el usuario está en tu lista de ignorados.
@DulceLimon te invoco para resolver esto que me estoy volviendo loco: (el programa que tengo ahora esta en el post #23.
Ahora el programa hace lo que yo quiero pero no me lo imprime como yo quiero, bueno como me exigen, me explico; mi idea era que el programa me pusiera en la pantalla los milisegundos que ha tardado desde que paro de pulsar el primer botón hasta que paro de pulsar el segundo pero mi programa lo que hace es imprimirme los instantes de tiempo que el segundo boton esta pulsado, entonces el dato que yo quiero que me imprima es solo el ultimo, he intentado programar un flanco de subida para que solo printe el ultimo pero nada (los botones son normalmente cerrados, van al revés, cuando no estan pulsados el arduino recibe un HIGH). Adjunto fotos y programa.
Solo quiero el ultimo dato.
programa
int sensor1 = 11;
int sensor2 = 12;
int Valorsensor1 = 0;
int Valorsensor2 = 0;
int T1=0;
int T2=0;
int T=0;
bool ultima = false;
void setup() {
Serial.begin(9600);
pinMode (sensor1, INPUT);
pinMode (sensor2, INPUT);
}
void loop() {
Valorsensor1=digitalRead (sensor1);
Valorsensor2=digitalRead (sensor2);
if (Valorsensor1 == LOW)
{
T1=millis();
T1=0;
T2=0;
T=0;
}
if (Valorsensor2 == LOW)
{
T2=millis();
T=T2-T1;
Serial.print("Tiempo (ms):");
Serial.print(T);
Serial.println();
/*if (T1 == 0){
Serial.print("No se ha detectado un objeto en el sensor superior.");
Serial.println();
return;
*/
}
}
Última edición por PROPELLERMAN; 13/01/2017 a las 11:42
El mensaje está oculto porque el usuario está en tu lista de ignorados.
¿Y utilizar un par de variables globales como interruptor?
Código:interruptor1 = 0; interruptor2 = 0; if(sensor1 == low){ interruptor1=1; } if(sensor1 == high && interruptor1==1){ interruptor1 = 0; t1 = millis(); } if(sensor2 == low){ interruptor2 = 1; } if(sensor2 == high && interruptor2 ==1){ interruptor2 = 0; t2 = millis(); ..... y el resto del codigo .... }
@horicultor
Hora estoy con esto, deberia funcionar pero no se por que no me imprime nada
#define led LED_BUILTIN //led del arduino
boolean Actual1=LOW;
boolean Actual2=LOW;
boolean Actual3=LOW;
boolean Actual4=LOW;
boolean Antigua1=LOW;
boolean Antigua2=LOW;
boolean Antigua3=LOW;
boolean Antigua4=LOW;
int sensor1 = 11;
int sensor2 = 12;
int Valorsensor1 = 0;
int Valorsensor2 = 0;
int T1=0;
int T2=0;
int T3=0;
int T4=0;
int T=0;
void setup() {
Serial.begin(9600);
pinMode (sensor1, INPUT);
pinMode (sensor2, INPUT);
pinMode(led,OUTPUT);
}
void loop() {
Valorsensor1=digitalRead (sensor1);
Valorsensor2=digitalRead (sensor2);
//SENSOR DE ARRIBA (CONVERSIÓN FLANCOS DE ABAJDA A FLANCOS DE SUBIDA)
if(Valorsensor1=LOW)
{
boolean Actual1=HIGH;
}
else
{
Actual1= LOW;
}
//SENSOR DE ABAJO (CONVERSION FLANCOS DE ABAJDA A SUBIDA)
if(Valorsensor2=LOW)
{
boolean Actual2=HIGH;
}
else
{
Actual2= LOW;
}
//-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-EMPEZAMOS CON PROGRAMA DETECCIÓN DE FLANCOS-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-
//SENSOR DE ARRIBA FLANCO DE SUBIDA
if(Actual1==HIGH && Antigua1==LOW)//flanco de subida
{T1=millis();
digitalWrite(led,HIGH);
Antigua1=Actual1;
}
//SENSOR DE ARRIBA FLANCO DE BAJADA
if(Actual1==LOW && Antigua1==HIGH)//flanco de bajada
{T2=millis();
Antigua1=Actual1;
}
//SENSOR DE ABAJO FLANCO DE SUBIDA
if(Actual2==HIGH && Antigua2==LOW)//flanco de subida
{T3=millis();
Antigua2=Actual2;
}
//SENSOR DE ABAJO FLANCO DE BAJADA
if(Actual1==LOW && Antigua1==HIGH)//flanco de bajada
{T2=millis();
digitalWrite(led,LOW);
Antigua2=Actual2;
Serial.println("T1=");
Serial.println(T1);
Serial.println("T2=");
Serial.println(T2);
Serial.println("T3=");
Serial.println(T3);
Serial.println("T4=");
Serial.println(T4);
}
}
Ya me estoy desesperando......
@horicultor @DulceLimon ya lo he arreglado!!!!!! Os debo una birra, cuando lo acabe (me falta piner unas operaciones ) si quereis posteo!! mil graciaaas
Enviado desde mi Redmi Note 3 mediante Tapatalk
Me alegro de que te funcione, el mérito es de @horicultor que yo acabo de entrar ahora.El mensaje está oculto porque el usuario está en tu lista de ignorados.