Duda de iniciado

haber tengo un pequeño problemilla y es q ya hice el blink y salia bien e iba a empezar con los leds.
queria encender e incrementar de intensidad un led con codigo per este no me funciona

/*
Variamos luminosidad
*/

const int ledPIN = 9;
 
byte outputValue = 0;  
 
void setup()
{  
   Serial.begin(9600);         // Iniciar puerto serie
}
 
void loop() 
{
   if (Serial.available()>0){   // Si hay datos disponibles
       outputValue = Serial.read();   // Leemos la opción
     outputValue -= '0';      // Restamos '0' para convertir a un número
     outputValue *= 25;      // Multiplicamos x25 para pasar a una escala 0 a 250
     analogWrite(ledPIN , outputValue);
   }
}

no se si es por el codigo o por las conexiones q adjunto en imagen
q hago mal?

Vamos por partes:

  • ¿Entiendes que hace ese código?
  • Si el blink te funcionó tuviste que usar el pinMode() cosa que no hay en ese código ¿Estas copiando y pegando sin entender?
  • Esta línea: outputValue -= '0'; // Restamos '0' para convertir a un número, préndele fuego, o siendo más pacíficos no le hagas ni caso. Restar chars no es una conversión de tipo de variable.
  • Para aprender las bases están los libros de Arduino (como el propio de proyectos) gratis en internet e incluso estos ejemplos simples los encuentras yendo en el Menú; Archivo-> ejemplos -> basic
  • Cuando se aprende no nos vamos a internet a copiar lo que hace una persona que no conocemos de nada su formación o lo bien /mal que programa, primero debemos aprender NOSOTROS (para algo existe una documentación de cada lenguaje en las páginas oficiales)
  • Lo siento en la imagen no se puede apreciar bien el circuito, así que ahí no entro
  • Tira ese código a la papelera de reciclaje de tu ordenador.

Cambiar la intensidad de un led se hace con analogWrite(). No hay más.

byte led = 9;

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

void loop() {
  analogWrite(led,15); //valores entre 0 y 255, siendo 0 apagado y 255 máxima luz. Cambiar al gusto
}

Ahora bien, si lo que tu quieres es cambiar el valor poniendo por Serial el número puedes hacer algo así.

byte
led = 9,
valor = 0;

String cadena = "";

void setup() {
  Serial.begin(9600); 
  pinMode(led, OUTPUT);
}

void loop() {
  if(Serial.available()){
    char c = Serial.read();
    if(isDigit(c)){
      cadena += c;
      Serial.println(c);
    }else if(c == '\n'){
      Serial.println(cadena);
      valor = constrain(cadena.toInt(),0,255);
      cadena = "";
    }
    delay(15);
  }
  analogWrite(led,valor);
}

Si no entiendes algo pregúntalo, y mi consejo, que lo repito hasta la saciedad. Si copian y copian de quienes no saben NADA y luego el ejercicio está mal ¿Qué hacen? No siempre en los foros se les va a hacer la "tarea", no sólo no es la función del mismo sino que de hecho considera esto una excepción por mi parte.

Es muuuuuuucho más rápido ver la documentación del lenguaje, leer el libro de Arduino y ya entendiendo las bases sabemos si lo que copiamos tiene sentido o NO.

Si copias lo que yo te doy sin más y no lo entiendes cuando quieras ir un paso más allá no vas a poder. La programación es estudiar, no copiar. Si no sabes de mecánica no puede copiar lo que haga alguien en un vídeo, antes revisa por ti mismo que no sea una chapuza y lo acabes repitiendo.

Saludos.

Arduinito:
Vamos por partes:

  • ¿Entiendes que hace ese código?
  • Si el blink te funcionó tuviste que usar el pinMode() cosa que no hay en ese código ¿Estas copiando y pegando sin entender?
  • Esta línea: outputValue -= '0'; // Restamos '0' para convertir a un número, préndele fuego, o siendo más pacíficos no le hagas ni caso. Restar chars no es una conversión de tipo de variable.
  • Para aprender las bases están los libros de Arduino (como el propio de proyectos) gratis en internet e incluso estos ejemplos simples los encuentras yendo en el Menú; Archivo-> ejemplos -> basic
  • Cuando se aprende no nos vamos a internet a copiar lo que hace una persona que no conocemos de nada su formación o lo bien /mal que programa, primero debemos aprender NOSOTROS (para algo existe una documentación de cada lenguaje en las páginas oficiales)
  • Lo siento en la imagen no se puede apreciar bien el circuito, así que ahí no entro
  • Tira ese código a la papelera de reciclaje de tu ordenador.

Cambiar la intensidad de un led se hace con analogWrite(). No hay más.

byte led = 9;

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

