jueves, 7 de diciembre de 2017

EL PROGRAMA DEL RGB

Bueno, Angel Marco, nos ha enviado el programa del RGB. Como podeis ver, está muy bien comentado, muy organizado y utilizando todo lo que sabemos.
No quiero que este programa sea para no estudiar, si no todo lo contrario. Es cierto que esperaba un programa mejorable, para proponer mejoras, pero es lo que hay, un programa casi inmejorable con lo que sabemos.
Por lo menos, espero que lo analiceis, porque el próximo día lo analizaremos entre todos.






#define R 2  // DEFINO LAS ENTRADAS SALIDAS 2,3,4 como los colores conectados
#define G 3
#define B 4
void ROJO(); // defino los subprogramas de cada uno de los colores y abajo cada color le hago su programa para que de el color correspondiente
void NEGRO();
void AZUL ();
void VERDE ();
void AMARILLO();
void MAGENTA ();
void CIAN () ;
void BLANCO ();
byte x =0;  //defino una variable que va a ir sumando uno cada vez que se pulse la entrada 5

void setup()
{

 // Declaro las salidas, pins para las salidas del RGB
  //Declaro la entrada 5 para el pulsador y la variable a que sera el contador de pulsadiones

pinMode (R, OUTPUT);
pinMode (G, OUTPUT);
pinMode (B, OUTPUT);
pinMode (5, INPUT);

}

void loop()
{

  if (digitalRead (5))  //Si se pulsa la entrada 5, pulsador,  hay un pequeño delay para evitar rebotes,
    {
      delay (200);
      x++;  //  luego sumo uno a la variable y comprobamos cada valor de la variable correponde a un color
      if (x==0) (NEGRO ());
      if (x==1) (ROJO ());
      if (x==2) (VERDE ());
      if (x==3) (AZUL ());
      if (x==4) (MAGENTA ());
      if (x==5) (CIAN ());
      if (x==6) (AMARILLO ());
      if (x==7) (BLANCO ());
      if (x==8)
       {
        NEGRO (); // cuando la variable ha llegado a 8 hay que ponerla a cero
       x =0;
       }
   
  }
}

void ROJO ()  // aquí hago un subprograma para cada color
{
 digitalWrite (R,1);
 digitalWrite (G,0);
 digitalWrite (B,0);
 }

void VERDE ()
{
 digitalWrite (R,0);
 digitalWrite (G,1);
 digitalWrite (B,0);
}
void AZUL ()
 {
 digitalWrite (R,0);
 digitalWrite (G,0);
 digitalWrite (B,1);
 }
void NEGRO ()
{
 digitalWrite (R,0);
 digitalWrite (G,0);
 digitalWrite (B,0);
 }
void MAGENTA ()
{
 digitalWrite (R,1);
 digitalWrite (G,0);
 digitalWrite (B,1);
}
void CIAN ()
{
 digitalWrite (R,0);
 digitalWrite (G,1);
 digitalWrite (B,1);
 }
void AMARILLO ()
{
 digitalWrite (R,1);
 digitalWrite (G,1);
 digitalWrite (B,0);
 }

 void BLANCO ()
  {
 digitalWrite (R,1);
 digitalWrite (G,1);
 digitalWrite (B,1);
 }



