primeras dudas, muy extraño

Hola a todos. Como véis soy nuevo en este mundillo que debo decir que me gusta desde siempre y he empezado ahora a dar los primeros pasos.
Quería preguntaros un par de dudas que seguro que para vosotros son sencillas, pero después de haber estado ya haciendo las primeras pruebas del tipo de encender y apagar, desvanecer, etc. me ha surguido un pequeño problema que me trae loco porque no veo donde puede estar el fallo.
He cogido como base un ejemplo del propio arduino: encender y apagar con una pequeña pausa enmedio. Le he puesto un pulsador para que empiece solo cuando yo pulse. Y después de que encienda y apague le he metido el código para que haga un fading al led.
Pues bien, es imposible.
Resulta que cuando pulso el botón, está continuamente el led parpadeando y nunca entra en el fading.
He probado incluso creando una función y llamándola desde dentro del código, pero tampoco. No hay manera.
Si quito la parte que hace que parpadee el led, hace perfecto el fading, pero si meto la parte del parpadeo siempre se queda en esa parte y nunca entra en el fading.
Si me pudiérais decir dónde está el fallo os lo agradecería mucho.

This example shows how to fade an LED on pin 9
using the analogWrite() function.

This example code is in the public domain.
*/
int pulsador = 2;
int led = 9; // the pin that the LED is attached to
int brightness = 0; // how bright the LED is
int fadeAmount = 5; // how many points to fade the LED by

// the setup routine runs once when you press reset:
void setup() {
// declare pin 9 to be an output:
pinMode(led, OUTPUT);
pinMode(pulsador, INPUT);
}

// the loop routine runs over and over again forever:
void loop() {
// set the brightness of pin 9:
if (digitalRead(pulsador) == HIGH)
{
digitalWrite(led, HIGH);
delay(300);
digitalWrite(led,LOW);
delay(300);
analogWrite(led, brightness);

// change the brightness for next time through the loop:
brightness = brightness + fadeAmount;

// reverse the direction of the fading at the ends of the fade:
if (brightness == 0 || brightness == 255) {
fadeAmount = -fadeAmount ;
}
// wait for 30 milliseconds to see the dimming effect
delay(30);
}
}

Hola,
por qué no pruebas con el ejemplo "Fading", y luego lo vas modificando poco a poco?

Hola, perdón perdón !!.
El ejemplo de Fading es del que he partido. Me he dado cuenta cuando he leído tu mensaje que efectivamente lo he explicado al revés.
Lo que he hecho ha sido partir del ejemplo de fading y luego he ido añadiendo lo del parpadeo y el pulsador.
El pulsador me funciona perfecto siempre.
El parpadeo por separado con el pulsador funciona bien.
El fading por separado con el pulsador funciona bien también.
Pero al pedir que después de hacer el parpadeo entre en el fading, no lo hace. Lo único que hace es el parpadeo y al final se queda "enganchado". No hace nada más.

Perdón por el error de antes y muchas gracias por contestar.
A ver si me pudiérais echar una mano con un circuito tan sencillo pero que me está dando mucha guerra.

Hola otra vez.
Creo que tengo una pista que tal vez pueda ayudar a que me ayudéis con esto.
El problema viene dado por los "delay" del parpadeo.
He hecho el circuito de la forma más sencilla, con un solo led para que parpadee dos veces y luego entre en el fading y sigue dando problemas.
Si comento el parpadeo, el fading lo hace perfecto. Y si comento el fading el parpadeo lo hace bien. Si pongo todo junto solo hace el parpadeo.
PERO!, si quito solamente los delays del parpadeo pero dejo el resto del código del parpadeo, el fading también funciona!. De acuerdo que ese no es el funcionamiento que quiero porque sigo sin ver el parpadeo del principio. Pero está claro que lo que fastidia son los delays del parpadeo.
He seguido investigando y he puesto que el parpadeo se haga en el pin13 y el fading en el 11. Y el resultado es rarísimo :fearful::
resulta que el led del fading de la patilla 11 se va ejecutando con cada destello del parpadeo del led de la patilla 13. Es decir, empieza a incrementar y luego a decrementar un poco con cada parpadeo del otro led.
Ahí tiene que haber gato encerrado seguro!.
No sé si hay alguna norma que no conozca sobre que después de ejecutarse los delays el código regresa a alguna parte del código o yo qué se.
Ya véis que el circuito más sencillo, no puede ser :disappointed_relieved:.