void loop() {
  analogWrite(led,15); //valores entre 0 y 255, siendo 0 apagado y 255 máxima luz. Cambiar al gusto
}




Ahora bien, si lo que tu quieres es cambiar el valor poniendo por Serial el número puedes hacer algo así.



byte
led = 9,
valor = 0;

String cadena = "";

void setup() {
  Serial.begin(9600);
  pinMode(led, OUTPUT);
}

void loop() {
  if(Serial.available()){
    char c = Serial.read();
    if(isDigit(c)){
      cadena += c;
      Serial.println(c);
    }else if(c == '\n'){
      Serial.println(cadena);
      valor = constrain(cadena.toInt(),0,255);
      cadena = "";
    }
    delay(15);
  }
  analogWrite(led,valor);
}




Si no entiendes algo pregúntalo, y mi consejo, que lo repito hasta la saciedad. Si copian y copian de quienes no saben NADA y luego el ejercicio está mal ¿Qué hacen? No siempre en los foros se les va a hacer la "tarea", no sólo no es la función del mismo sino que de hecho considera esto una excepción por mi parte.

Es muuuuuuucho más rápido ver la documentación del lenguaje, leer el libro de Arduino y ya entendiendo las bases sabemos si lo que copiamos tiene sentido o NO.

Si copias lo que yo te doy sin más y no lo entiendes cuando quieras ir un paso más allá no vas a poder. La programación es estudiar, no copiar. Si no sabes de mecánica no puede copiar lo que haga alguien en un vídeo, antes revisa por ti mismo que no sea una chapuza y lo acabes repitiendo.

Saludos.

Arduinito arduinito el código que ha puesto no está mal para nada y funcionaria perfectamente, sólo tienes que introducir un número en el serial y al restar '0' lo estas efectivamente convierto a decimal (y si no lo entiendes abre un hilo para que te lo expliquemos los que si lo entendemos), y multiplicando por 25 consigues el efecto deseado: 0 led apagado , 9 totalmente encendido y el resto se números la salida se moverá en escalones de 25. No está para tirar a la basura como tu le has dicho al pobre aprendiz.

Si bien es cierto que le falta configurar el pin como salida

GO_zalo:
Arduinito arduinito el código que ha puesto no está mal para nada y funcionaria perfectamente, sólo tienes que introducir un número en el serial y al restar ‘0’ lo estas efectivamente convierto a decimal (y si no lo entiendes abre un hilo para que te lo expliquemos los que si lo entendemos), y multiplicando por 25 consigues el efecto deseado: 0 led apagado , 9 totalmente encendido y el resto se números la salida se moverá en escalones de 25. No está para tirar a la basura como tu le has dicho al pobre aprendiz.

Hola GO_zalo, voy a intentar explicarte, me alegro que me expliques el código. Ahora es mi turno dado tu comentario que entiendas a lo que me refiero. Lo puedes compartir o no.

GO_zalo:
Si bien es cierto que le falta configurar el pin como salida

Exacto, el ejemplo que ha copiado este usuario está MAL. Ha hecho un copy and paste de un blink y le fue bien lo hizo de este y no ¿A que voy entonces? Que cuando probamos cosas copiando pero no hemos leído las bases nos podemos atascar hasta en lo más elemental y no verlo por el hábito de que sea el control+v quien haga todo.

Sé que la gente se molesta cuando le dicen que no copien, que entiendan primero, pero ¿Decirlo es de sobrado o estás diciendo: - “Venga va, pon de tu parte porque los demás también se equivocan”? Yo creo que aquí se ve claro el ejemplo. Se copia un blink con pinMode y va bien, se copia otro que no lo tiene, como se está copiando sin más no se percata.


1) El autor del hilo ha usado un código de internet que está mal.

2) Me quejo del comentario y de esa línea porque lo que .read() da un byte de información. Tu puedes asignar ese valor a una variable char o variable byte.
¿Entonces si entendemos el código estamos cambiando algo? ¿“Conversión”? Es el comentario de al lado lo que no me gusta. Pero aparte de liarse por gusto, ¿Consideras que esa es la forma de hacerlo?

char c = Serial.read();
byte c = Serial.read();

Si tu estás empezando y lees que restando a una cadena “0” obtienes un “número” ¿Qué vas a entender?

3) Gracias por aclararme que hace el código, yo creo que si vi el fallo y pongo un ejemplo “algo” entiendo.

4) Su ejemplo más allá del error (o carencia) que tenía no permite valores como 89, 5 , 151, 255, por eso puse una forma para que supiese concatenar esos bytes.

5) Puedes abrir el hilo que quieras explicándome, yo creo que no me entendiste, así de simple.
Entra un byte, “no estás convirtiendo a número”. No sé si así me explico.

Saludos.

