Arduino Forum

International => Español => Software => Topic started by: Dabauza on Mar 17, 2014, 11:22 pm

Title: Duda función millis en domotización para el apagado de un display (SOLUCIONADO)
Post by: Dabauza on Mar 17, 2014, 11:22 pm
Muy buenas,

Tengo la idea en mente de domotizarme la casa usando arduino y tengo una duda, de momento llevo que hecho el encendido/apagado de las luces de forma manual y de forma automática mediante dos pulsadores (uno para el ON/OFF del modo manual y otro para el ON/OFF del modo automático). Si la enciendo de forma manual las luces se enceraran al máximo, pero si la enciendo de forma automática dependerá de que el sensor de presencia detecte movimiento y ademas mediante una LDR se regulara la intensidad de la luz.

También he añadido un display LCD de 16x2 en el que muestro la hora, la humedad y la temperatura y si el sistema esta funcionando en modo manual o en modo automático.

Ahora bien, estoy intentando que el display solo permanezca encendido solo durante 30 segundos (con la función millis) después de pulsar cualquiera de los dos pulsadores, pero no hay manera, lo he probado de 10 millones de formas y nada, lo máximo que he conseguido es que se apague a los 30 segundos pero si vuelvo a pulsar el pulsador ya no hay manera de que vulva a iluminarse el display.

Ya no se que mas intentar, aqui dejo lo que llevo de la programación para que veáis como esta, seguramente hecha un desastre,  pero soy nuevo en esto y he ido aprendiendo de lo que he ido leyendo y a base de prueba y error.

Title: Re: Duda función millis en domotización para el apagado de un display
Post by: Dabauza on Mar 17, 2014, 11:25 pm
#include "DHT.h" //cargamos la librería DHT
#define DHTPIN 12 //Seleccionamos el pin en el que se //conectará el sensor
#define DHTTYPE DHT11 //Se selecciona el DHT11 (hay //otros DHT)
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

#include <DS1302.h>
                         // RST=pin8
DS1302 rtc(8, 9, 10);    // DAT=pin9
                         // CLK=pin10
                       
Time x;

LiquidCrystal_I2C lcd(0x27,16,2);  // set the LCD address to 0x27 for a 16 chars and 2 line display


DHT dht(DHTPIN, DHTTYPE); //Se inicia una variable que será usada por Arduino para comunicarse con el sensor

byte termometro[8] = //icono de termometro
{
    B00100,
    B01010,
    B01010,
    B01110,
    B01110,
    B11111,
    B11111,
    B01110
};

byte humedad[8] = //icon de gota de agua
{
    B00100,
    B00100,
    B01010,
    B01010,
    B10001,
    B10001,
    B10001,
    B01110,
};

byte reloj[8] = //icon de reloj
{
    B00000,
    B01110,
    B10101,
    B10101,
    B10111,
    B10001,
    B01110,
    B00000,
};

int leds[]={2,3,4,5,6}; //LEDS controlados por pwm y entrada analoga
int i=0;
int foto=A15; //Variable de fotocelula
int medida=0;
int luzled=0;
int PIR=26;
int estadoPIR;

int estadoActual=0; //Guarda el estado actual del botón
int estadoUltimo=0; //Guarda el último estado del botón
int contador=0;     //Guarda las veces que se pulsa el botón
int pulsador=52;

int estadoActualManual=0; //Guarda el estado actual del botón
int estadoUltimoManual=0; //Guarda el último estado del botón
int contadorManual=0;     //Guarda las veces que se pulsa el botón
int pulsadorManual=50;


Title: Re: Duda función millis en domotización para el apagado de un display
Post by: Dabauza on Mar 17, 2014, 11:25 pm
void setup()
{
  for(i=0;i<5;i++)
  {
    pinMode(leds,OUTPUT);
  }
  pinMode(foto,INPUT);
  pinMode(PIR,INPUT); 
  pinMode(pulsador, INPUT);  //Donde esta conectado el pulsador
  pinMode(pulsadorManual, INPUT);  //Donde esta conectado el pulsador
  Serial.begin(9600);
 
  dht.begin(); //Se inicia el sensor
  lcd.init();  //Se inicia el LCD   
 
  lcd.createChar(1,termometro);
  lcd.createChar(2,humedad);
  lcd.createChar(3,reloj); 
}
Title: Re: Duda función millis en domotización para el apagado de un display
Post by: Dabauza on Mar 17, 2014, 11:26 pm
void loop()
{
  estadoActual=digitalRead(pulsador);
  if (estadoActual != estadoUltimo)
    {
      if (estadoActual == HIGH)
        {
          contador = contador +1;
          Serial.print ("Esta es la pulsación nº ");
          Serial.println (contador);
        }
    }
  estadoUltimo=estadoActual; 
   
  if (contador % 2 == 0) //Pulsacion par modo Manual
    {
    estadoActualManual=digitalRead(pulsadorManual);
      if (estadoActualManual != estadoUltimoManual)
      {
        if (estadoActualManual == HIGH)
        {
          contadorManual = contadorManual +1;
          Serial.print ("Esta es la pulsación manual nº ");
          Serial.println (contadorManual);
        }
      }
    estadoUltimoManual=estadoActualManual;
     
      for(i=0;i<5;i++)
       {
        if (contadorManual % 2 == 0)
          {
            analogWrite(leds,0);
            lcd.noBacklight();
            lcd.clear();
          }
        else
         {
          analogWrite(leds,255);                 
         }
       }
    }

  else   
    { 
       estadoPIR=digitalRead(PIR);       
       Serial.println(estadoPIR);       
       if (estadoPIR == HIGH)
         {
           medida = analogRead(foto); //Toma la medida del puerto analogo
           Serial.println(medida);  //Imprime el valor de la medida
           luzled = 255 - (medida/4); 
           Serial.println(luzled); //Imprime el valor de la salida luzled
           for(i=0;i<5;i++)
             {
               if (luzled <= 5) // Si el calculo de luzled es menor o igual a 5...
                 {
                   analogWrite(leds,0); // ...luzled no se encendera
                 }
                else // Entonces es mayor de 5...
                 {
                   analogWrite(leds,luzled); // ...luzled se encendera de forma
                                                //    regulada
                 }
             }
        }

       else
         {
           for(i=0;i<5;i++)           
           analogWrite(leds,0);
         }
    }
   
  if (contador % 2 != 0){LCDaut();}   
  if (contadorManual % 2 != 0) {LCDman();}       
}


void LCDman()

  float h = dht.readHumidity(); //Se lee la humedad
  float t = dht.readTemperature(); //Se lee la temperatura
  x = rtc.getTime();

  Serial.println("Humedad: ");
  Serial.println(h);
  Serial.println("Temperatura: ");
  Serial.println(t);
/*
  lcd.setCursor(0, 0);
  lcd.write(3);
  lcd.setCursor(1, 0);  //Inicio de la posicion 1 de la primera linea
  lcd.print(rtc.getTimeStr());
*/ 
  lcd.setCursor(1, 0);
  lcd.write(3);
  lcd.setCursor(2, 0);
  lcd.print(x.hour);
  lcd.print(":");
  lcd.print(x.min);
 
  lcd.setCursor(9, 0);
  lcd.print("man");

  lcd.backlight();
  lcd.setCursor(0, 1); //Inicio de la posicion 0 de la segunda linea
  lcd.write(1);
  lcd.print(t);
  lcd.setCursor(6, 1);  //Inicio de la posicion 6 de la segunda linea
  lcd.print((char)223);
  lcd.print("C");
 
  lcd.setCursor(9, 1); //Inicio de la posicion 9 de la segunda linea
  lcd.write(2);
  lcd.print(h);
  lcd.setCursor(15, 1);  //Inicio de la posicion 15 de la segunda linea
  lcd.print("%");
}

void LCDaut()

  float h = dht.readHumidity(); //Se lee la humedad
  float t = dht.readTemperature(); //Se lee la temperatura
  x = rtc.getTime();

  Serial.println("Humedad: ");
  Serial.println(h);
  Serial.println("Temperatura: ");
  Serial.println(t);
/*
  lcd.setCursor(0, 0);
  lcd.write(3);
  lcd.setCursor(1, 0);  //Inicio de la posicion 1 de la primera linea
  lcd.print(rtc.getTimeStr());
*/ 
  lcd.setCursor(1, 0);
  lcd.write(3);
  lcd.setCursor(2, 0);
  lcd.print(x.hour);
  lcd.print(":");
  lcd.print(x.min);

  lcd.setCursor(13, 0);
  lcd.print("aut");

  lcd.backlight();
  lcd.setCursor(0, 1); //Inicio de la posicion 0 de la segunda linea
  lcd.write(1);
  lcd.print(t);
  lcd.setCursor(6, 1);  //Inicio de la posicion 6 de la segunda linea
  lcd.print((char)223);
  lcd.print("C");
 
  lcd.setCursor(9, 1); //Inicio de la posicion 9 de la segunda linea
  lcd.write(2);
  lcd.print(h);
  lcd.setCursor(15, 1);  //Inicio de la posicion 15 de la segunda linea
  lcd.print("%");
}
Title: Re: Duda función millis en domotización para el apagado de un display
Post by: Dabauza on Mar 17, 2014, 11:27 pm
Cualquier sugerencia sera bien recibida en cuanto a la presentación del código, así como su estructura o lo que sea.

Un saludo y muchas gracias
Title: Re: Duda función millis en domotización para el apagado de un display
Post by: Dabauza on Mar 18, 2014, 02:52 pm
Estoy investigando a ver como funciona esto:

http://playground.arduino.cc/Code/Timer#.UyhQRPl5NyW

Parece ser que esto resolvería el problema que tengo del LCD y ademas podría usarlo para que la placa no este leyendo constantemente la lectura de los sensores y el RTC ya que si lo pongo en modo automático se ralentiza mucho el funcionamiento de la placa.

Voy a continuar con las pruebas a ver si consigo algo en claro

Saludos
Title: Re: Duda función millis en domotización para el apagado de un display
Post by: juanpintom on Mar 18, 2014, 10:43 pm

Muy buenas,

Tengo la idea en mente de domotizarme la casa usando arduino y tengo una duda, de momento llevo que hecho el encendido/apagado de las luces de forma manual y de forma automática mediante dos pulsadores (uno para el ON/OFF del modo manual y otro para el ON/OFF del modo automático). Si la enciendo de forma manual las luces se enceraran al máximo, pero si la enciendo de forma automática dependerá de que el sensor de presencia detecte movimiento y ademas mediante una LDR se regulara la intensidad de la luz.

También he añadido un display LCD de 16x2 en el que muestro la hora, la humedad y la temperatura y si el sistema esta funcionando en modo manual o en modo automático.

Ahora bien, estoy intentando que el display solo permanezca encendido solo durante 30 segundos (con la función millis) después de pulsar cualquiera de los dos pulsadores, pero no hay manera, lo he probado de 10 millones de formas y nada, lo máximo que he conseguido es que se apague a los 30 segundos pero si vuelvo a pulsar el pulsador ya no hay manera de que vulva a iluminarse el display.

Ya no se que mas intentar, aqui dejo lo que llevo de la programación para que veáis como esta, seguramente hecha un desastre,  pero soy nuevo en esto y he ido aprendiendo de lo que he ido leyendo y a base de prueba y error.




No se como realizarlo utilizando el RTC (aun no he montado el modulo y lo tengo desde hace meses xD), en todo caso tu problema  es sencillo de solventar :)

Code: [Select]
//define una variable y un PIN que encienda el LCD
unsigned long tiempo = millis();
#define pinLCD   3


En el Setup()

Code: [Select]
pinMode(pinLCD,OUTPUT);
digitalWrite(pinLCD,HIGH);

 
y en el loop haces lo siguiente:

Code: [Select]
if ( digitalRead(pulsador) || digitalRead(pulsadorManual) )
{
  tiempo = millis ();
  if (!digitalRead(pinLCD)) digitalWrite(pinLCD,HIGH);
}else if (millis()-tiempo > 30000)
  digitalWrite(pinLCD,LOW);


Revisalo que no lo he pasado por el compilador y puede faltar algun ; xD
:)
Title: Re: Duda función millis en domotización para el apagado de un display
Post by: Dabauza on Mar 18, 2014, 11:33 pm

No se como realizarlo utilizando el RTC (aun no he montado el modulo y lo tengo desde hace meses xD), en todo caso tu problema  es sencillo de solventar :)

Code: [Select]
//define una variable y un PIN que encienda el LCD
unsigned long tiempo = millis();
#define pinLCD   3


En el Setup()

Code: [Select]
pinMode(pinLCD,OUTPUT);
digitalWrite(pinLCD,HIGH);

   
y en el loop haces lo siguiente:

Code: [Select]
if ( digitalRead(pulsador) || digitalRead(pulsadorManual) )
{
   tiempo = millis ();
   if (!digitalRead(pinLCD)) digitalWrite(pinLCD,HIGH);
}else if (millis()-tiempo > 30000)
   digitalWrite(pinLCD,LOW);