Por favor, si alguien me puede arrojar algo de luz sobre esto se lo agradezco porque yo ya no sé qué más hacer. Y creedme que llevo haciendo un montón de pruebas todo el día.
Muchas gracias.

int led = 11; // the pin that the LED is attached to
int brightness = 0; // how bright the LED is
int fadeAmount = 5; // how many points to fade the LED by

void setup()
{
pinMode(led, OUTPUT);

}

void loop()
{
digitalWrite(led, HIGH);
delay(500);
digitalWrite(led,LOW);
delay(500);

analogWrite(led, brightness);
brightness = brightness + fadeAmount;
if (brightness == 0 || brightness == 125)
{
fadeAmount = -fadeAmount ;
}
delay(30);
}

Hola krilos. Existe una libreria poco conocida de Arduino llamada Scheduler

COn ella puedes ejecutar de forma independiente mas de un proyecto a al vez. Si puedes,
revisa el ejemplo 'MultipleBlinks' en el enlace de arriba para que veas como funciona.
Si como indicas, los dos modos del led funcionan bien por separado, deberian seguir funcionando si usas
la libreria que te indico. Solo la he usado una vez y me funciono bien y la veo como una alternativa al uso de interrupciones
que seria otra via a seguir pero algo mas compleja (a mi entender). Saludos!

Gracias Palliser pero acabo de probar ahora mismo y nada. También te digo que como soy muy novato en esto tampoco tengo yo muy claro si habré añadido bien la librería o lo que haya que hacer...
Pero lo que me dices de que sean dos proyectos distintos... Si es el mismo led en la misma patilla que le hago que parpadee y luego, después de una de las pausas, en lugar de parpadear nuevamente, pues que lea la siguiente linea que es un "if". Vamos, que debería ser de lo más sencillo aún siendo como dices dos proyectos, pero no entiendo por qué no me sale.
Madre mía, y no he hecho más que empezar con todo esto. Con lo contento que estaba yo porque ya había hecho pruebas con prácticas leyendo de la pantalla del "serial" y todo, jejeje.
Esto de que se atasquen las cosas así con la cosa más tonta es que me pone de una mala lecheeeeee.
No sé si será mucho pedir que alguien pudiera probar el circuito. Total, es un led directamente en la patilla 11 y ya está. Si es que no tiene más este puñetero circuito!. Cago en tó lo que se menea!!.
Gracias otra vez por contestar.

Ok, krilos. Solo anadi el else a tu if principal y ya esta funcionando en mi arduino como tu quieres.
Aqui te dejo el codigo. Cualquier duda o problema, solo hazlo saber. Saludos.

int pulsador = 2;
int led = 9;           // the pin that the LED is attached to
int brightness = 0;    // how bright the LED is
int fadeAmount = 5;    // how many points to fade the LED by

// the setup routine runs once when you press reset:
void setup()  {
  // declare pin 9 to be an output:
  pinMode(led, OUTPUT);
  pinMode(pulsador, INPUT);
}

// the loop routine runs over and over again forever:
void loop()  {
  // set the brightness of pin 9:
  if (digitalRead(pulsador) == HIGH)
  {
    digitalWrite(led, HIGH);
    delay(300);
    digitalWrite(led,LOW);
    delay(300);
  }
  else
  {
  analogWrite(led, brightness);   

  // change the brightness for next time through the loop:
  brightness = brightness + fadeAmount;

  // reverse the direction of the fading at the ends of the fade:
  if (brightness == 0 || brightness == 255) {
    fadeAmount = -fadeAmount ;
  }     
  // wait for 30 milliseconds to see the dimming effect   
  delay(30);                           
}
}

Gracias Palliser pero me temo que no es lo que busco.
Lo que quiero es que lo haga todo seguido. Incluso sin pulsador, como en el último ejemplo que he puesto. El pulsador lo puse para seguir practicando con cosas sencillas y así ir aprendiendo más cosas de las fáciles.
Lo que quiero es que lo haga todo seguido. Que el led parpadee unas cuantas veces y después que haga el fading. Después podría hacer tal vez otro fading más rápido y luego otra vez el parpadeo... . Una especie de luces de Navidad.
No sé, a primera vista es algo sencillo porque va todo el código seguido, sin llamadas a funciones ni operaciones raras.
A ver si alguien se anima y nos echa una mano que aquí al pobre ya lo tengo loco y yo nos quedamos sin ideas :smiley:
Por favor, no me puedo creer que nadie haya hecho algo parecido.

