Show Posts
Pages: [1] 2
1  International / Software / Re: Gadget para desconectar un ascensor on: March 23, 2013, 07:04:43 pm
Pero esto no son pruebas caseras, no? esto son pruebas de rendimiento de motores en algun curro. Me mola mucho smiley-grin, no solo la maquina de estados sino el centro de trabajo smiley-grin

Le voy pillando el tranquillo ha hacer una maquina de estados sencillita a traves de switch e ifs. Antes de empezar con la del ascensor he hecho una para un cronometro cuenta atras, que cuando empieza la cuenta atras se activa un rele y cuando acaba se desactiva. Creo que he seguido la filosofia de la maquina de estados y no hay codigo bloqueante, pero no se si lo he hecho todo bien (el progama hac elo que tiene que hacer)

Te dejo el setup y el loop por si quieres hecharle un ojo, sino ningún problema porque queria ponerme a leer algun libro sobre maquinas de estado ahora que ya he ido asimilando mejor en que consisten

Code:
#include "Wire.h"
#include "lcd_i2c.h"
#include "Bounce.h"

#define RELE 12
#define LED 10
#define START 4
#define RESET 5
#define SEG_UP 6
#define SEG_DOWN 7
#define MIN_UP 8
#define MIN_DOWN 9

#define INTERVAL_MILLIS 5

#define E_INICIAL 0
#define E_CONFIG_TIME 1
#define E_CUENTA_ATRAS 2
#define E_RELE_ACTIVADO 3

#define REBOUNCE_TIME 250

LCD_I2C lcd(0x38);

uint8_t state = E_CONFIG_TIME;

Bounce buttonStart = Bounce(START, INTERVAL_MILLIS);
Bounce buttonReset = Bounce(RESET, INTERVAL_MILLIS);
Bounce buttonSegUp = Bounce(SEG_UP, INTERVAL_MILLIS);
Bounce buttonSegDown = Bounce(SEG_DOWN, INTERVAL_MILLIS);
Bounce buttonMinUp = Bounce(MIN_UP, INTERVAL_MILLIS);
Bounce buttonMinDown = Bounce(MIN_DOWN, INTERVAL_MILLIS);

struct tiempo{
  uint8_t horas;
  uint8_t minutos;
  uint8_t segundos;
  uint8_t decimas;
}cuenta = {0,0,0,0};

long milisegundos;

void setup(){
  pinMode(RELE, OUTPUT);
  pinMode(LED, OUTPUT);
  digitalWrite(RELE, LOW);
  digitalWrite(LED, LOW);
 
  for(int i=4; i<10; i++){
    pinMode(i, INPUT_PULLUP);
  }

  lcd.init(0x38);
}
void loop(){
  switch(state){
    case E_INICIAL:{
      imprimirTiempo();    //Escribir en pantalla el tiempo que en este caso como es el inicial es 0. Este estado se podria eliminar porque la   
                                    //funcion configTiempo() tambien llama a imprimirTiempo()
      state = E_CONFIG_TIME;
    }break;
    case E_CONFIG_TIME:{
      configTiempo();     //con unos botones configuo los segundos y minutos
      if(ev_reset()){         //ev_reset comprueba si se ha apretado el boton reset
        resetTiempo();        //Pongo minutos, segundos y decimas a 0
        state = E_INICIAL;
      }
      if(ev_start()){     //ev_start comprueba si se ha apretado el boton start
        activarRele();    //activa el rele y un led indicador
        state = E_CUENTA_ATRAS;
      }
    }break;
    case E_CUENTA_ATRAS:{
      if(!ev_fin_cuenta_atras() && !ev_reset()){   //ev_fin_cuenta_atras devuelve true cuando los minutos, segundos y decimas son igual a
                                                                   //0
        cuentaAtras();
      }else{
        desactivarRele();
        resetTiempo();
        state = E_INICIAL;
      }
    }break;
  }
}
2  International / Software / Re: Gadget para desconectar un ascensor on: March 12, 2013, 04:46:45 am
Hola erikcrane.