Revisalo que no lo he pasado por el compilador y puede faltar algun ; xD
:)


Muchas gracias  juanpintom, voy a probarlo a ver el resultado.

Edito:
Un par de preguntas que igual son un poco tontas...

¿Que diferencia hay entre...?:
#define pinLCD 3     e
int pinLCD = 3

y... Si al inicio del sketch ya he definido:
unsigned long tiempo = millis();
¿Es necesario luego en el loop poner esto?
tiempo = millis();

¿O se podria hacer asi?
unsigned long tiempo (al inicio)
tiempo = millis(); (en el loop)

Muchas gracias

Saludos
Title: Re: Duda función millis en domotización para el apagado de un display
Post by: juanpintom on Mar 19, 2014, 12:30 am

Edito:
Un par de preguntas que igual son un poco tontas...

¿Que diferencia hay entre...?:
#define pinLCD 3     e
int pinLCD = 3

Lo hago por costumbre, cualquier valor que no sea una variable lo defino como constante, para que en ningun caso pueda ser alterado en tiempo de ejecucion.
Tecnicamente no puedo ser muy claro porque lo explicaria mal. Pero si no me equivoco tambien ocupa menos memoria al ser declarado como constante y no variable.


y... Si al inicio del sketch ya he definido:
unsigned long tiempo = millis();
¿Es necesario luego en el loop poner esto?
tiempo = millis();

¿O se podria hacer asi?
unsigned long tiempo (al inicio)
tiempo = millis(); (en el loop)

Muchas gracias

Saludos


Si, se podria hacer perfectamente con la segunda opcion que propones, solo que siempre que utilizo variables de tiempo las inicializo con el valor al inicio. Pero de nuevo, son costumbres. Lo que es seguro es que en el loop tiene que estar. Cada vez que se pulse un boton la variable tiempo guardara el momento en que este se pulso, para luego hacer el calculo posterior.

Salu2
Title: Re: Duda función millis en domotización para el apagado de un display
Post by: Dabauza on Mar 19, 2014, 12:44 am

Lo hago por costumbre, cualquier valor que no sea una variable lo defino como constante, para que en ningun caso pueda ser alterado en tiempo de ejecucion.
Tecnicamente no puedo ser muy claro porque lo explicaria mal. Pero si no me equivoco tambien ocupa menos memoria al ser declarado como constante y no variable.


Lo veo bastante lógico y coherente, de ahora en adelante lo haré así también  :)

Por cierto, yo ya no se que hago mal, he probado el código que me has puesto y nada de nada hace lo mismo que sin añadir el código tuyo. Ya no se que puñetas hago mal. Esto empieza a ser un poco desesperante  =(

Edito:
Creo que había conectado Vcc del LCD donde no tocaba, voy a probar de nuevo a ver lo que pasa.

Re-Edito:
Si que funciona lo que pasa es que el LCD al quitarle la alimentacion se ralla y cuando vuelvo a apagar y encender los LEDS en el LCD faltan caracteres o salen cosas raras.

Estoy probando asi:
  if (contador % 2 != 0){
   tiempo = millis ();
   LCDaut();
  }
else if (millis()-tiempo > 30000){
   lcd.noBacklight();
   lcd.clear();
}
 
  if (contadorManual % 2 != 0){
   tiempo = millis ();
   LCDman();
  }
else if (millis()-tiempo > 30000){
   lcd.noBacklight();
   lcd.clear();
}

Pero estoy como al principio, enciende pero no apaga transcurridos los 30 seg :(

Re-re-edito: :)
BIIIIIIIIIIIIIIIIIIIIIIEEEEEEEEEEEEEEEEEEEENNNNNNNNNNNNNN!!!!!!!!!!!!!!!!!!!!!!!

Ya funciona!!!!!!!! :D :D :D :D

No veas menuda alegría, después de días y días intentándolo por fin a funcionado. Muchisimas gracias
juanpintom y a todos los que colgais tan maravillosa y valiosa informacion en este foro :D :D :D la solucion era esta:

  if ((contador % 2 != 0)&&(digitalRead(pulsador))){
   tiempo = millis ();
   LCDaut();
  }
else if (millis()-tiempo > 30000){
   lcd.noBacklight();
   lcd.clear();
}
 
  if ((contadorManual % 2 != 0)&&(digitalRead(pulsadorManual))){
   tiempo = millis ();
   LCDman();
  }
else if (millis()-tiempo > 30000){
   lcd.noBacklight();
   lcd.clear();
}

Había una cosa por las que yo sabia que no funcionaba pero que no sabia como hacerlo. Una de ellas era que no conseguía hacer que el conteo del temporizador dependiera del momento en que yo pulsaba el pulsador, la solución era tan sencilla como poner if(... ... ... &&(digitalRead(pulsador))){       (!!!Esas puertas logicas!!! :D)

Y la otra era que yo usaba el else, y usando el else if puedo poner una segunda condición en vez de ponerlo todo en la primera.

Ademas, no me preguntes el por que pero se a solucionado solo el problema de que el mega 2650 funcionara lento. :)  Aunque de todas formas voy a intentar que no este leyendo todo el rato el DHT11 y el RTC

Un saludo
Title: Re: Duda función millis en domotización para el apagado de un display
Post by: juanpintom on Mar 19, 2014, 01:36 am


Lo hago por costumbre, cualquier valor que no sea una variable lo defino como constante, para que en ningun caso pueda ser alterado en tiempo de ejecucion.
Tecnicamente no puedo ser muy claro porque lo explicaria mal. Pero si no me equivoco tambien ocupa menos memoria al ser declarado como constante y no variable.


Lo veo bastante lógico y coherente, de ahora en adelante lo haré así también  :)

Por cierto, yo ya no se que hago mal, he probado el código que me has puesto y nada de nada hace lo mismo que sin añadir el código tuyo. Ya no se que puñetas hago mal. Esto empieza a ser un poco desesperante  =(

Edito:
Creo que había conectado Vcc del LCD donde no tocaba, voy a probar de nuevo a ver lo que pasa.

Re-Edito:
Si que funciona lo que pasa es que el LCD al quitarle la alimentacion se ralla y cuando vuelvo a apagar y encender los LEDS en el LCD faltan caracteres o salen cosas raras.

Estoy probando asi:
  if (contador % 2 != 0){
   tiempo = millis ();
   LCDaut();
  }
else if (millis()-tiempo > 30000){
   lcd.noBacklight();
   lcd.clear();
}
 
  if (contadorManual % 2 != 0){
   tiempo = millis ();
   LCDman();
  }
else if (millis()-tiempo > 30000){
   lcd.noBacklight();
   lcd.clear();
}

Pero estoy como al principio, enciende pero no apaga transcurridos los 30 seg :(

Un saludo


Puede ser que este pasando constantemente por tiempo=millis();  ?
Añade un Serial.println("Boton pulsado");  en los if
y otro Serial.println("Apagar pantalla");  en los else if
y prueba si sale constantemente "Boton Pulsado" en el monitor serie

Salu2
Title: Re: Duda función millis en domotización para el apagado de un display
Post by: Dabauza on Mar 19, 2014, 01:53 am

Puede ser que este pasando constantemente por tiempo=millis();  ?
Añade un Serial.println("Boton pulsado");  en los if
y otro Serial.println("Apagar pantalla");  en los else if
y prueba si sale constantemente "Boton Pulsado" en el monitor serie

Salu2


Exactamente, ese era el problema. Al añadir la puerta AND junto con el estado del pulsador ya no reinicia todo el rato el temporizador

Muuuchiiiiiiisiiiiimaaaas gracias.   :)

Ahora a intentar que las lecturas las tome de forma pausada de los sensores y a esperar que lleguen pronto el resto de materiales para continuar con los experimentos.

También me gustaría hacer la función dimmer con un pulsador para poder regular los leds de forma manual también.

Y a ver si se me ocurre alguna otra cosa que ir añadiendo. Acepto sugerencias XD

Joe! No veas menuda alegría llevo encima XD. Que gusto da ver como las cosas van saliendo y mas aun cuando son cosas que haces por ti mismo y que te llevan tiempo y esfuerzo.

Por cierto seguiré atento al post de Proyecto Souliss para ir allanando el terreno mientras llegan los materiales e ir enterándome las nuevas que vayan surgiendo.

Juanpintom estoy a tu disposición para cualquier cosa que necesites ;)

Muchas gracias de nuevo por tu tiempo y ayuda.

Saludos
Title: Re: Duda función millis en domotización para el apagado de un display
Post by: juanpintom on Mar 19, 2014, 02:21 am
Para la lectura cada 5 segs :
if(millis()%5000==0)
lecturas....

Para el dimmer  te paso un codigo de una lampara dimmer capacitiva que tengo montada, es doble porque es la iluminacion que tengo montada en los lados de la cama. Lo que hace es cuando detecta una pulsacion sube el brillo, y si la luz esta encendida siempre lo baja, se podria depurar para que funcionara de otros modos, pero para mi este era el mas comodo. (Pulso hasta que ilumine suficiente y luego puedo bajar directamente o poco a poco.

No hay de que, estamos para ayudar! Seguramente tu sepas muchas cosas que yo no sepa y puede que necesite :)

Para el proyecto Souliss precisamente interesaria tener gente con todo tipo de conocimientos, porque cualquiera puede aportar cosas interesantes.

Salu2
Title: Re: Duda función millis en domotización para el apagado de un display
Post by: Dabauza on Mar 19, 2014, 03:02 am

Para la lectura cada 5 segs :
if(millis()%5000==0)
lecturas....


Gracias, Voy a intentar adaptarlo a mi código a ver si tengo suerte y no da mucha guerra :)


Para el dimmer  te paso un codigo de una lampara dimmer capacitiva que tengo montada, es doble porque es la iluminacion que tengo montada en los lados de la cama. Lo que hace es cuando detecta una pulsacion sube el brillo, y si la luz esta encendida siempre lo baja, se podria depurar para que funcionara de otros modos, pero para mi este era el mas comodo. (Pulso hasta que ilumine suficiente y luego puedo bajar directamente o poco a poco.


Vaya, tenemos formas muy parecidas (por no decir iguales) de pensar, eso era lo que quería hacer que al pulsar incrementara y al volver a pulsar decrementara. Le voy a pegar un ojo por que (no se si tu dimmer funcionara asi) a mi me gustaría también que si le doy el primer pulso corto se encendiera al máximo, y si estando encendida le doy un pulso corto se apague.


No hay de que, estamos para ayudar! Seguramente tu sepas muchas cosas que yo no sepa y puede que necesite :)

Para el proyecto Souliss precisamente interesaria tener gente con todo tipo de conocimientos, porque cualquiera puede aportar cosas interesantes.


Yo soy electricista de profesión y formación  ;) aunque ahora mismo estoy parado por lo que estoy aprovechando para formarme mas.  :)

Así que de conocimientos de electricidad voy bastante bien, de electrónica analógica y digital me defiendo algo y de programación estoy aprendiendo ahora.

Personalmente he llegado hasta aquí cuando he estudiado los automatas programables (PLC) y sistemas domoticos (como el X10, KNX...), que cuando vi lo que valía cada cosa me quede  :smiley-eek-blue: y me puse a investigar vías mas económicas con lo cual me tope de casualidad con Arduino, que ademas es polivalente y vale tanto como para usarlo como PLC como para domotica, robotica o lo que a uno se le ocurra e infinitamente mas económico.

Un saludo
Title: Re: Duda función millis en domotización para el apagado de un display
Post by: juanpintom on Mar 19, 2014, 04:23 pm
Yo no segui desarrollando el sketch que te he pasado porque ya me meti en Souliss, que ya tiene desarrolladas todas esas ideas, la de pulso corto, la de pulso largo, y estoy pendiente de dedicarle algo de tiempo a desarrollar el doble y triple click (que no tiene mucha complejidad)

El caso es que no queria pulsos cortos en ese proyecto, para evitar estar durmiendo, tocar sin querer el boton capacitivo y encender la luz a 255 xD. Nos despertariamos asi:  :smiley-eek: xD

Para otros usos si que tengo programadas las lamparas capacitivas en un nodo Souliss que enciende a 170 o apaga con el pulso corto, y regula con el pulso largo, te lo paso tambien si quieres :)

Ves! yo hace años que acabe el CFGM de Electronica y cada vez que me pongo a recordar algo, me cuesta mas que si lo estuviera aprendiendo de nuevas! Con decirte que acabe por revisar el funcionamiento de un puente de diodos... xD por vergüenza xD

Asi que con las dudas de electronica, que suelen ser las mas sencillas en los circuitos mas chorras, y a su vez las mas faciles de solventar..., ya tengo alguien a quien consultar! :) (Mi profesor de electronica basica se reiria de mi el c...bron xDD )

Yo tambien hice programacion PLC ( locura introducir los programas en un teclado hexadecimal, queda a años luz de lo que ahora se puede hacer con un Arduino de 2€ ) Pero considero que es una gran base, igual que aprender C o incluso Pseudocodigo para tener la mente dispuesta a programar.