8 comentarios:

  1. Aprovecho para dar un consejo. Se puede ver en el programa que los #define los escribe en mayúsculas, y las funciones o subprogramas como los llama, también en mayúsculas. Yo suelo escribir los #define en mayúsculas, y los nombres de funciones con la primera en mayúscula, para diferenciar, pero está claro que es libre, cada maestrillo su librillo.
    Un método que si os acostumbrais es bueno es el siguiente:
    #define NUMERO 5
    void NumerO();
    int Numero;
    De esta forma diferenciamos la finalidad de cada nombre que nos encontramos en nuestro programa, a la vez que podemos usar el mismo nombre para varias cosas.

    Un saludo.

    ResponderEliminar
  2. Este programa, nos viene ni que pintado para la próxima clase, para las nuevas cosas que vamos a aprender. Una clase entera con este programa, así que aprenderlo bien.

    ResponderEliminar
  3. Una duda,
    Estos void:
    void NEGRO();
    void AZUL ();
    void VERDE ();
    void AMARILLO();
    void MAGENTA ();
    void CIAN () ;
    void BLANCO ();

    Hay ue declararlos??

    ResponderEliminar
    Respuestas
    1. Se pueden declarar antes, o declarar al escribir la función. Declarar las funciones al principio es interesante para la organización, puesto que sabremos de que funciones disponemos en un programa. Por otro lado el próximo día veremos cosas interesantes sobre las funciones donde veremos la diferencia entre declararlas o no declararlas al principio.

      Eliminar
    2. Ya tengo ganas de conocer la diferencia!!

      Eliminar
  4. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  5. Yo en vez de enfocar el programa por lineas, me he centrado en las columnas (bits, pensando en el contador digital 0 0 0 ).

    Este es mi código:

    #define PULSADOR 7 // Número del PULSADOR digital
    #define AZUL 8 // Pin del color azul
    #define ROJO 9 // Pin del color rojo
    #define VERDE 10 // Pin del color verde

    bool ESTADO; //Declaro el estado del led en una variable y la inicializo con Bool
    int CONTADOR=1; // Usaremos esa variable para llevar la cantidad de pulsaciones que estamos realizando.
    // Le doy valor 1 ya que siempre empieza por defecto con la luces apagadas y esa es el valor 0
    // De esta manera cuando pulsemos por primera vez el pulsador, CONTADOR ya estará a 1

    void setup() {
    pinMode(PULSADOR, INPUT); // Definimos el PULSADOR como entrada
    pinMode(ROJO, OUTPUT); // Definimos los pines del led RGB como salida
    pinMode(AZUL, OUTPUT);
    pinMode(VERDE, OUTPUT);
    }

    void loop(){
    if (digitalRead(7)) { // Capturamos la pulsación
    delay(300); //Esperamos 300ms para evitar los rebotes
    if (CONTADOR >7){ //Como son 3 bit,2^3 son 8 posibles combinaciones 0,1,2...7, en caso de ser 8 entramos en la codición
    CONTADOR=0; // Si hemos pulsado mas de 7 significa que hemos alcanzado todas las posibilidades y debemos comenzar de nuevo, reiniciamos CONTADOR
    }
    ESTADO=digitalRead(AZUL); // Capturamos el estado del pin que contiene el led azul
    digitalWrite(AZUL, !ESTADO); // Le ponemos el estado contrario, ya que este pin cambia de estado cada pulsacion de manera periodica, seria el primer bit
    if ((CONTADOR==2) || (CONTADOR==3) || (CONTADOR >5) && (CONTADOR <8)){ //Este pin debe cambiar solamente a estado HIGH cuando el contador tenga estos valores, seria el segundo bit
    digitalWrite(ROJO, HIGH);
    }
    else
    {
    digitalWrite(ROJO, LOW); // Si no tiene lo valores indicado en CONTADOR lo apagamos
    }
    if (CONTADOR >3){ // Este pin solo debe ponerse en HIGH a partir de la 4 pulsación, seria el tercer bit
    digitalWrite(VERDE, HIGH);
    }
    else
    {
    digitalWrite(VERDE, LOW);
    }
    CONTADOR++; //Incremetamos en 1 el valor de la pulsación
    }
    }

    ResponderEliminar
    Respuestas
    1. Esto demuestra que hay un código para cada programador para un mismo programa. En este caso se centra más en los bits de los números. Hemos hablado poco de este tema, pero profundizaremos, puesto que como ha demostrado el amigo Luis, es una forma muy efectiva de programar. Lo único, es que el tema del contador BCD, igual no lo conocen los demás compañeros.
      Gracias Luis por esta aportación.

      Eliminar