A ver Repasemos lo básico una variable tipo byte o char sirve para almacenar un número del 0 a 255

La manera que tu lo intérpretes si es como carácter o como un número decimal sólo depende de tu código.

El código que ha puesto no es tal y de eso me quejo, que el tuyo está mejor? Seguro, Felicidades ya eres mejor programador que uno que se hace llamar a si mismo 'iniciado'

Que lo ha copiado y que no lo entiende y todo ese rollo lo estas dando por hecho tu así que no se por que te molestas.

Es que hay mucha sobraderia en este foro y a veces lo que necesita uno es ser un poco más humilde

Comentario personal aparte

GO_zalo:
No está para tirar a la basura como tu le has dicho al pobre aprendiz.

Cuando en páginas webs o en vídeos la gente pone mal las cosas y la gente empieza a arrastrar el error, YO, repito (YO) tiraría esas cosas a la basura. Se puede corregir, pero mantenerlo subido con un error para que otros lo repitan no tiene sentido.

No te vayas ni al código, sino a las invenciones de términos. Decrement -> decrementar. La gente lo ve en los vídeos y se inventan hasta su propio idioma. Sí, para mí, todo eso debe ir a la basura si no se corrige, porque la gente repite como loros.

En fin, sé que ha sido una cuestión de semántica, yo no dije que no pudiera usarse el código arreglado el fallo que señalé, y lo del valor decimal puedes explicármelo :grin: pero :

LEE LITERALMENTE EL COMENTARIO:

"// Restamos '0' para convertir a un número"

El comentario es correcto '0' puesto entre comillas es 48 decimal el serial lee un '1' por ejemplo al restarle '0' se queda en 1 decimal

Enserio si no lo entiendes habré un hilo por que estas desviado el tema (o directamente no intentes meter baza de un tema que no entiendes)

GO_zalo:
A ver Repasemos lo básico una variable tipo byte o char sirve para almacenar un número del 0 a 255

La manera que tu lo intérpretes si es como carácter o como un número decimal sólo depende de tu código.

El código que ha puesto no es tal y de eso me quejo, que el tuyo está mejor? Seguro, Felicidades ya eres mejor programador que uno que se hace llamar a si mismo 'iniciado'

Que lo ha copiado y que no lo entiende y todo ese rollo lo estas dando por hecho tu así que no se por que te molestas.

Es que hay mucha sobraderia en este foro y a veces lo que necesita uno es ser un poco más humilde

Bueno me has llamado sobrado y si vas a juzgarme encantado pero el offtopic por privado. Esto va a cerrarse y se va a molestar conmigo surbyte (con razón).
He sido bastante tranquilo intentando explicarte que yo pido que lean, que si copian revisen y que esto cuando se empieza: "// Restamos '0' para convertir a un número" que lo olvide, que lo queme.

Señalé e rojo el comentario y dije quémalo, o mejor olvídalo. Supongo que sigues sin entender a que me refería :sleeping:

Es interesante porque yo soy el sobrado pero tú has estrado a este post no para colaborar sino para ¿Atacarme? Bueno Ciao. Que te vaya bien. No pretendo que entiendas lo que debido a mi profesión me puede molestar que copien lenguajes de otros en vez de aprender las bases con la documentación.

Sigo detestando ese comentario para ser un ejemplo a aquellos que empiezan.

GO_zalo:
El comentario es correcto '0' puesto entre comillas es 48 decimal el serial lee un '1' por ejemplo al restarle '0' se queda en 1 decimal

Enserio si no lo entiendes habré un hilo por que estas desviado el tema (o directamente no intentes meter baza de un tema que no entiendes)

Quien no quieres entender eres tú, quien hizo offtopic de cabeza tú también, diciendo que era un sobrado y que me ibas a explicar eres tú. No sé ni como me llamas a mí sobrado por estar en desacuerdo con el comentario del código cuando tú estás sobrepasándote. Enserio, todo el foro para ti, no puedo gastar mil post en tener que explicar a lo que me refiero mientras me insultas.

Como yo soy sobrado, no entiendo nada, necesito que me expliques y yo no he negado en ningún momento que no tengas razón... Pues alegría, supongo que tenías el día calentito. Me largo del foro. Adiós.

La próxima vez que llames a alguien sobrado... mira un poco tus insultos y las formas. Un poco patético tu reacción por quejarme de un comentario y recomendar que no copien todo.

Ya sabes cuando alguien empiece con Arduino y lea
// Restamos '0' para convertir a un número
Empezarán a preguntarse si esto es válido para todo...........

Y tú sigues sin entender a que me refiero...

Bueno Go_zalo y Arduino, a ver si nos calmamos!!!
Termina acá el tema okay!!
Conozco a los dos y se que tienen buenas razones, ahora no la sigan.