Luego me dedique (y me dedico) a la reparacion de equipos, pero acabe estudiando tambien CFGS de Programacion, en este ambito (arduino) creo que cuanto mas polivalente y multidisciplinal seas muchas mas posibilidades e ideas tienes.

Mi proximo reto (ya iniciado y con fecha fin) es montarme una Impresora 3d, que se hace con un MEGA2560 y pocos mas conocimientos, si realmente quiero llevar a cabo mis ideas creo que ese es el camino a seguir, no es un coste muy alto, en contra de lo que la gente cree (unos 150-200€) lo que me gaste en su dia en una grabadora de cd 2x vamos... xD

Salu2

Title: Re: Duda función millis en domotización para el apagado de un display
Post by: Dabauza on Mar 19, 2014, 07:31 pm

Yo no segui desarrollando el sketch que te he pasado porque ya me meti en Souliss, que ya tiene desarrolladas todas esas ideas, la de pulso corto, la de pulso largo, y estoy pendiente de dedicarle algo de tiempo a desarrollar el doble y triple click (que no tiene mucha complejidad)


Me he mirado la programación del dimmer que me has pasado y no he entendido ni papa ademas me falta la librería <CapacitiveSensorDue.h> que la he estado buscando pero no la he encontrado , con lo cual me he puesto a intentar desarrollar la programación por mi cuenta, pero sigo teniendo el mismo problema que antes con los dichos millis().


El caso es que no queria pulsos cortos en ese proyecto, para evitar estar durmiendo, tocar sin querer el boton capacitivo y encender la luz a 255 xD. Nos despertariamos asi:  :smiley-eek: xD


Que gran verdad XD. Yo de momento no tengo ese problema, y si no una posible solución seria poner el código de pulsos cortos y largos al pulsador de entrada al dormitorio y el otro que enciende/apaga poco a poco en los de las mesitas de noche.


Para otros usos si que tengo programadas las lamparas capacitivas en un nodo Souliss que enciende a 170 o apaga con el pulso corto, y regula con el pulso largo, te lo paso tambien si quieres :)


Me harías un favor a ver si consigo sacar mi programación del dimmer.


Ves! yo hace años que acabe el CFGM de Electronica y cada vez que me pongo a recordar algo, me cuesta mas que si lo estuviera aprendiendo de nuevas! Con decirte que acabe por revisar el funcionamiento de un puente de diodos... xD por vergüenza xD


Suele pasar... Las cosas de no usarlas al final se acaban olvidando. Es una lastima pero así es.


Asi que con las dudas de electronica, que suelen ser las mas sencillas en los circuitos mas chorras, y a su vez las mas faciles de solventar..., ya tengo alguien a quien consultar! :) (Mi profesor de electronica basica se reiria de mi el c...bron xDD )


Dalo por hecho, pero que sean facilitas  :D que yo me defiendo pero mi nivel en electronica no es que sea muy avanzado XD


Yo tambien hice programacion PLC ( locura introducir los programas en un teclado hexadecimal, queda a años luz de lo que ahora se puede hacer con un Arduino de 2€ ) Pero considero que es una gran base, igual que aprender C o incluso Pseudocodigo para tener la mente dispuesta a programar.


Pfffff. Y tan años luz... Yo los masndo hexadecimales solo los he visto, pero no he llegado a manejarlos. No veas menudas reliquias tu, mas que el espectrum. XD


Luego me dedique (y me dedico) a la reparacion de equipos, pero acabe estudiando tambien CFGS de Programacion, en este ambito (arduino) creo que cuanto mas polivalente y multidisciplinal seas muchas mas posibilidades e ideas tienes.


No podría estar mas de acuerdo, no hay que cerrarse solo a un campo, por que si no al final te estancas. En cuantos mas temas este informado y/o domines mejor. Lo que pasa es que la tecnología evoluciona a velocidades de vértigo (y cada vez mas) y este mundo no puedes estar parado por que si te quedas rezagado (en cuanto a conocimientos) cuesta mas reengancharse.

¿Seria mucho pedir, que me recomendaras algunos libros que estén bien para ir aprendiendo y ampliando conocimientos en el mundo de Arduino y de programación?

La verdad es que te lo agradecería bastante. Yo tengo este:

http://www.amazon.es/ARDUINO-pr%C3%A1ctico-formaci%C3%B3n-Torrente-Artero/dp/8494072501

Pero creo que le falta un poco de "algo" (no sabría decirte el que), creo que lo que le falta son mas ejemplos de cada una de las funciones o ejemplos de "proyectos" en los que se usen varias funciones juntas y ver como funcionan unas con otras, por que la verdad es que yo me siento un poco pez a la hora de enlazarlas unas con otras.


Mi proximo reto (ya iniciado y con fecha fin) es montarme una Impresora 3d, que se hace con un MEGA2560 y pocos mas conocimientos, si realmente quiero llevar a cabo mis ideas creo que ese es el camino a seguir, no es un coste muy alto, en contra de lo que la gente cree (unos 150-200€) lo que me gaste en su dia en una grabadora de cd 2x vamos... xD


Ostras, pues no sale muy cara, yo las estuve mirando aquí pero me parecieron que se iban de madre, sera por que vienen ya montadas por que si no... no lo entiendo.

http://dx.com/es/s/impresora%2b3d?PriceSort=down

Igual cuando tenga este mundo un poco mas dominado me hago el animo y me monto una también :)

Saludos
Title: Re: Duda función millis en domotización para el apagado de un display
Post by: juanpintom on Mar 19, 2014, 08:00 pm

Me he mirado la programación del dimmer que me has pasado y no he entendido ni papa ademas me falta la librería <CapacitiveSensorDue.h> que la he estado buscando pero no la he encontrado , con lo cual me he puesto a intentar desarrollar la programación por mi cuenta, pero sigo teniendo el mismo problema que antes con los dichos millis().

La libreria es una de las standard de arduino.

https://github.com/arduino-libraries/CapacitiveSensor

Del codigo no me extraña que no lo entendieras xD al hacerlo para mi no tiene apenas comentarios (mala costumbre) y ademas muchas de las lineas son de debug (puedes obviar cualquier linea con Serial.print)

Esta noche te lo simplifico en todo caso, porque unicamente necesitas una pequeña parte del codigo.



Para otros usos si que tengo programadas las lamparas capacitivas en un nodo Souliss que enciende a 170 o apaga con el pulso corto, y regula con el pulso largo, te lo paso tambien si quieres :)


Me harías un favor a ver si consigo sacar mi programación del dimmer.

Te lo paso luego tambien, aunque este SI, es un nodo Souliss :)


¿Seria mucho pedir, que me recomendaras algunos libros que estén bien para ir aprendiendo y ampliando conocimientos en el mundo de Arduino y de programación?


Es realmente complicado, yo de Arduino no he leido mas que en web, y ningun texto extenso, sino cosas muy concretas. Y de programacion general aprendi Visual, algo de PHP, algo de ASP, mucho de SQL y de todo ello ahora me sirve bien poco, dado como han cambiado las cosas, y tendria que renovarme.

Con la programacion (al menos eso pienso yo) es como cuando intentas hablar otro idioma, durante el proceso de aprendizaje "piensas" en tu idioma nativo, "traduces", y luego "hablas" el otro idioma. Realmente deberiamos "pensar" directamente en el lenguaje que vayas a "hablar". Antes que mucha teoria, hay que tener la mente preparada para entender "la programacion"

Todo esto es lo que mi profesora de programacion (que con gran cariño recuerdo) llamaba "hacerte click" la cabeza para aprender a programar, es decir, entender la programacion como lo que es, un lenguaje, que al fin y al cabo tiene una interpretacion. De ella saque/sacamos una gran leccion, aprende pseudocodigo y aprenderas cualquier lenguaje con relativa facilidad.

Yo siempre he aprendido metiendome de lleno y exprimiendo las referencias del lenguaje en cuestion. Hace no mucho estoy aprendiendo java/javascript, estoy con Android Studio (que al final es java tambien) y con algun proyecto HTML/JS/CSS, pero me temo que me queda mucho por aprender.





Ostras, pues no sale muy cara, yo las estuve mirando aquí pero me parecieron que se iban de madre, sera por que vienen ya montadas por que si no... no lo entiendo.

http://dx.com/es/s/impresora%2b3d?PriceSort=down

Igual cuando tenga este mundo un poco mas dominado me hago el animo y me monto una también :)

Saludos



Eso son KITs y no vienen montados, es decir, te la montas tu, y si, si lo compras por kit sale excesivamente caro, si lo compras por componentes (con una sencilla lista de la compra) reduces el coste una barbaridad, y luego esta la gran ventaja de tener gente en la zona (Valencia) donde se mueve mucho el tema, asi que espero conseguir un padrino que me ayude y que incluso me pueda imprimir algunas piezas para mi montaje :) todo es cuestion de colaborar :)

Salu2
Title: Re: Duda función millis en domotización para el apagado de un display
Post by: Dabauza on Mar 19, 2014, 09:06 pm

La libreria es una de las standard de arduino.

https://github.com/arduino-libraries/CapacitiveSensor


Muchas gracias, yo la estaba buscando por el nombre que me lanzaba el compilador y no la encontraba


Del codigo no me extraña que no lo entendieras xD al hacerlo para mi no tiene apenas comentarios (mala costumbre) y ademas muchas de las lineas son de debug (puedes obviar cualquier linea con Serial.print)

Esta noche te lo simplifico en todo caso, porque unicamente necesitas una pequeña parte del codigo.


Te lo agradecería :)


Te lo paso luego tambien, aunque este SI, es un nodo Souliss :)


Esto también me iría bien así voy viendo como funciona/se programa para Souliss


Y de programacion general aprendi Visual, algo de PHP, algo de ASP, mucho de SQL y de todo ello ahora me sirve bien poco, dado como han cambiado las cosas, y tendria que renovarme.


Pfff, no tengo ni idea de para que sirve nada de esto


Con la programacion (al menos eso pienso yo) es como cuando intentas hablar otro idioma, durante el proceso de aprendizaje "piensas" en tu idioma nativo, "traduces", y luego "hablas" el otro idioma. Realmente deberiamos "pensar" directamente en el lenguaje que vayas a "hablar". Antes que mucha teoria, hay que tener la mente preparada para entender "la programacion"

Todo esto es lo que mi profesora de programacion (que con gran cariño recuerdo) llamaba "hacerte click" la cabeza para aprender a programar, es decir, entender la programacion como lo que es, un lenguaje, que al fin y al cabo tiene una interpretacion. De ella saque/sacamos una gran leccion, aprende pseudocodigo y aprenderas cualquier lenguaje con relativa facilidad.


Pues yo aun estoy aprendiendo "vocabulario" así que imaginate XD XD XD.

Tomo nota, voy a buscar información sobre pseudocodigos, por que la verdad es que no se muy bien ni lo que significa.


Yo siempre he aprendido metiendome de lleno y exprimiendo las referencias del lenguaje en cuestion. Hace no mucho estoy aprendiendo java/javascript, estoy con Android Studio (que al final es java tambien) y con algun proyecto HTML/JS/CSS, pero me temo que me queda mucho por aprender.


Yo tenia en mente con una raspberry desarrollar alguna programación, ponerle una pantalla tactil y poderla usar como cerebro junto con Arduino. Pero esto lo tengo muy verde aun, he leido algo de programar con Python pero la verdad es que no tengo ni idea de como funciona (solo conozco el nombre XD).


Eso son KITs y no vienen montados, es decir, te la montas tu, y si, si lo compras por kit sale excesivamente caro, si lo compras por componentes (con una sencilla lista de la compra) reduces el coste una barbaridad, y luego esta la gran ventaja de tener gente en la zona (Valencia) donde se mueve mucho el tema, asi que espero conseguir un padrino que me ayude y que incluso me pueda imprimir algunas piezas para mi montaje :) todo es cuestion de colaborar :)


Vaya, yo también soy de Valencia que coincidencias :)

Espero aprender rápido, me voy a tener que poner también las pilas con el ingles...  =(  Por que muchos manuales/tutoriales que he visto vienen en ingles y mas o menos lo entiendo pero no al 100% y es una faena.

Saludos
Title: Re: Duda función millis en domotización para el apagado de un display
Post by: juanpintom on Mar 20, 2014, 01:22 am


Del codigo no me extraña que no lo entendieras xD al hacerlo para mi no tiene apenas comentarios (mala costumbre) y ademas muchas de las lineas son de debug (puedes obviar cualquier linea con Serial.print)

Esta noche te lo simplifico en todo caso, porque unicamente necesitas una pequeña parte del codigo.


Te lo agradecería :)


Te paso el codigo, se podria simplificar aun mas.

Code: [Select]
#define LEDPIN 9
#define BOTON 2

byte Brillo = 0;
boolean up;
boolean down;