Muchas gracias otra vez Palliser.

Te entiendo. Solo dime como quieres la secuencia, es decir, cuanto tiempo entre para el fading, cuantos parpadeos por secuencia y
cuanto tiempo entre fading y parpadeos?
Es mas, si pudieras darnos un poco mas de detalles sobre tu idea o proyecto. Me suena como si quisieras crear luces psicodelicas o algo por el estilo. Saludos cordiales.

Ok Palliser.
Pues la secuencia sería sencilla. Sería lo que he puesto en el tercer mensaje. Pero entiendo que el funcionamiento que quiero no debería ser específico para un proyecto porque es tan básico que debería poder funcionar con cualquiera.
Es decir, hace un par de intermitencias y después se queda haciendo fading.

Otra cosa que creo entender de uno de tus mensajes anteriores es que no se pueden sacar varias salidas a la vez, verdad?.
Es decir, no se podrían hacer fading a la vez por las 6 salidas pwm?. Bueno, para esto se me ocurre que se vayan activando una a una con pequeños incrementos pero pasando muy rápidamente de una patilla a la otra. O sea, la 1ª salida pwm se encendería 5/255, luego la 2ª y así sucesivamente pasando de unas a otras hasta llegar a 255, verdad?.

Bueno esa es otra historia y ya me pegaré con ello más adelante.
Quiero ir poco a poco asentando bien las bases y resolviendo primero este otro tipo de problemas.

Vaya día llevo. Estoy en el trabajo y no hago más que pensar en que cada vez que quito los "delay" del "digitalWrite" el problema se soluciona. Así no hay quien trabaje, jajaja.

Gracias Palliser!!

Palliser?, hola?, alguien??. :~

Hola,
si le das tiempo para que recorra los distintos niveles (por ejemplo, 2 segundos cada vez), el fading funciona

long inicio;
void loop()  
{  
    digitalWrite(led, HIGH);
    delay(500);
    digitalWrite(led,LOW);
    delay(500);  
     
     inicio = millis();
     while(millis() - inicio < 2000L)
     {
        analogWrite(led, brightness);    
        brightness = brightness + fadeAmount;
        if (brightness == 0 || brightness == 125) 
        {
           fadeAmount = -fadeAmount ; 
        }     
      delay(30);
    }
}

Pero..... me cagüen la leche !!, qué me has liao !!??, que soy nuevo!! jaja.Es broma. :stuck_out_tongue_closed_eyes:
Muchas gracias de verdad por contestar pero ahora me surgen otras dudas. Has declarado una función (si me equivo, por favor dímelo) que se llama millis. Pero, cuánto vale?.
Qué es " long inicio " ?
Qué es " 2000L "?

Que conste que estoy intentando probarlo pero tengo que meter lo que me has dado enmedio del código donde tengo declarado lo demás y se me está quejando de algunas cosas y claro. De momento me cuesta encontrar los fallos.

Hola. Ya está !!.
Bueno, pues resulta que como buen novato no me había enterado de alguna que otra cosa básica.
Yo pensaba que cuando una sentencia de "if" no se cumple y el programa termina de recorrer el código, yo pensaba que se volvía a un paso antes de ese "if" y resulta que no. Que él sigue adelante. Por eso yo pensaba que volvía justo a seguir sumando para incrementar el brillo del led,y en cambio lo que hacía era continuar, terminar el programa y empezar rápidamente.

Muchas gracias a todos por vuestra imprescindible ayuda.
Hoy ya estoy más animado con esto, jejeje.
Saludos.

Hola,
veo que estás un poco verde en el lenguaje de programación. Para profundizar en C, yo siempre recomiendo ir haciendo los ejercicios del libro "The C Programming Language" de Kernighan y Ritchie, los inventores de dicho lenguaje.
zanasi.chem.unisa.it/download/C.pdf

Perfecto. Muchas gracias por la recomendación y por poner directamente el link.
Te aseguro que lo leeré.

Gracias otra vez a los dos por haberme ayudado!!.