Oye, una cosilla que no me ha quedado clara. ¿Qué pasa si llega el momento de la desconexión y el ascensor está siendo utilizado por un pasajero? ¿Y si alguien lo está esperando en planta?

Creo que es un punto conflictivo de este montaje.

Muy buenas y gracias por tu comentario.

Es un montacargas donde las personas no pueden subir, es solo para material. Y se para cuando se acaba la jornada laboral. Por tanto nadie lo estará usando.

Igualmente para situaciones puntuales en que se necesite fuera de un horario laboral voy a implementar un interruptor para desconectar este sistema y que pueda funcionar normalmente. Luego cuando se acabe de usar se vuelve a conectar y el sistema ya se encarga de comprobar que el montacargas este en la 4 planta y el boton de stop este apretado.

3  International / Software / Re: Gadget para desconectar un ascensor on: March 07, 2013, 02:29:40 am
Muchas gracias fm  smiley-lol

Igor, gracias a ti tambien smiley-lol. Estoy haciendo otro proyecto (un cronometro cuenta atras, que cuando llega a 0 activa un rele) que tambien lo he hecho por maquina de estados. Como es mucho mas corto que el del ascensor, intentare programarlo segun dices y segun vea en el codigo del link. De momento no me entero mucho, he entendido el usar solo codigo no bloqueante para poder hacer "multi-tarea", pero aun me queda para escribir un codigo decente.

Lo dicho, seguire mirando sobre fsm y el codigo que has posteado, muchas gracias

Edit: Acabo de leerme el pdf de la FSM Library y me ha gustado. Muy sencillo todo, con un par de sentencias creas una maquina de estado y la manipulas. Ahora me miraré el código a ver si entiendo algo smiley-razz
4  International / Software / Re: Gadget para desconectar un ascensor on: February 28, 2013, 09:25:10 am
Esto es lo que he echo con lo me has dicho de los eventos, no lo acabo de ver claro, me parece que lo programo demasiado enrevesado:

Code:
#define E_INICIO 1


#define E_IDLE 1
#define E_MENU 2
#define E_CTIME 3
#define E_CCALENDAR 4
#define E_EXTRAERSD 5

void setup(){}
void loop(){
leer_hora_fecha();
key = leer_tecla();

switch (desconexion){
case E_INICIO:
/* aqui quiero poner:
si el menu esta en en el estado de espera (E_IDLE) y aprieto la tecla # entonces
se limpia la pantalla y se cambia el estado del menu a estado menu (E_MENU)<--es decir que entro en el menu

tambien tengo que tener en cuenta que la pantalla de inicio solo se muestre cuando el menu esta en estado de espera (E_IDLE)
*/
if(menu == E_IDLE){
if(ev_teclaHash89){
lcd.clearDisplay();
menu = E_MENU;
}
pantalla_inicio(); //Pantalla que se muestra siempre (menos cuando se esta dentro del menu) que muestra la hora y la fecha
}
break;
}
switch (menu){
case E_IDLE:
//Aqui no hago nada
break;
case E_MENU:
//Se muestra el menu y se pasa a los siguientes estados segun la tecla apretada
//No se si he entendido bien lo que me has dicho sobre los eventos, pero esto es lo que se me ocurre de como ponerlo
//También he pensado que en vez de los if se podria poner un switch y dependiendo del ev_tecla se envia un estado o a otro

if(ev_tecla1()){
lcd.clearDisplay();
menu = E_CTIME;
}
if(ev_tecla2()){
lcd.clearDisplay();
menu = E_CCALENDAR;
}
if(ev_tecla3()){
lcd.clearDisplay();
menu = E_EXTRAERSD;
}
break;
case E_CTIME:
//Se configura la hora y la fecha del RTC
break;
case E_CCALENDAR:
//Se configura los dias festivos
break;
case E_EXTRAERSD
//Se extrae la SD
break;
}
}