void setup()
{
        pinMode(LEDPIN,OUTPUT);
pinMode(BOTON,INPUT);

}

void loop()
{
    if (!digitalRead(BOTON)) { 
          up = false;
          down = false;
    }else{
        if (!up && !down && Brillo == 0) up = true;
       
        if (up && Brillo < 254) Brillo++;
               
        if (!up && !down && Brillo >= 1) down = true;
       
        if (down && Brillo > 0)
            if (Brillo == 1) Brillo--; else Brillo=Brillo-2;
           
        analogWrite(LEDPIN,Brillo); 

    }
}




Te lo paso luego tambien, aunque este SI, es un nodo Souliss :)


Esto también me iría bien así voy viendo como funciona/se programa para Souliss

Este si, te lo paso en un adjunto. No te asustes cuando veas el codigo Souliss por primera vez... xD aunque parezca un poco raro es mucho mas legible y mucho mas entendible de lo que parece. Lo mejor seria que vieras los ejemplos mas basicos (sobretodo si utilizan SpeakEasy) y si tienes alguna duda mas concreta que me preguntes. Por ejemplo, este link:

https://code.google.com/p/souliss/wiki/SpeakEasy


Tomo nota, voy a buscar información sobre pseudocodigos, por que la verdad es que no se muy bien ni lo que significa.


Pseudocodigo no es mas que programacion en lenguaje ordinario, es decir, utilizando palabras que no pertenecen a ningun lenguaje de programacion, por ejemplo:

Code: [Select]
void loop () 
{
   int numero = 0;
   do
      {
       serial.print("Contador:");
       serial.println(numero);
       numero = numero + 1;
    }while (numero < 10)
}

Seria:

Repite Mientras numero sea menor que 10
        -Escribir en pantalla el numero
        -Incrementar el numero

A mi al principio me parecio una chorrada, hasta que entendi que si no aprendia a ver las cosas de manera logica no seria capaz de aprender a expresarme programando, a poder hacer las cosas de diferentes formas y no de una unica forma.


Yo tenia en mente con una raspberry desarrollar alguna programación, ponerle una pantalla tactil y poderla usar como cerebro junto con Arduino. Pero esto lo tengo muy verde aun, he leido algo de programar con Python pero la verdad es que no tengo ni idea de como funciona (solo conozco el nombre XD).

Yo le tengo echado el ojo a la Raspberry tambien, para montarme el XBMC y el Ambilight!! jajaja, se que se le pueden hacer mil perrerias, espero tener 34€  =(

Python es un lenguaje de script, la principal diferencia con otros muchos es que es "interpretado", es decir, no es necesario compliarlo en un exe para ejecutarlo, eso le da el pro de la facilidad de desarrollo, aunque como contra es que es un poco mas lento en ejecucion con respecto a otros lenguajes. Es sencillo, una vez sabes uno, es facil aprender otros lenguajes.



Vaya, yo también soy de Valencia que coincidencias :)

Espero aprender rápido, me voy a tener que poner también las pilas con el ingles...  =(  Por que muchos manuales/tutoriales que he visto vienen en ingles y mas o menos lo entiendo pero no al 100% y es una faena.

Saludos

Jaja, es curioso, en 2 dias en 2 foros diferentes, cruzando mensajes con 2 personas diferentes, y al final resulta que todos somos del mismo sitio!! jajaja

Pues aqui en valencia hay un foro RepRap Valencia, que esta lleno de gente del foro Clonewars (el mas importante en desarrollo de impresoras 3d en España) y sinceramente aun no les he dedicado el tiempo que merecen por falta de fondos, pero es impresionante lo que se esta moviendo el tema aqui, tenemos tiendas, proveedores e incluso gente fabricando filamento. Encima hay muy buen ambiente para ayudar y ser ayudado, se mueve mucho el tema de que apadrinen con el compromiso de apadrinar a otro y asi difundir el tema de las 3d de forma economica.

Yo del ingles voy tirando, y a base de mucho leer, y mucho google traslator para palabras concretas vamos tirando... xD Forzarme a escribir en ingles "penoso" en el foro de Souliss tambien me ayuda algo... xD

Salu2
Title: Re: Duda función millis en domotización para el apagado de un display
Post by: Dabauza on Mar 20, 2014, 02:26 am

Te paso el codigo, se podria simplificar aun mas.


Muchas gracias, me estaba volviendo loco ya. Llevo todo el día intentando hacerlo. Voy a probar el tuyo a ver que tal :)

¿¿¿¿Simplificarlo mas aun????  :smiley-eek: Si vieras lo que yo estaba haciendo alucinarías entonces XD comparado con el tuyo parece el quijote. XD


Este si, te lo paso en un adjunto. No te asustes cuando veas el codigo Souliss por primera vez... xD aunque parezca un poco raro es mucho mas legible y mucho mas entendible de lo que parece. Lo mejor seria que vieras los ejemplos mas basicos (sobretodo si utilizan SpeakEasy) y si tienes alguna duda mas concreta que me preguntes. Por ejemplo, este link:

https://code.google.com/p/souliss/wiki/SpeakEasy


Madre mía!!! Duda en concreto??? Soy un hervidero de dudas XD XD XD. Lo único que he visto mas o menos claro  (del link que me has pasado) es en el setup definir la dirección y la puerta de enlace. Lo del loop ni idea para que sirve. Y de tus códigos ya ni hablamos...


Pseudocodigo no es mas que programacion en lenguaje ordinario, es decir, utilizando palabras que no pertenecen a ningun lenguaje de programacion.


Esto lo voy haciendo yo de forma inconsciente yo en mi cabeza mientras lo voy escribiendo, por ejemplo: Si pulsacion pin 2, guarda el estado, pin 10 a estado guardado. (mas o menos voy pensadolo asi)


Yo le tengo echado el ojo a la Raspberry tambien, para montarme el XBMC y el Ambilight!! jajaja, se que se le pueden hacer mil perrerias, espero tener 34€  =(

Python es un lenguaje de script, la principal diferencia con otros muchos es que es "interpretado", es decir, no es necesario compliarlo en un exe para ejecutarlo, eso le da el pro de la facilidad de desarrollo, aunque como contra es que es un poco mas lento en ejecucion con respecto a otros lenguajes. Es sencillo, una vez sabes uno, es facil aprender otros lenguajes.


A ver si le cojo el tranquillo pronto a esto, no sera por falta de interés o dedicación... lo que pasa es que como tengo que ir probando cada dos por tres y cada vez que algo no funciona encontrar el error y repararlo me cuesta la vida. Aparte que mis conocimientos son bastante limitados.

Ademas también me gustaría ponerme y aprender con la raspberry pero si esto hay cosas que ya me cuestan no quiero ni imaginarme lo otro.


Jaja, es curioso, en 2 dias en 2 foros diferentes, cruzando mensajes con 2 personas diferentes, y al final resulta que todos somos del mismo sitio!! jajaja


Hay que ver lo pequeño que es el mundo. XD


Pues aqui en valencia hay un foro RepRap Valencia, que esta lleno de gente del foro Clonewars (el mas importante en desarrollo de impresoras 3d en España) y sinceramente aun no les he dedicado el tiempo que merecen por falta de fondos, pero es impresionante lo que se esta moviendo el tema aqui, tenemos tiendas, proveedores e incluso gente fabricando filamento. Encima hay muy buen ambiente para ayudar y ser ayudado, se mueve mucho el tema de que apadrinen con el compromiso de apadrinar a otro y asi difundir el tema de las 3d de forma economica.


Me gusta mucho ese tipo de royo (ayudar y ser ayudado), parece ser que por lo menos la gente se va dando cuenta y ya no se buscan solo los intereses económicos.


Yo del ingles voy tirando, y a base de mucho leer, y mucho google traslator para palabras concretas vamos tirando... xD Forzarme a escribir en ingles "penoso" en el foro de Souliss tambien me ayuda algo... xD


A mi lo que es leerlo mas o menos lo entiendo (aunque sea el concepto global y si esta escrito facilito XD) y si alguna palabra no la veo clara hago lo que tu dices "san google translator", el problema lo tengo a la hora de hablarlo o escribirlo... entonces ya si que no hay "tu tia"
Title: Re: Duda función millis en domotización para el apagado de un display
Post by: juanpintom on Mar 20, 2014, 02:57 am

Muchas gracias, me estaba volviendo loco ya. Llevo todo el día intentando hacerlo. Voy a probar el tuyo a ver que tal :)

¿¿¿¿Simplificarlo mas aun????  :smiley-eek: Si vieras lo que yo estaba haciendo alucinarías entonces XD comparado con el tuyo parece el quijote. XD

Ya me cuentas como lo llevas :)


Madre mía!!! Duda en concreto??? Soy un hervidero de dudas XD XD XD. Lo único que he visto mas o menos claro  (del link que me has pasado) es en el setup definir la dirección y la puerta de enlace. Lo del loop ni idea para que sirve. Y de tus códigos ya ni hablamos...

Tranquilo, es muchisimo mas facil de lo que parece, mañana si tengo un rato redacto algo que sea "entendible" y lo pongo en el post de Souliss, realmente todo son una serie de lineas de codigo para cada elemento que quieras introducir que van organizadas en diferentes sitios y en diferentes intervalos de tiempo. Digamos que todo son "mini-bloques" estructurados, y solo es cuestion de copiar/pegar, como ya he comentado estamos preparando un pequeño GUI que generaria el codigo completo en funcion de los elementos que contenga el NODO, ya que como digo esta todo ya bien organizado, solo es cuestion de entender esa estructura.


Esto lo voy haciendo yo de forma inconsciente yo en mi cabeza mientras lo voy escribiendo, por ejemplo: Si pulsacion pin 2, guarda el estado, pin 10 a estado guardado. (mas o menos voy pensadolo asi)


Pues en un papel (notepad o comentario) te lo apuntas antes de empezar a programar. Yo recomiendo usar papel para ir añadiendo cosas y tachando otras. El caso es tener medio estructurado lo que quieres hacer, para que cuando te pongas manos a la obra ya sepas un poco por donde debes ir.


A ver si le cojo el tranquillo pronto a esto, no sera por falta de interés o dedicación... lo que pasa es que como tengo que ir probando cada dos por tres y cada vez que algo no funciona encontrar el error y repararlo me cuesta la vida. Aparte que mis conocimientos son bastante limitados.

Ademas también me gustaría ponerme y aprender con la raspberry pero si esto hay cosas que ya me cuestan no quiero ni imaginarme lo otro.

Lo de "prueba y error" es un clasico, para muchos es una perdida de tiempo, yo aprendo muchisimas cosas cometiendo errores, es cuestion de perspectiva.

Lo de la raspberry ya hay muchas cosas hechas, asi que supongo que a parte de tener que leer un rato no creo que haga falta mas. Y segun creo, hay muchisimas similitudes, Lo cierto es que ya tenia en mente integrar en mi proyecto de domotica un dispositivo multimedia, aportaria muchas cosas, como integrar un hilo musical y otras tantas funciones.


Me gusta mucho ese tipo de royo (ayudar y ser ayudado), parece ser que por lo menos la gente se va dando cuenta y ya no se buscan solo los intereses económicos.

Como OFF-topic: Lo triste es que aun no somos capaces de darnos cuenta del poder que tenemos como sociedad, y asi vamos...

Salu2

Title: Re: Duda función millis en domotización para el apagado de un display
Post by: Dabauza on Mar 20, 2014, 03:11 am
Hola de nuevo juanpintom,

Al final te vas aburrir de mi y mis dudas/problemas (y con razón).

He estado probando el código que me has enviado y no regula, solo enciende y apaga (con un pulso enciende y con otro apaga), lo he copiado tal cual lo has puesto tu, lo único que he modificado han sido el pin del pulsador y el pin del LED.

Supongo que debería de encender/apagar y regular con el mismo botón. ¿No?

¿Tengo que añadir algo mas?

Luego tambien he visto que pones en todas las lineas del loop:
"if (!up && !down && Brillo == 0) up = true;",

¿no seria?:
"if (!up && !down && Brillo == 0)  { up = true;}" (con los {})

Y este lo mismo:
        if (down && Brillo > 0)
              if (Brillo == 1) Brillo--; else Brillo=Brillo-2;

¿Seria?:
       if (down && Brillo > 0)  {
           if (Brillo == 1) Brillo--; else Brillo=Brillo-2;
        }

Disculpa por bombardearte a preguntas.

Muchísimas gracias de nuevo por todas tus aclaraciones y por tu tiempo.

Saludos
Title: Re: Duda función millis en domotización para el apagado de un display
Post by: juanpintom on Mar 20, 2014, 03:21 am

Hola de nuevo juanpintom,

Al final te vas aburrir de mi y mis dudas/problemas (y con razón).

He estado probando el código que me has enviado y no regula, solo enciende y apaga (con un pulso enciende y con otro apaga), lo he copiado tal cual lo has puesto tu, lo único que he modificado han sido el pin del pulsador y el pin del LED.

