Libro Arduino para jovenes y no tan jovenes

Hola.
Estoy realizando practicas que vienen en el libro titulado:
Arduino para jovenes y no tan jovenes
De las cuales tengo dudas y que en el libro no vienen bien explicadas, creo este tema por si a alguien le ocurre lo mismo y poder ayudarnos.
Pues bien comienzo yo, en la practica Semaforo para peatones cuyo codigo es el siguiente:

const byte buttonPin = 4; // pin para el boton
const byte redLedPin = 5; // pin para el led rojo
const byte yellowLedPin= 6; // pin para el led amarillo
const byte greenLedPin = 7; // pin para el led verde
const byte personLedPin = 13; // pin para led peatones
int lightStatus = 0;

void setup() {
 pinMode(personLedPin, OUTPUT);
 pinMode(redLedPin, OUTPUT);
 pinMode(yellowLedPin, OUTPUT);
 pinMode(greenLedPin, OUTPUT);
 // configuracion para el pulsador
 pinMode(buttonPin, INPUT);
 digitalWrite( buttonPin, HIGH); // se activa la resistencia pull-up
}

void loop() {
if (!digitalRead(buttonPin)){//si se pulsa
  lightStatus=0; // se fuerza a rojo para coches
}

// dependiendo de la luz que se debe mostrar tiene distintos parámetros la llamada
switch (lightStatus){
  case 0: //Rojo
  showLight(redLedPin, 3000); // 3 segundos
  break;
  case1: // verde
  showLight(greenLedPin, 2000); //2 segundos
  break;
  Case2: // amarillo
  showLight(lleyowLedPin, 1000); // 1 segundo
  break;
  /**
   *Enciende le led que se le indique.
   *Los parametros son el Led a encender y el tiempo que debe de estar encendido
   */
  void showLight( int ledPin, int maxTime){
    static int lastPin =0;// ultimo led encendido
    static unsigned long startTime=0; // tiempo desde que se encendio el Led
    /*si el led actualmente encendido no concuerda con el que se debe encender
     * entonces apagar el led encendido, encender el nuevo y poner el contador de tiempo a 0*/

     if (ledPin !=lastPin){
//mirar el semaforo de peatones
if (ledPin == redLed Pin){
  //si es rojo para coches, es verde para peatones
  DigitalWrite (personLedPin, HIGH);
}else {
  digitalWrite(personLedPin; LOW);
}
startTime=millis();
digitalWrite(lastPin, LOW);
lastPin= ledPin;
digitalWrite(ledPin, HIGH);
delay(5); // para garantizar la estabilidad 
}
 unsigned long elapsedTime= millis()-starTime; // tiempo pasada desde que se encendio el led
 if ( (elapsedTime) > maxTime) {// si es mayor que lo esperado, pasar al siguiente ciclo de led
  lightStatus++;
  if (ligtStatus > 2) lightStatus=0;// solo hay 3 led, comenzamos de nuevo por el 0
 }
  }
}
}

al verificar me dice:
Arduino:1.8.19 (Windows 10), Tarjeta:"Arduino Mega or Mega 2560, ATmega2560 (Mega 2560)"

C:\Users\manol\OneDrive\Documentos\Arduino\Semaforo\Semaforo.ino: In function 'void loop()':

Semaforo:27:3: error: 'showLight' was not declared in this scope

showLight(redLedPin, 3000); // 3 segundos

^~~~~~~~~

Semaforo:33:13: error: 'lleyowLedPin' was not declared in this scope

showLight(lleyowLedPin, 1000); // 1 segundo

         ^~~~~~~~~~~~

C:\Users\manol\OneDrive\Documentos\Arduino\Semaforo\Semaforo.ino:33:13: note: suggested alternative: 'yellowLedPin'

showLight(lleyowLedPin, 1000); // 1 segundo

         ^~~~~~~~~~~~

         yellowLedPin

Semaforo:39:43: error: a function-definition is not allowed here before '{' token