Si me pudieras dar algun consejo te lo agradeceria muchismo

Un saludo
5  International / Software / Re: Gadget para desconectar un ascensor on: February 28, 2013, 03:46:20 am
Primero de todo muchas gracias por tus consejos. Entiendo por donde vas y ya estaba pensando en que el codigo que estoy escribiendo es muy chapucero (basicamente vos escribiendo codigo segun las necesidades) y mi idea era reescribirlo para que no fuera tan chapucero. Con esto que me dices quedará mejor y mas entendible. Gracias de nuevo  smiley-lol

En lo referente al dibujo, está mal. Con lo que me has dicho me he puesto a revisar el dibujo con el codigo y he visto que he representado mal graficamente el codigo que tengo escrito.

En el loop tengo dos switchs. Un switch es el que se encarga de mirar la hora y el dia, y dependiendo de estos dos valores hace una u otra acción. Y el otro siwtch es el del menu, que segun la tecla apretada vas a una opcion u otra.

En el primer caso (el case 0 en mi codigo) del switch (que es cuando mira la hora y el dia) tambien se controla si se aprieta la tecla # (que es la que sirve para ir al menu). Si esa tecla se aprieta el siwtch del menu pasa al case encargado de mostrar el menu. (el primer case del switch del menu es de reposo, que no hace nada)

El codigo seria mas o menos asi:

Code:
void loop(){
  switch (a){
   case 0:
     leo hora y dia
     controlo si se aprieta # - si se aprieta # b = 1 sino b continua valiendo 0
     segun hora y dia cambio asigno a variable a los diferentes case
     break;
  case 1:
     cuando es la hora 7.30 y dia laborable desactivo stop
     break;
  .......
  }
  switch (b){
    case 0:
      break;
    case 1:
      muestro menu
      segun opcion me voy a un case o otro
      break;
    case 2:
      configuro hora y fecha
      break;
    .....
   }

Muchas gracias por los comentarios y por el tiempo dedicado a responder

Un saludo
6  International / Software / Re: Gadget para desconectar un ascensor on: February 27, 2013, 03:32:29 am
Muy buenas,

Me he estado mirando el tema de las máquinas de estado y lo que he "sacado" es el archivo adjunto. no se si lo que he hecho es una maquina de estados, o me lo he inventado smiley-razz.

Para programarla lo estoy haciendo con switch (que no se si es correcto o no)

Agradeceria que me dijerais si estoy por bueno camino o no he entendido nada de lo que me habeis dicho.

Muchas gracias por la ayuda y un saludo
7  International / Software / Re: Gadget para desconectar un ascensor on: January 29, 2013, 01:50:47 pm
Igor R estoy buscando sobre FSM y event driver machine, y cuando pongo en el google event driven machine me salen todo de resultados de QP. Por lo que he visto es un software para crear máquinas de estado para el arduino y por la de resultados que salen veo que es bastante famoso. Tu lo conoces? tienes alguna opinión sobre este software?

Tambien te queria pedir si sabes de alguna web, video, pdf, lo que sea, que expliquen como realizar de inicio a fin un proyecto en arduino con fsm, a modo de ejemplo. Es que me he estado mirando la teoria de las fsm pero no se como llevarlo al mundo arduino.

Si me puedes dirigir en la buena dirección te lo agradezco mucho

un saludo smiley-grin
8  International / Software / Re: Gadget para desconectar un ascensor on: January 29, 2013, 05:14:43 am
Muy buenas,

Igor R, como me has aconsejado estoy mirándome las maquinas de estado finito. Por lo que he visto es una solución perfecta para muchos proyectos desarrollados con microcontroladores y por lo que me dijiste para el mio también. Además me gusta porque así para hacer futuros proyectos de mayor embergadura me ira de perlas.

Por cierto buscando sobre las maquinas de estado finito me he encontrado con un término un tanto curioso, código espaguetti. Al parecer es el tipo de código que siempre he usado, plantear un problema y programar a "pelo" para ir solucionandolo. El término espaguetti se debe a algo? es que me ha parecido curioso que le llamen así y no entiendo el motivo.
9  International / Software / Re: Gadget para desconectar un ascensor on: January 27, 2013, 08:12:33 am
Curro92, esto que me comentas es una opción que he tenido en cuenta. Si hago que el tiempo de espera a que el usuario es un tiempo limitado (para controlar que no se quede esperando un dato indefinidamente), cuando acabe de configurar tengo que hacer que se inicie el proceso de desconexion, siempre y cuando se haya llegado a la hora de ejecución. Pero si la hora de desconexion son las 17.50, realmente a mi no me importa que se inicie el proceso a las 18.30 (por decir una hora), siempre y cuando se inicie.

El asunto aqui es que esta solución (que es valida) no me permite aprender cosas más complicadas como los RTOS, interrupciones, etc. Siempre que hago un proyecto intento hacerlo de una manera para que pueda aprender cosas nuevas.

Igor R, he leido tus posts sobre interrupciones y multitarea. Lei uno (creo que lo escribistes en 2009) sobre como encender dos leds a diferentes frecuencias utilizando la funcion millis() y lo encontre muy muy interesante. He visto que esta función es muy potente y como bien dices me he dado cuenta que el delay() es una función que a primera vista parece muy práctica pero no la veo muy elegante para programar.

Voy a leerme con atención todo lo que me habeis comentado y intentar entenderlo todo. Y ralmente me gustaria poder programar este "gadget" de la forma más eficiente posible (dentro de unas limitaciones, claro)

Muchas gracias a todos por ir contestado smiley-grin

Un saludo
10  International / Documentación / Cronómetro + LCD + Push button on: January 27, 2013, 07:38:02 am
Muy buenas,

He hecho un cronómetro que se muestra en un apantalla lcd 16x2 y con dos botones (uno para reiniciar el conteo y el otro para parar/ejecutar el conteo). Pongo aqui el código por si ha alguien le pudiera interesar. El circuito es muy simple, un lcd conectado al arduino como se muestra en varias páginas y los botons más de lo mismo. Si me decis que incluya el wiring lo hago encantado.

Code:
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

int horas = 0;
int minutos = 0;
int segundos = 0;
int decimas = 0;
long milisegundos = 0;
int boton = 10;
int pausa = 9;

void setup(){
  Serial.begin(9600);
  pinMode(boton, INPUT);
  digitalWrite(boton, LOW);
  pinMode(pausa, INPUT);
  digitalWrite(pausa, LOW);
  lcd.begin(16,2);
}
void loop(){
  //Restart button
  if(digitalRead(boton) == HIGH){
    horas = 0;
    minutos = 0;
    segundos = 0;
    decimas = 0;
    lcd.clear();
  }
  //Pause/Play button
  if(digitalRead(pausa) == HIGH){
    delay(200);
    while(digitalRead(pausa) == LOW);
    delay(200);
  }
  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(segundos == 60){ //When it has passed 60 seconds it count one minute
      segundos = 0;
      minutos++;
    }
    if(minutos == 60){ //When it has passed 60 minutes it count one hour
      minutos = 0;
      horas++;
    }
    //Print Time
    lcd.setCursor(0,0);
    if(horas < 10){
      lcd.print("0");
    }
    lcd.print(horas);
    lcd.print(":");
    lcd.setCursor(3,0);
    if(minutos < 10){
      lcd.print("0");
    }
    lcd.print(minutos);
    lcd.print(":");
    lcd.setCursor(6,0);
    if(segundos < 10){
      lcd.print("0");
    }
    lcd.print(segundos);
    lcd.print(":");
    lcd.setCursor(9,0);
    lcd.print(decimas);
  }
}