Supongo que debería de encender/apagar y regular con el mismo botón. ¿No?

¿Tengo que añadir algo mas?

Luego tambien he visto que pones en todas las lineas del loop:
"if (!up && !down && Brillo == 0) up = true;",

¿no seria?:
"if (!up && !down && Brillo == 0)  { up = true;}" (con los {})

Y este lo mismo:
        if (down && Brillo > 0)
              if (Brillo == 1) Brillo--; else Brillo=Brillo-2;

¿Seria?:
       if (down && Brillo > 0)  {
           if (Brillo == 1) Brillo--; else Brillo=Brillo-2;
        }

Disculpa por bombardearte a preguntas.

Muchísimas gracias de nuevo por todas tus aclaraciones y por tu tiempo.

Saludos


Ahora reviso el codigo, porque lo he adaptado de mi sketch y no me he parado a revisar mucho la verdad xD

El uso de los {} en las estructuras if es unicamente obligatorio cuando contienen mas de una linea de codigo. Por ejemplo, para apagar un led si esta encendido:
if (digitalRead(PIN)) digitalWrite(PIN,LOW);  

pero si ademas quiero enviar por puerto serie (para debug) el estado del pin ya tendria que usar {}
if (digitalRead(PIN))
{
   digitalWrite(PIN,LOW);  
   Serial.println("Apagado");
}

Salu2

Edito: Ya decia yo que podia ser mas sencillo... xD Pruebalo, no lo he compilado: (lee el reedito antes de probar este codigo)

Code: [Select]
#define LEDPIN 9
#define BOTON 2

byte Brillo = 0;

void setup()
{
       pinMode(LEDPIN,OUTPUT);
pinMode(BOTON,INPUT);

}

void loop()
{
   if (digitalRead(BOTON) && Brillo > 0) Brillo--;
   if (digitalRead(BOTON) && Brillo == 0 )
            if (Brillo<254) Brillo++;
         
   analogWrite(LEDPIN,Brillo);  
}


Lo que creo que hara es un rebote al llegar a 0 y volvera a subir, asi que puede ser complicado apagarlo, haz pruebas a ver si consigues algo y si no mañana le hecho un ojo.

Re-edito. Creo que lo que esta pasando en el codigo "largo" es que sube y baja muy rapido y parece que se encienda y se apaga, aunque realmente esta haciendo el dimmer en 254 milisegundos xD, incluye un delay(50); despues del analogWrite :) y este codigo no tiene el rebote que comentaba en el "Edito"

Y otra cosa IMPORTANTE, debes utilizar un PIN para el LED que sea PWM o en un PIN analogico. (estos los puedes usar como PIN 14 y siguientes...)

Salu2
Title: Re: Duda función millis en domotización para el apagado de un display
Post by: Dabauza on Mar 20, 2014, 03:38 am

Ahora reviso el codigo, porque lo he adaptado de mi sketch y no me he parado a revisar mucho la verdad xD


Gracias de nuevo.


El uso de los {} en las estructuras if es unicamente obligatorio cuando contienen mas de una linea de codigo.


Vaya, esta también me la apunto. :).

Un saludo
Title: Re: Duda función millis en domotización para el apagado de un display
Post by: juanpintom on Mar 20, 2014, 03:42 am
Code: [Select]
#define LEDPIN 9
#define BOTON 2

byte Brillo = 0;
boolean up;
boolean down;

void setup()
{
        pinMode(LEDPIN,OUTPUT);
pinMode(BOTON,INPUT);

}

void loop()
{
    if (!digitalRead(BOTON)) { 
          up = false;
          down = false;
    }else{
        if (!up && !down && Brillo == 0) up = true;
       
        if (up && Brillo < 254) Brillo++;
               
        if (!up && !down && Brillo >= 1) down = true;
       
        if (down && Brillo > 0)
            if (Brillo == 1) Brillo--; else Brillo=Brillo-2;
           
        analogWrite(LEDPIN,Brillo); 
        delay(50);

    }
}
Title: Re: Duda función millis en domotización para el apagado de un display
Post by: Dabauza on Mar 20, 2014, 04:06 am

Ya me cuentas como lo llevas :)

Hablando del proyecto principal:
A ver si averiguo como se adjuntan los archivos y te adjunto el mio, le he añadido tambien un boton para poder encender la pantalla manualmente sin tener que pagar y volver a encender los leds.


Tranquilo, es muchisimo mas facil de lo que parece, mañana si tengo un rato redacto algo que sea "entendible" y lo pongo en el post de Souliss, realmente todo son una serie de lineas de codigo para cada elemento que quieras introducir que van organizadas en diferentes sitios y en diferentes intervalos de tiempo. Digamos que todo son "mini-bloques" estructurados, y solo es cuestion de copiar/pegar, como ya he comentado estamos preparando un pequeño GUI que generaria el codigo completo en funcion de los elementos que contenga el NODO, ya que como digo esta todo ya bien organizado, solo es cuestion de entender esa estructura.


Estaría genial leerlo para ir pillando le el rollo al Souliss. Aunque mas o menos el concepto general creo que lo entiendo, ya te digo es mas o menos o lo que yo tenia en mente hacer en mi casa (aunque jamas me hubiese imaginado que fuera tan complicado)


Pues en un papel (notepad o comentario) te lo apuntas antes de empezar a programar. Yo recomiendo usar papel para ir añadiendo cosas y tachando otras. El caso es tener medio estructurado lo que quieres hacer, para que cuando te pongas manos a la obra ya sepas un poco por donde debes ir.


En papel ya lo he intentado, el problema es que me cuesta mucho plasmar en papel lo que pienso que quiero hacer con el Arduino. Y yo creo que se debe a que aun no se combinar bien las funciones.


Lo de "prueba y error" es un clasico, para muchos es una perdida de tiempo, yo aprendo muchisimas cosas cometiendo errores, es cuestion de perspectiva.


Yo creo que es como mas se aprende, aunque a veces me desquicio, sobre todo cuando me quedo mucho tiempo estancado en el mismo punto.


Lo de la raspberry ya hay muchas cosas hechas, asi que supongo que a parte de tener que leer un rato no creo que haga falta mas. Y segun creo, hay muchisimas similitudes, Lo cierto es que ya tenia en mente integrar en mi proyecto de domotica un dispositivo multimedia, aportaria muchas cosas, como integrar un hilo musical y otras tantas funciones.


Como yo digo, el unico limite es la imaginacion de cada uno, por que la verdad es que no es que sea excesivamente caro y al final tar o temprano uno se puede hacer con los componentes y llevar el proyecto a cabo


Como OFF-topic: Lo triste es que aun no somos capaces de darnos cuenta del poder que tenemos como sociedad, y asi vamos...


No podría estar mas de acuerdo, hoy en día lo que prima es mirar por uno mismo aunque tengas que chafar al de al lado, y como tu dices, así nos va...
Title: Re: Duda función millis en domotización para el apagado de un display
Post by: Dabauza on Mar 20, 2014, 04:08 am

Ahora reviso el codigo, porque lo he adaptado de mi sketch y no me he parado a revisar mucho la verdad xD

El uso de los {} en las estructuras if es unicamente obligatorio cuando contienen mas de una linea de codigo. Por ejemplo, para apagar un led si esta encendido:
if (digitalRead(PIN)) digitalWrite(PIN,LOW); 

pero si ademas quiero enviar por puerto serie (para debug) el estado del pin ya tendria que usar {}
if (digitalRead(PIN))
{
    digitalWrite(PIN,LOW); 
    Serial.println("Apagado");
}

Salu2

Edito: Ya decia yo que podia ser mas sencillo... xD Pruebalo, no lo he compilado: (lee el reedito antes de probar este codigo)

Code: [Select]
#define LEDPIN 9
#define BOTON 2

byte Brillo = 0;

void setup()
{
        pinMode(LEDPIN,OUTPUT);
pinMode(BOTON,INPUT);

}

void loop()
{
    if (digitalRead(BOTON) && Brillo > 0) Brillo--;
    if (digitalRead(BOTON) && Brillo == 0 )
             if (Brillo<254) Brillo++;
           
    analogWrite(LEDPIN,Brillo); 
}


Lo que creo que hara es un rebote al llegar a 0 y volvera a subir, asi que puede ser complicado apagarlo, haz pruebas a ver si consigues algo y si no mañana le hecho un ojo.

Re-edito. Creo que lo que esta pasando en el codigo "largo" es que sube y baja muy rapido y parece que se encienda y se apaga, aunque realmente esta haciendo el dimmer en 254 milisegundos xD, incluye un delay(50); despues del analogWrite :) y este codigo no tiene el rebote que comentaba en el "Edito"

Y otra cosa IMPORTANTE, debes utilizar un PIN para el LED que sea PWM o en un PIN analogico. (estos los puedes usar como PIN 14 y siguientes...)

Salu2


Si, el led si que lo tengo conectado a un pin PWM.

Lo del rebote en el primer caso no creo que sea por que encencer si que enciende (con un pulso), y apagar si que apaga (con otro pulso)

Voy a hacer pruebas a ver

Muchas gracias
Title: Re: Duda función millis en domotización para el apagado de un display
Post by: Dabauza on Mar 20, 2014, 04:17 am

Code: [Select]
#define LEDPIN 9
#define BOTON 2

byte Brillo = 0;
boolean up;
boolean down;

void setup()
{
        pinMode(LEDPIN,OUTPUT);
pinMode(BOTON,INPUT);

}

void loop()
{
    if (!digitalRead(BOTON)) { 
          up = false;
          down = false;
    }else{
        if (!up && !down && Brillo == 0) up = true;
       
        if (up && Brillo < 254) Brillo++;
               
        if (!up && !down && Brillo >= 1) down = true;
       
        if (down && Brillo > 0)
            if (Brillo == 1) Brillo--; else Brillo=Brillo-2;
           
        analogWrite(LEDPIN,Brillo); 
        delay(50);

    }
}



Muchas gracias,

Este ultimo si que funciona. De todas formas mañana les pego un ojo a todos detenidamente por que ya se me cruzan las lineas.

Saludos
Title: Re: Duda función millis en domotización para el apagado de un display
Post by: JohnnyDeauville on Mar 20, 2014, 04:23 pm
Con permiso de juanpintom, me he permitido hacer el código un poco más reducido... en espacio y memoria

Code: [Select]

#define PIN_LED 9
#define PIN_BOTON 2

#define MODO_ESPERA 0
#define MODO_ARRIBA 1
#define MODO_ABAJO  2

byte byBrillo = 0;
byte byModo = MODO_ESPERA;

void setup()
{
 
  pinMode( PIN_LED, OUTPUT );
pinMode( PIN_BOTON, INPUT );

}

void loop()
{

if( !digitalRead( PIN_BOTON ) ) {
 
 byModo = MODO_ESPERA;
 
} else {

 switch( byModo ) {
 case MODO_ARRIBA:
   byBrillo = min( byBrillo++, 255 );
   break;
   
 case MODO_ABAJO:
   byBrillo = max( byBrillo - 2, 0 );
   break;
 
 default:
   byModo = ( ( byBrillo == 0 ) ? MODO_ARRIBA : MODO_ABAJO );
 
 }
   
    analogWrite( PIN_LED, byBrillo );  
    delay( 50 );

 }

}
Title: Re: Duda función millis en domotización para el apagado de un display
Post by: juanpintom on Mar 20, 2014, 10:56 pm

Con permiso de juanpintom, me he permitido hacer el código un poco más reducido... en espacio y memoria

Code: [Select]

#define PIN_LED 9
#define PIN_BOTON 2

#define MODO_ESPERA 0
#define MODO_ARRIBA 1
#define MODO_ABAJO  2

byte byBrillo = 0;
byte byModo = MODO_ESPERA;

void setup()
{
 
  pinMode( PIN_LED, OUTPUT );
pinMode( PIN_BOTON, INPUT );

}

void loop()
{

if( !digitalRead( PIN_BOTON ) ) {
 
 byModo = MODO_ESPERA;
 
} else {

 switch( byModo ) {
 case MODO_ARRIBA:
   byBrillo = min( byBrillo++, 255 );
   break;
   
 case MODO_ABAJO:
   byBrillo = max( byBrillo - 2, 0 );
   break;
 
 default:
   byModo = ( ( byBrillo == 0 ) ? MODO_ARRIBA : MODO_ABAJO );
 
 }
   
    analogWrite( PIN_LED, byBrillo );  
    delay( 50 );

 }

}



Al contrario, precisamente el codigo lo hice lo mas "legible" posible, pero encuentro tu programacion mas estructurada y por supuesto mas optima. Lo que no habia visto yo referencias es de las funciones max y min, una cosa mas que aprendo! Gracias :)

+1 a tu karma  :P
Title: Re: Duda función millis en domotización para el apagado de un display
Post by: Dabauza on Mar 21, 2014, 12:14 am
Muchas gracias juanpintom y JohnnyDeauville,