void showLight( int ledPin, int maxTime){

                                       ^

exit status 1

'showLight' was not declared in this scope

Has copiado mal unas cuantas cosas:

  • Algunos nombre de variables los has escrito mal.

  • En el switch los case estaban mal escritos.

  • El error más gordo ha sido definir la funcion showLight dentro del cuerpo del loop, empezando ahí los errores empiezan a crecer en mansalva.

Te recomiendo que repases el código que has escrito lentamente, busca nombres
raros, secuencias raras, y sobretodo mira como puedes sacar la función de
dentro del loop, ojo con las llaves y los punto y coma.

De todas formas aquí esta corregido, solo que te recomiendo que intentes corregirlo en base a lo que te he dicho.

const byte buttonPin = 4; // pin para el boton
const byte redLedPin = 5; // pin para el led rojo
const byte yellowLedPin = 6; // pin para el led amarillo
const byte greenLedPin = 7; // pin para el led verde
const byte personLedPin = 13; // pin para led peatones
int lightStatus = 0;


void setup() {
  pinMode(personLedPin, OUTPUT);
  pinMode(redLedPin, OUTPUT);
  pinMode(yellowLedPin, OUTPUT);
  pinMode(greenLedPin, OUTPUT);
  // configuracion para el pulsador
  pinMode(buttonPin, INPUT);
  digitalWrite( buttonPin, HIGH); // se activa la resistencia pull-up
}

void showLight( int ledPin, int maxTime) {
  static int lastPin = 0; // ultimo led encendido
  static unsigned long startTime = 0; // tiempo desde que se encendio el Led
  /* si el led actualmente encendido no concuerda con el que se debe encender
     entonces apagar el led encendido, encender el nuevo y poner el contador de tiempo a 0*/
  if (ledPin != lastPin) {
    //mirar el semaforo de peatones
    if (ledPin == redLedPin) {
      //si es rojo para coches, es verde para peatones
      digitalWrite (personLedPin, HIGH);
    }
    else {
      digitalWrite(personLedPin, LOW);
    }
    startTime = millis();
    digitalWrite(lastPin, LOW);
    lastPin = ledPin;
    digitalWrite(ledPin, HIGH);
    delay(5); // para garantizar la estabilidad
  }
  unsigned long elapsedTime = millis() - startTime; // tiempo pasada desde que se encendio el led
  if ( (elapsedTime) > maxTime) {// si es mayor que lo esperado, pasar al siguiente ciclo de led
    lightStatus++;
    if (lightStatus > 2) lightStatus = 0; // solo hay 3 led, comenzamos de nuevo por el 0
  }
}

void loop() {
  if (!digitalRead(buttonPin)) { //si se pulsa
    lightStatus = 0; // se fuerza a rojo para coches
  }

  // dependiendo de la luz que se debe mostrar tiene distintos parámetros la llamada
  switch (lightStatus) {
    case 0: //Rojo
      showLight(redLedPin, 3000); // 3 segundos
      break;
    case 1: // verde
      showLight(greenLedPin, 2000); //2 segundos
      break;
    case 2: // amarillo
      showLight(yellowLedPin, 1000); // 1 segundo
      break;
  }
}

hola @lolo2n3055 recuerda que los errores deben postearse del mismo modo que los códigos. Lee las normas del foro si tienes dudas.

Mi enfoque será el de darte herramienta para entender cómo leer los errrores y saber qué hacer!!

Semaforo:27:3: error: 'showLight' was not declared in this scope

Si llevas la frase importante a Google Translate te dirá

'showLight' no fue declarada en este ámbito
Las posibles razones son:

  1. howLight no existe
    No es el caso, esta definido.

  2. esta mal escrito
    Tampoco es el caso, esta bien escrito.

  3. Entonces?
    Cuando estos dos puntos anteriores no resuelven el problema uno debe mirar su sintaxis.
    O sea, he puesto las llaves que abren y cierran cada void, if, switch?
    En tu caso no.
    Al final del case 2

      Case2: // amarillo
              showLight(lleyowLedPin, 1000); // 1 segundo
              break;
      /**
        Enciende le led que se le indique.
        Los parametros son el Led a encender y el tiempo que debe de estar encendido

      */
void showLight( int ledPin, int maxTime) {

te falta una llave que cierra el switch y otra para cerrar el loop
Por qué ocurre esto? Por no usar identación o sangría. Algo que en el IDE se resuelve con facilidad con AUTOFORMATO
Cuando las cosas estan debidamente identadas uno VE el código mejor.
Cuando lo pone pegado a la izquierda se te pasan las cosas.
Claramente estas comenzando pero la prolijidad ayuda siempre y este es un buen ejemplo.

Luego tienes que pones las dos llaves surge otro error

32:25: error: 'lleyowLedPin' was not declared in this scope

lleyowLedPin no existe y ahora si NO EXISTE.
es yellowLedPin el nombre correcto.
Pero ya tienes herramientas para resolver los problemas que se presentes.

Y de nuevo un error

50:19: error: 'redLed' was not declared in this scope
     if (ledPin == redLed Pin) {

no es redLed Pin sino redLedPin no puedes usar nombres de variables separados por espacios.

Bueno y asi siguen.. porque has cometido muchos errores similares.
Te dejo los demás para que aprendas.

La recomendación final de @victorjam es la que debes tener en cuento.

Antes de nada agradecer vuestro interés y tiempo dedicado a ayudarme.
A ti victorjam me dices que no he definido la funcion showLight dentro del cuerpo del loop ( a mi también me resulto raro el que no se declarase al principio con las demás variables) pero así viene en el libro, adjunto fotos del libro.

A ti Surbyte , primera vez que entro en este foro, te prometo que me las leo.
¿Dónde se define showLight ? desde mi ignorancia pensaba que se definían al principio del sketch antes del void Setup
Buen consejo eso de usar identación o sangría a partir de ahora usare AUTOFORMATO ya que no lo conocía.
En resumen si que he copiado mal del libro, la verdad que hay muchos errores, tanto símbolo así de primera me a resultado difícil, tendré que revisar mejor.
Aparte de esto algún consejo para aprender Arduino? lo pregunto porque con un libro en caso de duda, no hay a quien preguntar y viendo videos de Youtube a parte de copia y pega ( cosa de la que no se aprende) no se sigue un orden. Podéis darme algún consejo para ir empezando.
Muchas gracias por vuestra ayuda.

Al contrario, te dice que el error es que la declaraste dentro del loop()

Pero fue debido al error de tipeo (el olvido de 2 llaves) que provocó que quedase dentro de loop().

El compilador de Arduino permite que las declaraciones de funciones estén antes o después de setup() y loop(), e incluso entre ambas.

Saludos

Todo libro de un tiempo a esta parte tiene un agregado (CD o pagina web) desde donde puedes encontrar directamente los ejemplos ahi citados. Revisa si no es tu caso tmb.

Practica montada en protoboard y funcionando.
Alguien me puede explicar como funciona esta linea:

La cual detecta si el boton a sido pulsado.
Me lio con el símbolo ! que según tengo entendido es : Desigualdad, compra si son distintos, devuelve true si son distintos y false si son iguales.

Mira si el boton a sido pulsado pero con que lo compara para saber si es igual o no?

Otra cosa, se esta ejecutando por ejemplo esta linea:

Y esta esperando los 2 segundos como es posible que a la vez, se este mirando, si a sido pulsado o no el pulsador, que yo sepa el microprocesador solo puede hacer una cosa a la vez.
Gracias.

El símbolo "!" es negación.
La desigualdad es "!=" que podría decirse tranquilamente "no igual". ¿Se entiende?

Ahora los condicionales siempre se cumplen cuando la condición es verdadera, ¿de acuerdo?
Entonces la forma abreviada

if(variable){

equivale a

if(variable == true){

análogamente para

if(variable == false){

podemos usar la negación y escribirlo abreviado

if(!variable){

ya que si variable contiene el valor false al negarla obtenemos true y se cumple la condición.

Agrego: digitalRead() puede devolver 2 valores, HIGH o LOW que equivalen a 1 ó 0, respectivamente, al igual que true y false. Entonces

if(!digitalRead(x)){

equivale a

if(digitalRead(x) == false){ // o LOW ó 0

Porque la rutina showLight no usa delay sino milllis() y entonces testea si ha pasado el tiempo pero devuelve el control al programa para que este atento a otros cambios incluido teclas, BT, pantalla lo que sea.
Esta es la gran diferencia entre programar a lo bestia usando delay y programar de manera fluida.
Te lo digo de una manera salvaje para que se entienda.
Ya que estas aprendiendo olvida todo lo que use delay() salvo que sean pequeños y que no esten anidados, o sea que no esten en un cliclo donde se terminan acumulando y creando un delay mas grande.