PD:Disculpad si este no es lugar donde pornerlo, lo retiro si no es el sitio o creeis que no se debe publicar porque ya hay varios códigos de cronómetro
11  International / Software / Re: Gadget para desconectar un ascensor on: January 25, 2013, 10:00:26 am
Heke, realmente no entiendo mucho a que te refieres. Creo que dices que haga barridos cada x milisegundos para detectar si pulsan una tecla. Sino se pulsa el proceso desconexion se sigue ejecutando y cuando se realiza la pulsación se actua en consecuencia.

No enteiendo que es un circuito RC y para que necesito mantener la pulsación:

Con un simple circuito RC mantienes la pulsacion (la entrada a 1) aunque suelte la tecla, pero ya te digo, emplea interrupcion para eso y miesntras ves ejecutando el programa que te interesa, dedica solo x milisegundos a realizar el resto, a nivel percepcion de la persona que lo usa ni se entera.

Lo de utilizar dos atmega lo habia pensado, pero acabo de empezar con todo esto y plantearme colocar un atmega haria que el proyecto tardase aun mucho mas en acabar, pero estoy de acuerdo en que por menos de 3 euros tienes otro procesador con su memoria y es una buena solución.
Pero también creo que lo que intento hacer tampoco es tan complicado para requerir de otro procesador, pero claro eso solo es lo que creo.

Agradezco mucho tu post smiley-grin
12  International / Software / Re: Gadget para desconectar un ascensor on: January 25, 2013, 05:50:02 am
Muchas gracias yOPERO, me lo miro smiley-grin
13  International / Software / Re: Gadget para desconectar un ascensor on: January 25, 2013, 05:00:33 am
Muchas gracias a los dos por contestar.

Como bien dices, jray, he llegado (en un proyecto que pensaba que seria sencillito) a un apartado de nivel elevado de los micros. Me he estado mirando las interrupciones, los RTOS y la programacion cooperativa (creo que se llama así).

Estoy barajando la posibilidad de solucionar el problema de dos maneras:

Con las interrupciones, y asi aprendo sobre este tema

Controlando el tiempo de espera de entrada de datos, limitandolo a dos minutos. Entonces si son las 17.50 (que es la hora en que se tiene que iniciar el proceso de desconexion) y estoy en el menú, a los dos minutos se cerraran los bucles de esperera de datos finalizando asi el proceso del menu. Entonces el proceso de desconexion se activa si ha pasado de las 17.50. Que aunque no se active justo a las 17.50 no pasa nada. Puede ser a las 18 o a las 19. Lo critico es que se active.

Sergegsx me miro el ejemplo este qu eme comentas

Muchas graicas

Un saludo smiley-grin
14  International / Software / Gadget para desconectar un ascensor on: January 25, 2013, 02:35:23 am
Muy buenas,

Estoy haciendo un proyecto que tiene que desconectar un ascensor a una determinada hora y dias y que lleva un menu para poder configurar la hora, los dias a desconectar, etc.

Conectare un RTC a arduino para saber la hora y el dia y segun hora y el dia conectare/desconectare el ascensor.

Lo que tiene que hacer arduino es lo siguiente:

Muestro hora y fecha
Leo Hora
Leo Dia
Si dia y hora laborables entonces //Hora desde 7.30 hasta 17.50
Desactivo Stop
Desactivo Led
Sino si hora es igual o mas grande a 17.50 y dias es laborable entonces //Empiezo proceso de desconexion
Espero puertas cerrar
Llamo planta 4
Espero ascensor llegue
Activo Stop
Activo Led
Sino //dias de fiesta o horas no laborables. Realmente este caso no se necesita porque de serie el rele de stop y el led estan activados
Activo rele Stop
Activo led

Hasta aqui todo bien. Luego pense en diseñar un menu para poder configurar la hora, fecha y dias de fiesta.