La verdad es que no entiendo mucho vuestros códigos y esto me hace darme cuenta de lo super verde que estoy. Voy a dedicarles mas tiempo a ver si los entiendo (hoy he estado muy liado y no he podido estar en cuanto apenas dedicado a mi placa  =(  ). Voy a poner aquí mi código, (si es que se le puede llamar así XD) por si queréis verla. Ya veréis que ni punto de comparación con los vuestros, ademas ni funciona  =(

Quote

#define pulsadorON 51
#define pulsadorDimmer 53
#define LED 2

int estadoPulsadorON=0;
int estadoActualON=0;
int estadoUltimoON=0;
int contadorON=0;

int estadoPulsadorDimmer=0;
int estadoActualDimmer=0;
int estadoDimmer=0;

unsigned long tiempo;
long pulsCorta=100;

int d=0;

void setup(){
pinMode(pulsadorDimmer,INPUT);
pinMode(pulsadorON,INPUT);
pinMode(LED,OUTPUT);

Serial.begin(9600);
}

void loop(){
//Contador para asignar el estado al boton ON/OFF.
estadoActualON=digitalRead(pulsadorON);
if(estadoActualON != estadoUltimoON){
   if(estadoActualON == HIGH){
     contadorON = contadorON +1;
//    Serial.print("pulsacion nº");
//    Serial.println(contadorON);
   }
}
estadoUltimoON=estadoActualON;


if(contadorON % 2 != 0){ //Pulsacion impar enciende el LED
//   tiempo=millis();
//   Serial.println("prueba repeticion del tiempo");
   if(digitalRead(pulsadorDimmer)){
     tiempo=millis();
//     Serial.println("prueba repeticion del tiempo");
     while(digitalRead(pulsadorDimmer) == HIGH)/*&&(millis()-tiempo) > pulsCorta)*/{
//       if((millis()-tiempo) > pulsCorta){
//        tiempo=millis();
//         Serial.println("Correcto");
         for(d=255;d>=0;d--){
         analogWrite(LED,d);
         estadoDimmer=d;
         }
//       } 
     }
   }
   else{analogWrite(LED,d);}
}

if(contadorON % 2 == 0){analogWrite(LED,0);}
}



El intento de codigo anterior XD tiene muchas lineas que son de prueba que estoy añadiendo y quitando según la marcha para ir viendo lo que pasa.

Mi intención era (y es) manejarlo con un solo pulsador, pero (y aquí viene lo bueno) con el primer pulso corto (pulsación impar) se encendiera al máximo y con otro pulso corto (pulsación par) se apagara. Ademas estado el led apagado, si mantengo pulsado el botón, que el led fuera encendiéndose poco a foco (incrementando la luminosidad). Y estando el led al máximo (o a mitad de la regulación) si mantengo pulsado el botón, que la luminosidad fuera disminuyendo. Y todo esto trataba de hacerlo sin usar la función delay. Y bueno ya os podéis imaginar que para alguien como yo (con conocimientos bastante limitados en la materia) en el lio en el que me he metido. XD

Así que luego se me ocurrió que para ir empezando tal vez fuera mas sencillo hacer que con un pulsador encendiera/apagara y con otro regulara. y en ello estaba.

Saludos y gracias por vuestras respuestas.

Edito:
juanpintom, ahora que has mencionado lo del karma ya se para que sirve. +1 para los dos ;)
Title: Re: Duda función millis en domotización para el apagado de un display
Post by: juanpintom on Mar 21, 2014, 01:29 am
Unos consejos (si se me permite) para mejorar tu programacion:

Intenta siempre utilizar variables que "correspondan" con el dato que van a guardar, me explico, es perfectamente valido:
int valor = 0; pero cuando unicamente va a contener el estado de un PIN, cuyo valor sera 0 o 1, es recomendable utilizar una variable tipo boolean: boolean valor = 0;

De esa forma
boolean -> 0 - 1
byte -> 0 - 254
int - 0 - 30 y pico mil
long - una burrada xD (para guardar millis() por ejemplo)

Asi se ahora espacio, que para estos micros viene bien, en sketches pequeños no pasa nada, pero para mas grandes si y es bueno hacerlo por costumbre :)

Otra cosa, debes entender (no solo saber) que el Arduino recorrera el void loop infinitamente, y en un codigo ciclico has de hacer lo que se llama depuracion, es decir, piensa que valor tendra caaada variable en cada "vuelta" del loop.

Por ejemplo, es parecido a lo que corrigio el sketch que te pase antes, si te fijas, es exactamente igual que el que puse en el post anterior pero añadiendo un "delay(50)", este delay lo que hace es que en lugar de recorrer el loop "a toda leche" pare un poco (50 milisegundos) en cada vuelta, lo que a la percepcion del ojo humano hace que el led pase de encenderse y apagarse (como te parecia a ti) a hacer el dimmer "correctamente", porque para subir desde 0 a 255 si en cada paso le pones una parada de 50ms tardara unos 12,75 segundos.
Ahora viene la mala noticia, se intenta minimizar el uso de la funcion delay() porque eso provoca que el Arduino este esperando sin mas, cuando podria (o deberia) estar haciendo otras cosas...  Un ejemplo de buen uso, es en Souliss utilizar las funciones ya implementadas de FAST_70ms() que haria ejecutar dicho codigo cada 70ms.

En tu codigo pasa algo parecido, piensa que si tu pulsas el boton y el arduino recorre el codigo casi cada milisegundo, estaria detectando e incrementando el pulsador muchisimo mas de lo que crees, a no ser, por ejemplo, una vez incrementado el pulsador haz al codigo esperar hasta que se suelte el boton.

En todo caso no seria la mejor forma de hacerlo, lo mejor para hacer detectar si haces 1 o 2 pulsaciones seguidas (y ademas tener en cuenta que puedes mantenerlo pulsado) tienes que replanteartelo.
Para encender con un click y apagar con 2 seria mas sencillo hacerlo con un click que invierta el estado, si aun asi tienes la intencion de hacer el "doble click" lo ideal seria medir el tiempo entre clicks y valorar entonces si es un click o doble click. Y para el tema del pulso es parecido, debes valorar si el click sigue activo mas de x tiempo y entonces empezar a hacer el dimmer. Un problema que te vas a encontrar es que debes valorar el tiempo que vas a invertir a esto.

Salu2
Title: Re: Duda función millis en domotización para el apagado de un display
Post by: Dabauza on Mar 21, 2014, 02:42 am

Unos consejos (si se me permite) para mejorar tu programacion:


!!!Claro que se permiten!!! Cuantos mas mejor, con tal de mejorar en la programacion :)


Intenta siempre utilizar variables que "correspondan" con el dato que van a guardar, me explico, es perfectamente valido:
int valor = 0; pero cuando unicamente va a contener el estado de un PIN, cuyo valor sera 0 o 1, es recomendable utilizar una variable tipo boolean: boolean valor = 0;

De esa forma
boolean -> 0 - 1
byte -> 0 - 254
int - 0 - 30 y pico mil
long - una burrada xD (para guardar millis() por ejemplo)

Asi se ahora espacio, que para estos micros viene bien, en sketches pequeños no pasa nada, pero para mas grandes si y es bueno hacerlo por costumbre :)


De acuerdo, ahora lo veo mas claro, la verdad es que me liaba un poco con los boolean, char, byte, int,  long y toda la retafila de tipos de variables que hay XD. Me memorizare bien la cantidad de valores que puede tomar cada una para así poder signarlas como toca.


Otra cosa, debes entender (no solo saber) que el Arduino recorrera el void loop infinitamente, y en un codigo ciclico has de hacer lo que se llama depuracion, es decir, piensa que valor tendra caaada variable en cada "vuelta" del loop.


Esto si que lo sabia, pero tengo una mini duda XD. El loop Arduino lo recorre infinitamente mientras tenga alimentación, pero... Si yo hago un void aparte, por ejemplo, void escena1, este solamente entrara funcionamiento cuando yo lo llame en el loop. ¿No?


Por ejemplo, es parecido a lo que corrigio el sketch que te pase antes, si te fijas, es exactamente igual que el que puse en el post anterior pero añadiendo un "delay(50)", este delay lo que hace es que en lugar de recorrer el loop "a toda leche" pare un poco (50 milisegundos) en cada vuelta, lo que a la percepcion del ojo humano hace que el led pase de encenderse y apagarse (como te parecia a ti) a hacer el dimmer "correctamente", porque para subir desde 0 a 255 si en cada paso le pones una parada de 50ms tardara unos 12,75 segundos.


Si, los estuve comparando y ya vi que la única diferencia era el delay del final. Lo que me pareció extraño es que siempre que pulsaba encendía y cuando volvía a pulsar apagaba. Seria coincidencia.


Ahora viene la mala noticia, se intenta minimizar el uso de la funcion delay() porque eso provoca que el Arduino este esperando sin mas, cuando podria (o deberia) estar haciendo otras cosas...  Un ejemplo de buen uso, es en Souliss utilizar las funciones ya implementadas de FAST_70ms() que haria ejecutar dicho codigo cada 70ms.


Por eso intentaba hacer yo el dimmer sin delay, (he editado el post anterior, me había equivocado y había puesto millis en vez de delay) pero me parece que es una locura. El problema creo yo de hacerlo con el delay es que, si por ejemplo, tengo otro delay en el loop de 2000ms el dimmer cada paso lo dará a los 2050ms. ¿No? Por eso trato de no usar los delay. Pero a mi eso de hacer las pausas con los millis me vuelve loco, por que para que tome como referencia un valor del millis, lo asigne a una variable y no me lo modifique hasta que se cumpla toda la función hay que poner una condición al principio, como por ejemplo esto:

Code: [Select]
if ((contadorManual % 2 != 0)[b]&&(digitalRead(pulsadorManual)[/b])){
   tiempo = millis ();
   LCDman();
  }
else if (millis()-tiempo > temporizadorLCD){
   lcd.noBacklight();
   lcd.clear();


El problema yo lo tengo en que no se que condición poner (o me cuesta la vida verla) para que no me modifique la variable asignada.


En tu codigo pasa algo parecido, piensa que si tu pulsas el boton y el arduino recorre el codigo casi cada milisegundo, estaria detectando e incrementando el pulsador muchisimo mas de lo que crees, a no ser, por ejemplo, una vez incrementado el pulsador haz al codigo esperar hasta que se suelte el boton.


¿Te refieres a esta parte?

Code: [Select]
estadoActualON=digitalRead(pulsadorON);
if(estadoActualON != estadoUltimoON){
   if(estadoActualON == HIGH){
     contadorON = contadorON +1;
   }
}
estadoUltimoON=estadoActualON;


En este caso creo que no, porque para que incremente depende del estado anterior, en el momento en que yo pulso el estado cambia, y al ser ALTO incrementa el contador. Pero si yo lo mantengo pulsado como el estado es igual al anterior no incrementa. que igual me equivoco (y es lo mas probable) XD


En todo caso no seria la mejor forma de hacerlo, lo mejor para hacer detectar si haces 1 o 2 pulsaciones seguidas (y ademas tener en cuenta que puedes mantenerlo pulsado) tienes que replanteartelo.


Esta parte no te entiendo


Para encender con un click y apagar con 2 seria mas sencillo hacerlo con un click que invierta el estado, si aun asi tienes la intencion de hacer el "doble click" lo ideal seria medir el tiempo entre clicks y valorar entonces si es un click o doble click. Y para el tema del pulso es parecido, debes valorar si el click sigue activo mas de x tiempo y entonces empezar a hacer el dimmer. Un problema que te vas a encontrar es que debes valorar el tiempo que vas a invertir a esto.


No se si te entiendo bien. Mi intención no era apagar con doble click lo que pretendo era 1 click enciendo, otro click apaga (que conmute el estado del led con cada click). Aunque esto de medir el tiempo entre clicks me lo apunto para un futuro.

Por otro lado, lo del pulso largo tenia pensado tomarlo como 500ms, aunque en el código que he subido creo que ponía otro valor. Es que como iba probando pues lo cambiaba cada dos por tres XD.

De todas formas voy a mirarme bien tu sketch para ver lo del cambio de estado, a ver si le pillo el rollo por que la verdad parece mucho menos jaleo que como yo lo hago

Muchas gracias por tus consejos, la verdad es que me vienen como agua de mayo. ;)

Saludos
Title: Re: Duda función millis en domotización para el apagado de un display
Post by: Dabauza on Mar 21, 2014, 02:54 am
Por cierto juanpintom (y todo el que quiera verlo), aquí dejo el código como lo llevo de momento.

Me falta modificar las cosas que me has comentado y terminar lo del dimmer para añadirlo en el modo manual pero mas o menos en esencia es esto XD

Saludos

Title: Re: Duda función millis en domotización para el apagado de un display
Post by: juanpintom on Mar 21, 2014, 03:38 am

Esto si que lo sabia, pero tengo una mini duda XD. El loop Arduino lo recorre infinitamente mientras tenga alimentación, pero... Si yo hago un void aparte, por ejemplo, void escena1, este solamente entrara funcionamiento cuando yo lo llame en el loop. ¿No?