Ahora es cuando llega el problema. Yo necesito que el proceso principal (de ahora en adelante el proceso de desconexion) se ejecute siempre, pero si estoy dentro del menu y estoy esperando una entrada valida el programa se me queda parado y el proceso de desconexion no se ejecuta hasta que no se salga del bucle que espera.

Entonces empezé a buscar y vi que habia el multitasking, las interrupciones, etc. He pensado unas cuantas opciones para poder solucionar esto y lo que me gustaria es que les echarais un ojo y me dijerais que opinais (si me dais nuevos puntos de vista mejor que mejor)

Aqui pongo las opciones que se me han ocurrido (he tenido en cuenta que cuando el proceso de desconexion esta llegando a su hora no se pueda acceder al menu)

Soluciones a interferencia entre de los procesos desconexion y menu

OPCION 01: A 10 o 20 min desconexión no poder entrar en menú. Si se entra en los bucles de espera de datos a los 2 minutos se saldra automaticamente. Problema --> si voy viajando entre menús menos de dos min por cada uno puedo pasarme de la hora de desconexión

OPCION 02: Debería ser que si a las 17.50 no se ha podido iniciar lo intente cada 10 min. Tiene que haber una variable que guarde si la desconexión/conexión se ha realizado. Con esto juntamente que no se puede estar esperando una entrada mas de dos min me aseguro que el proceso de desconexión se ejecute siempre

OPCION 03: Interrupciones: creo que si la interrupción se encarga de la desconexión, mirando cada x tiempo la hora y si llega la hora se ejecuta el p desconexión. El p menú estaria en el principal. Pero esto no se como hacerlo

OPCION 04: En el bucle principal pongo condición de entrar en menú que se apriete la tecla asterisco y que no sean 10 o 20 min antes de la hora de conex/descon. En los bucles de espera de datos hago lo mismo. Si son 10 o 20 min antes se sale del bucle. Haciendo que se cierren los procesos hasta llegar al principal que entonces ira directamente al proceso desconexion

OPCION 05: En cada bucle que espere entrada de tecla se llama al proceso desconexion. Con esto me aseguro que aunque este en espera a que el usuario introduzca un dato el proceso de desconexion se lleva a cabo. Hay que tener en cuenta de que el proceso de desconexión sea autónomo (no haga falta que se le envien variables), porque sino se convierte en un lio tener que llevar las variables hasta el bucle de espera para pasárselas al proceso desconexion.

Bueno he intentado exponerlo lo más claro posible y espero que se entienda. También quiero daros las gracias por el tiempo que le dediqueis y un saludo smiley-grin
15  International / Documentación / Re: Tutorial ARDUTEKA - Matriz LED Bicolor + 74CH595 on: September 28, 2012, 03:58:35 pm
Me gusta tu estilo, jajaja.

Por cierto erikcrane, puede que tengas cableada mal la matriz, si no prueba también a controlar el 74HC595 mediante SPI, con una búsqueda por Google te sale, aunque supongo que ya lo tendrás desmontado, pero bueno :d

Hace meses que la desmonte pero ya encontre el fallo y cue algo curioso pq yo vengo de programar sin tener en cuenta el mundo fisico y era un problema de que una parte de la matriz (filas o columnas, ahora no recuerdo) estaba controlada por la cucaracha esta y lo otro por salidas directas del arduino. Como el  595 se guarda los estados de las salidas hasta que no vuelve a tener un nuevo latch(creo que era ese) las filas me salian desplazadas una posicion. Habia dos maneras de resolverlo (habia otra pero era muy sucia), o la matriz de las letras haces que las filas vayan desplazadas una posicion y asi compensas el error o pones 595 en las columnas tambien.

Cuando este con el ordenador posteare el codigo que consegui, por si a alguien le sirve algun dia. Pero igualmente me mirare otra vez esto que me dices, con tal de aprender si tengo que montar la matriz mas veces pues que asi sea :-D
Pages: [1] 2