Exacto, lo que llamas void seria precisamente una duda que comentaste, las funciones :)

La idea es que una funcion es una porcion de codigo que puede ser llamada en diferentes momentos de la ejecucion, ademas permiten "enviar" datos y devolver "respuesta", te pongo el ejemplo mas sencillo que conozco en programacion:
Supongamos que tuvieramos una interfaz para introducir los valores a y b.

Code: [Select]
void loop(){
int a = 10;
int b = 15
int c;

c = suma(a,b);   // Llamamos a la funcion suma() enviando los valores a y b y asignando la "respuesta" a la variable c
println(c); //imprimira la respuesta
}

//la funcion se declara poniendo delante void si no devuelve nada o el tipo de variable que devuelve, en este caso un int, y tambien tiene que tener declarados los valores que recibira y el tipo (int en este caso) debe corresponder con el que enviemos al llamar a la funcion, es decir con a y b.

int suma (int valor1, int valor2){     
     int resultado;
     resultado = valor1 + valor2;
     return resultado;    // la linea return devuelve la respuesta y deja sin ejecutar las lineas que esten por debajo (si las hubiera)
}





Si, los estuve comparando y ya vi que la única diferencia era el delay del final. Lo que me pareció extraño es que siempre que pulsaba encendía y cuando volvía a pulsar apagaba. Seria coincidencia.

No, lo hacia bien porque en mi codigo esta la linea:
Code: [Select]
if (!digitalRead(BOTON)) {
Que si te fijas tambien esta en el sketch de JohnnyDeauville, realmente los 2 hacen lo mismo simplemente "expresandolo" de formas diferentes.
En este caso, esa linea lo que hace es impedir que el codigo cambie de estado (subir o bajar), a no ser que el Boton se suelte. Que es parecido a lo que hace tu codigo en este otro Quote:

¿Te refieres a esta parte?

Code: [Select]
estadoActualON=digitalRead(pulsadorON);
if(estadoActualON != estadoUltimoON){
   if(estadoActualON == HIGH){
     contadorON = contadorON +1;
   }
}
estadoUltimoON=estadoActualON;


En este caso creo que no, porque para que incremente depende del estado anterior, en el momento en que yo pulso el estado cambia, y al ser ALTO incrementa el contador. Pero si yo lo mantengo pulsado como el estado es igual al anterior no incrementa. que igual me equivoco (y es lo mas probable) XD

Efectivamente tienes razon, lo hace correctamente .


El problema creo yo de hacerlo con el delay es que, si por ejemplo, tengo otro delay en el loop de 2000ms el dimmer cada paso lo dará a los 2050ms. ¿No?

Correcto, y problema grave xD


El problema yo lo tengo en que no se que condición poner (o me cuesta la vida verla) para que no me modifique la variable asignada.


Es mas o menos la misma duda que la anterior, debes evaluar que solo asigne millis a tiempo la primera vez que se pulse.
En todo caso ese codigo funciona, no?


Esta parte no te entiendo

Tranquilo, a veces yo tampoco me entiendo... xD
Lo que queria decir es que en ese caso el codigo efectivamente era mucho mas sencillo, te lo pongo con el codigo de JohnnyDeauville, que como digo hace lo mismo, pero mas optimizado :)

Code: [Select]
#define PIN_LED 9
#define PIN_BOTON 2

#define MODO_ESPERA 0
#define MODO_ARRIBA 1
#define MODO_ABAJO  2
#define MODO_ON 3
#define MODO_OFF 4

byte byBrillo = 0;
byte byModo = MODO_ESPERA;
unsigned long tiempo;

void setup()
{
   
   pinMode( PIN_LED, OUTPUT );
pinMode( PIN_BOTON, INPUT );

}

void loop()
{

if( !digitalRead( PIN_BOTON ) ) {
 
  byModo = MODO_ESPERA;
  tiempo = millis();

} else {

  switch( byModo ) {
  case MODO_ARRIBA:
    byBrillo = min( byBrillo++, 255 );
    break;
   
  case MODO_ABAJO:
    byBrillo = max( byBrillo - 2, 0 );
    break;

  case MODO_ON:
    byBrillo = 255;
    break;

  case MODO_OFF:
    byBrillo = 0;
    break;
 
  default:
    if (millis() - tiempo > 500)
            byModo = ( ( byBrillo == 0 ) ? MODO_ARRIBA : MODO_ABAJO );
    else
            byModo = ( ( byBrillo == 0 ) ? MODO_ON : MODO_OFF );
  }
     
     analogWrite( PIN_LED, byBrillo ); 
     delay( 50 );

  }


Salu2
Title: Re: Duda función millis en domotización para el apagado de un display
Post by: Dabauza on Mar 21, 2014, 10:36 am

La idea es que una funcion es una porcion de codigo que puede ser llamada en diferentes momentos de la ejecucion, ademas permiten "enviar" datos y devolver "respuesta", te pongo el ejemplo mas sencillo que conozco en programacion:
Supongamos que tuvieramos una interfaz para introducir los valores a y b.

Code: [Select]
void loop(){
int a = 10;
int b = 15
int c;

c = suma(a,b);   // Llamamos a la funcion suma() enviando los valores a y b y asignando la "respuesta" a la variable c
println(c); //imprimira la respuesta
}

//la funcion se declara poniendo delante void si no devuelve nada o el tipo de variable que devuelve, en este caso un int, y tambien tiene que tener declarados los valores que recibira y el tipo (int en este caso) debe corresponder con el que enviemos al llamar a la funcion, es decir con a y b.

int suma (int valor1, int valor2){     
     int resultado;
     resultado = valor1 + valor2;
     return resultado;    // la linea return devuelve la respuesta y deja sin ejecutar las lineas que esten por debajo (si las hubiera)
}



Vale, creo que ya lo voy pillando. Si pusiera, por ejemplo, void escena1() y en loop con un pulsador llamara a esta escena, esta no devuelve respuesta. esto lo podría usar por ejemplo para un apagado general o cualquier otra cosa que no espere ningún tipo de respuesta.

Pero si pusiera "byte dimmer ()" y dentro de esta función declarara la función del dimmer  y al final del todo pusiera "return estadodimmer" podría usar la respuesta que me devuelve para mostrar en el LCD el nivel de regulación al que esta funcionando el LED.

Es un poco lió la estructura pero solo es cuestión de practicarla unas cuantas veces para cogerle el punto.



No, lo hacia bien porque en mi codigo esta la linea:
Code: [Select]
if (!digitalRead(BOTON)) {
Que si te fijas tambien esta en el sketch de JohnnyDeauville, realmente los 2 hacen lo mismo simplemente "expresandolo" de formas diferentes.
En este caso, esa linea lo que hace es impedir que el codigo cambie de estado (subir o bajar), a no ser que el Boton se suelte.


Vale, me los he revisado una y otra vez y al final creo que he pillado el fincionamiento, solo tengo tres dudas tontas. La primera:

En el trozo este del codigo de JohnnyDeauville,

Quote
Code: [Select]
  case MODO_ARRIBA:
    byBrillo = min( byBrillo++, 255 );
    break;
   
  case MODO_ABAJO:
    byBrillo = max( byBrillo - 2, 0 );
    break;


La regulación ascendente la hará paso a paso, pero la descendente de dos en dos. ¿No?

Luego, esto:

Quote
Code: [Select]
  default:
    byModo = ( ( byBrillo == 0 ) ? MODO_ARRIBA : MODO_ABAJO );


Si no se ejecuta nada anterior del código se ejecuta esto, hasta aquí todo bien, ¿pero que quiere decir? "MODO_ARRIBA : MODO_ABAJO" (los dos puntos entre uno y otro)

Y la ultima. Si yo le asigno un valor a una variable dentro de un if, el valor que esta tome se mantendrá hasta que yo lo cambie en algún momento del loop. ¿No? Como aquí: (Escribo sobre tu codigo)

Code: [Select]
void loop()
{
    if (!digitalRead(BOTON)) {   //Esto se ejecutara todo el rato hasta que yo pulse el BOTON, Entonces esta condición dejara de
          up = false;                      //cumplirse y pasare al else
          down = false;
    }else{
        if (!up && !down && Brillo == 0) up = true;  //Entonces si yo continuo manteniendo pulsado BOTON le asigana a  up el valor
                                                                               //true
        if (up && Brillo < 254) Brillo++;   //Y va incrementando el brillo hasta 254 como máximo, momento en el cual soltare el BOTON
                                                            //Y up volvera a se false en el if
        if (!up && !down && Brillo >= 1) down = true;  //si vuelvo a pulsar BOTON y como el brillo es > que 1  le asigna a down el valor
                                                                                   //true
        if (down && Brillo > 0)                                       //Si down es true y brillo > de 0
            if (Brillo == 1) Brillo--; else Brillo=Brillo-2;     //Si brillo es igual a 1, brillo disminuira; Si no Brillo disminuira de dos en dos
           
        analogWrite(LEDPIN,Brillo); 
        delay(50);

    }
}


Seria así. ¿No?

Quote
En todo caso ese codigo funciona, no?


No, el mio no funciona. Al menos por el momento XD

Quote
Lo que queria decir es que en ese caso el codigo efectivamente era mucho mas sencillo, te lo pongo con el codigo de JohnnyDeauville, que como digo hace lo mismo, pero mas optimizado :)

Code: [Select]
#define PIN_LED 9
#define PIN_BOTON 2

#define MODO_ESPERA 0
#define MODO_ARRIBA 1
#define MODO_ABAJO  2
#define MODO_ON 3
#define MODO_OFF 4

byte byBrillo = 0;
byte byModo = MODO_ESPERA;
unsigned long tiempo;

void setup()
{
   
   pinMode( PIN_LED, OUTPUT );
pinMode( PIN_BOTON, INPUT );

}

void loop()
{

if( !digitalRead( PIN_BOTON ) ) {
 
  byModo = MODO_ESPERA;
  tiempo = millis();

} else {

  switch( byModo ) {
  case MODO_ARRIBA:
    byBrillo = min( byBrillo++, 255 );
    break;
   
  case MODO_ABAJO:
    byBrillo = max( byBrillo - 2, 0 );
    break;

  case MODO_ON:
    byBrillo = 255;
    break;

  case MODO_OFF:
    byBrillo = 0;
    break;
 
  default:
    if (millis() - tiempo > 500)
            byModo = ( ( byBrillo == 0 ) ? MODO_ARRIBA : MODO_ABAJO );
    else
            byModo = ( ( byBrillo == 0 ) ? MODO_ON : MODO_OFF );
  }
     
     analogWrite( PIN_LED, byBrillo ); 
     delay( 50 );

  }


Es mas largo, pero parece mas sencillo. Lo único es (como en el caso anterior) no termino de entender que papel desempeñan los ":" en el default. :~  he buscado en el libro y no lo he visto por ningún lado  =(

Bueno, tras tres horas invertidas en esto, por lo menos lo empiezo a ver mas claro. Voy a probar a ponerlo en practica con el dimmer a ver si consigo hacerlo como yo pretendía.

Muchiiiiiiiiiiiiisiiiiiiiiiiiimas gracias.

juanpintom, tienes una cerveza (cafe o lo que sea) pagada cuando quieras ;)

Saludos
Title: Re: Duda función millis en domotización para el apagado de un display
Post by: Dabauza on Mar 21, 2014, 12:38 pm
Asi es como lo tengo de momento:

Code: [Select]
#define LED 2
#define BOTON 53

#define MODO_ESPERA 0
#define SUBE        1
#define BAJA        2
#define ON          3
#define OFF         4

byte BRILLO = 0;
byte MODO = MODO_ESPERA;

unsigned long tiempo;

void setup(){
pinMode(LED, OUTPUT);
pinMode(BOTON, INPUT);
}

void loop(){
  if(!digitalRead(BOTON)){
    MODO = MODO_ESPERA;
    tiempo=millis();
  }
  else{
    switch(MODO){
      case SUBE:
        BRILLO = min (BRILLO++, 255);
        break;
     
      case BAJA:
        BRILLO = max (BRILLO--, 0);
        break;
     
      case ON:
        BRILLO = 255;
        break;
           
      case OFF:
        BRILLO = 0;
        break;
     
      default:
        if ((millis() - tiempo > 1) && (millis() - tiempo < 500))
          MODO = ((BRILLO == 0) ? ON : OFF);
        else if (millis() - tiempo > 500)
          MODO = ((BRILLO == 255) ? BAJA : SUBE);     
    }
  }
  analogWrite(LED,BRILLO);
  delay(10);
}


Enciende y apaga pero no regula... ¿por que?  =( =( =( =( =( =(

Edito:
Creo que ya se el porque. En el momento justo que pulso el botón cambia de estado y la programación se mete en el switch por eso no le da tiempo a reconocer el tipo de pulsación..

Edito:
Nada, que no hay manera, lo máximo que consigo es control ON/OFF o dimmer, pero las dos funciones en un mismo botón no me sale. Si lo hago solo función dimmer (sin ON/OFF) el retardo de la pulsación si que lo tiene en cuenta antes de empezar a regular.

Edito de nuevo:
juanpintom ahora releyendo me acabo de dar cuenta que lo que yo estoy haciendo es prácticamente lo mismo que me habías puesto tu antes, pffff, menudo jaleo de cabeza que llevo.
Estoy probando tu código también (el ultimo que me has subido) y hace lo mismo que el mio, solo control ON/OFF, pero no hace la función dimmer (no le termino de pillar el punto yo a los millis()).

Saludos
Title: Re: Duda función millis en domotización para el apagado de un display
Post by: juanpintom on Mar 21, 2014, 10:26 pm

Vale, creo que ya lo voy pillando. Si pusiera, por ejemplo, void escena1() y en loop con un pulsador llamara a esta escena, esta no devuelve respuesta. esto lo podría usar por ejemplo para un apagado general o cualquier otra cosa que no espere ningún tipo de respuesta.

Pero si pusiera "byte dimmer ()" y dentro de esta función declarara la función del dimmer  y al final del todo pusiera "return estadodimmer" podría usar la respuesta que me devuelve para mostrar en el LCD el nivel de regulación al que esta funcionando el LED.

Es un poco lió la estructura pero solo es cuestión de practicarla unas cuantas veces para cogerle el punto.

Correcto, esa es la idea de las funciones, y tienen mucho mas potencial.


La regulación ascendente la hará paso a paso, pero la descendente de dos en dos. ¿No?

Eso es


Code: [Select]
  default:
    byModo = ( ( byBrillo == 0 ) ? MODO_ARRIBA : MODO_ABAJO );

Esta linea es equivalente a:
    if (byBrillo == 0) byModo = MODO_ARRIBA; else byModo = MODO_ABAJO;

Por lo que la respuesta a tu prengunta (":") seria (else)


Si yo le asigno un valor a una variable dentro de un if, el valor que esta tome se mantendrá hasta que yo lo cambie en algún momento del loop.

Eso es, asi unicamente cuando el boton se levante, esas variables se pondran de nuevo a false.


juanpintom, tienes una cerveza (cafe o lo que sea) pagada cuando quieras ;)

Jaja, hecho!, Salu2
Title: Re: Duda función millis en domotización para el apagado de un display
Post by: Dabauza on Mar 21, 2014, 10:37 pm
Muchas gracias por tus respuestas juanpintom,

Al final he decidido probar a ver si conseguía sacarlo con dos botones en vez de con uno (uno para ON/OFF y otro para regular) y así si que me funciona.

Code: [Select]
#define LED 2
#define BOTON1 51
#define BOTON2 53

#define ESPERA1     0
#define ESPERA2     0
#define ON          1
#define OFF         2
#define SUBE        1
#define BAJA        2

byte BRILLO = 0;
byte MODO1 = ESPERA1;
byte MODO2 = ESPERA2;

unsigned long tiempo;
int retardoPulsacion = 500;

void setup(){
pinMode(LED, OUTPUT);
pinMode(BOTON1, INPUT);
pinMode(BOTON2, INPUT);
}

void loop(){
  if(!digitalRead(BOTON1)){
    MODO1 = ESPERA1;
  }
 
  else{
    switch(MODO1){     
    case ON:
      BRILLO = 255;
      break;
             
      case OFF:
      BRILLO = 0;
      break;   
   
      default:
          MODO1 = ((BRILLO == 0) ? ON : OFF); 
    }   
  }
 
  if(!digitalRead(BOTON2)){
    MODO2 = ESPERA2;
  }
  else{
    switch(MODO2){
      case SUBE:
        BRILLO = min (BRILLO++, 255);
        break;
       
      case BAJA:
        BRILLO = max (BRILLO--, 0);
        break;       
       
      default:
          MODO2 = ((BRILLO == 0) ? SUBE : BAJA);     
    }
  }
  analogWrite(LED,BRILLO);
  delay(10);
}


Así que voy a seguir probando a ver por que no me va con un solo pulsador, buscando he encontrado esta función "pulseIn":

http://arduino.cc/es/Reference/PulseIn#.UyyvBPl5NyU

Parece ser que sirve para medir el tiempo que esta pulsado un botón. La estoy probando ahora a ver si con esta si que consigo sacarlo.

Un saludo
Title: Re: Duda función millis en domotización para el apagado de un display
Post by: juanpintom on Mar 21, 2014, 10:43 pm

Asi es como lo tengo de momento:

Code: [Select]
#define LED 2
#define BOTON 53

#define MODO_ESPERA 0
#define SUBE        1
#define BAJA        2
#define ON          3
#define OFF         4

byte BRILLO = 0;
byte MODO = MODO_ESPERA;

unsigned long tiempo;

void setup(){
pinMode(LED, OUTPUT);
pinMode(BOTON, INPUT);
}

void loop(){
 if(!digitalRead(BOTON)){
   MODO = MODO_ESPERA;
   tiempo=millis();
 }
 else{
   switch(MODO){
     case SUBE:
       BRILLO = min (BRILLO++, 255);
       break;
     
     case BAJA:
       BRILLO = max (BRILLO--, 0);
       break;
     
     case ON:
       BRILLO = 255;
       break;
           
     case OFF:
       BRILLO = 0;
       break;
   
     default:
       if ((millis() - tiempo > 1) && (millis() - tiempo < 500))
         MODO = ((BRILLO == 0) ? ON : OFF);
       else if (millis() - tiempo > 500)
         MODO = ((BRILLO == 255) ? BAJA : SUBE);      
   }
 }
 analogWrite(LED,BRILLO);
 delay(10);
}


Enciende y apaga pero no regula... ¿por que?  =( =( =( =( =( =(

Edito:
Creo que ya se el porque. En el momento justo que pulso el botón cambia de estado y la programación se mete en el switch por eso no le da tiempo a reconocer el tipo de pulsación..

Edito:
Nada, que no hay manera, lo máximo que consigo es control ON/OFF o dimmer, pero las dos funciones en un mismo botón no me sale. Si lo hago solo función dimmer (sin ON/OFF) el retardo de la pulsación si que lo tiene en cuenta antes de empezar a regular.

Edito de nuevo:
juanpintom ahora releyendo me acabo de dar cuenta que lo que yo estoy haciendo es prácticamente lo mismo que me habías puesto tu antes, pffff, menudo jaleo de cabeza que llevo.
Estoy probando tu código también (el ultimo que me has subido) y hace lo mismo que el mio, solo control ON/OFF, pero no hace la función dimmer (no le termino de pillar el punto yo a los millis()).

Saludos


Vale, es mi mala costumbre de escribir codigo y no probarlo xD ( lo siento pero no tengo ningun arduino libre xDD )

Lo que pasa en este caso es que efectivamente el switch case entra la primera vez en default: , y entrara en el "modo ON OFF", hasta ahi es normal, el problema viene cuando despues de entrar en modo ON-OFF quieres que al estar pulsado mas de x active el modo ARRIBA-ABAJO, seguramente asi tendras encendidos y apagados erraticos, y es dificil de entender (o dificil de explicar) prueba con este codigo, que no esta muy bien, y puede que tambien tenga fallos xD

Code: [Select]
#define PIN_LED 9
#define PIN_BOTON 2

#define MODO_ESPERA 0
#define MODO_ARRIBA 1
#define MODO_ABAJO  2

byte byBrillo = 0;
byte byModo = MODO_ESPERA;
unsigned long tiempo;

void setup()
{
 
  pinMode( PIN_LED, OUTPUT );
pinMode( PIN_BOTON, INPUT );

}

void loop()
{

if( !digitalRead( PIN_BOTON ) ) {
 
 byModo = MODO_ESPERA;
 if (millis() - tiempo < 500)
if ( byBrillo == 0 ) byBrillo = 255; else byBrillo = 0;
 
 tiempo = millis();

} else {

 switch( byModo ) {
 case MODO_ARRIBA:
   byBrillo = min( byBrillo++, 255 );
   break;
   
 case MODO_ABAJO:
   byBrillo = max( byBrillo - 2, 0 );
   break;

 default:
   if (millis() - tiempo > 500)
           byModo = ( ( byBrillo == 0 ) ? MODO_ARRIBA : MODO_ABAJO );
 }
   
    analogWrite( PIN_LED, byBrillo );  
    delay( 50 );

   }
}


Salu2
Title: Re: Duda función millis en domotización para el apagado de un display
Post by: Dabauza on Mar 21, 2014, 11:08 pm

Prueba con este codigo, que no esta muy bien, y puede que tambien tenga fallos xD


Nada, pasa lo mismo.

Déjalo, no te preocupes, que me sabe mal, te tengo aquí liado  :smiley-roll-sweat: Voy a seguir intentándolo yo e iré poniendo aquí lo que vaya viendo así si quieres puedes ir viéndolo por si te sirve para algo (o le sirve a cualquier otra persona).

Si tengo alguna duda o algo ya te aviso.

Muchas gracias

Saludos
Title: Re: Duda función millis en domotización para el apagado de un display
Post by: Dabauza on Mar 22, 2014, 03:00 am
No lo consigo, al final me parece que lo voy a dejar en botones independientes y cuanto tenga mas experiencia en esto ya lo revisare por que si no me parece que de aquí no salgo.

Voy a montarlo con el proyecto principal y a retocar unas cosas.
Title: Re: Duda función millis en domotización para el apagado de un display
Post by: JohnnyDeauville on Mar 27, 2014, 12:13 pm
Como veo, andas enfrascadísimo y aprendiendo, eso siempre está bien aunque cuesta muchos "palos" y equivocaciones, los que llevamos muchísimos años ya en esto -juer qué mayor que estoy, leñe-, tenemos vistas cosas que de primeras pasan por "bah, si da lo mismo" pero que a la larga ayudan, y mucho, a hacer buen código, y más comprensible hasta por uno mismo cuando lo ve después de tiempo sin haberlo tocado.

Una de mis "manías" que hacen que el código sea más claro es la que ya viste de utilizar las constantes en los #define con mayúsculas y siempre anteponiendo a qué grupo de datos está representando, de este modo, también podemos utilizar un mismo nombre para varias categorías, por ejemplo

Code: [Select]
#define PIN_TEMPERATURA  5

#define LIMITE_TEMPERATURA  25.0

de esta manera nunca te equivocas y permites más claridad en el código con coste mínimo -ten en cuenta que los #define no son más que una traducción del texto por el dato por parte del compilador, por lo que el consumo de memoria lo va a hacer el dato y no su nombre simbólico, que puede así ser todo lo largo que tú quieras, sin escribir El Quijote-

utilizar, siempre que puedas, switch y si no lo ves del todo claro, inicializa una variable que te permita usarlo, el uso de if else if else if... hace el código superengorroso de entender; por supuesto, no hay que volverse loco, si no se puede, no se puede

Para el asunto que te han comentado de ejecutar algo cada cierto tiempo, sin necesidad de más productos ni cosas, lo suyo es utilizar variables testigo, que permitan controlar el tiempo transcurrido tras la activación de algo -el que has pulsado un botón por ejemplo- y evitar que se repita ese proceso hasta que tú quieras, algo del estilo

Code: [Select]


// Cuando pulsamos un botón queremos 0.1 segundos de inactividad del botón hasta el próximo proceso
#define BOTON_ESPERA  100 
#define BOTON_MINIMO  20

long lComienzo;

void setup() {
   lComienzo = 0; 
}

void accionBoton() {
   Serial.print( "Pulsación de botón" );
   Serial.print( lComienzo, DEC );
}

void loop() {

  int iBoton;
 
  iBoton = analogRead( A0 );
 
  if( IBoton > MINIMO_BOTON && lComienzo == 0 ) {
    // Solo si se ha pulsado un botón y había pasado el tiempo suficiente se realiza la acción solicitada
    lComienzo = millis();
    accionBoton();
  }
 
  // Si se había pulsado un botón y pasó el tiempo requerido, se descarga la variable testigo
  if ( lComienzo != 0 && millis() - lComienzo >= BOTON_ESPERA ) lComienzo = 0;
 
}



No sé, si se me ocurre alguna otra charleta de Agüelo Cebolleta, ya te la haré llegar
Title: Re: Duda función millis en domotización para el apagado de un display
Post by: Dabauza on Mar 27, 2014, 02:45 pm
Muchas gracias JohnnyDeauville por tus consejos.

La verdad es que creo que mi código ha mejorado mucho en la ultima semana :) ahora hasta mas o menos se entiende XD. Al final consegui sacar el dimmer con un solo botón y ademas le he añadido un mando a distancia, anoche también estuve terminandolo y organizandolo un poco.

Tengo que practicar el switch por que la verdad que se me hace mas fácil hacerlo con if else.

Voy a abrir un nuevo tema en la sección de proyectos y lo voy a poner allí (por si te quieres pasar a verlo) así si a alguien le hace falta puede verlo.

Un saludo