Go Down

Topic: Solucionado Uso de mas de un pin para ejecutar un programa (Read 154 times) previous topic - next topic

car127

 La idea es que cuatro pines se ejecuten a la vez con un programa

Podría usarse algo así


Code: [Select]
#define maxleds 4 //creamos la variable maxleds de 4 elementos

int led[maxleds] = {3,4,5,6,}; //creamos un vector para los pines a utilizar

void setup ()
{
for (int i=0;i<maxleds;i++)

pinMode(led[i],OUTPUT); // El pines del 3 al 7 seran de salida
}


si usara el ejemplo de arriba seria algo así



Code: [Select]
#define Pleds 4 //creamos la variable leds de 4 elementos

int led[Pleds] = {3,4,5,6,}; //creamos un vector para los pines a utilizar

void setup ()
{
for (int i=0;i<Pleds;i++)

pinMode(led[i],OUTPUT); // El pines del 3 al 7 seran de salida
}


//////////////////////////////

y el analogWrite(9, PotLED); lo cambiaría analogWrite(led, PotLED);

o estoy perdido con la idea
este ejemplo funciona básico pero realiza lo que quiero y se podría ir implementando mas funciones


Code: [Select]
#include <Wire.h>    
#include "RTClib.h"  
//#include <OneWire.h>  
RTC_DS1307 RTC; // Crea el objeto RTC

void setup ()  
{
Serial.begin(9600); // Establece la velocidad de datos del puerto serie
Wire.begin(); // Establece la velocidad de datos del bus I2C
RTC.begin();// Establece la velocidad de datos del RTC
//RTC.adjust(DateTime(__DATE__, __TIME__)); Solo lo habilitamos la primera vez para poner en hora el reloj
}

void loop () {
  int minute;
  int hour;
  int tiempo;
DateTime now = RTC.now(); // Obtiene la fecha y hora del RTC
Serial.print(now.year(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.day(), DEC);
Serial.print(' ');
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
Serial.println();
Serial.print("Dia de la semana: ");
Serial.println(now.dayOfTheWeek(), DEC);

tiempo=(now.hour()*60)+now.minute(); // Para que sea un numero entero lo medimos en minutos

 if (tiempo < 60)  
  {  
   tiempo=tiempo+1440; // para cuando sean las 12 de la noche (00 horas)
  }  
Serial.println();
Serial.print("Tiempo: ");
Serial.println(tiempo);
delay(1000); // La información se actualiza cada 1 seg.
Luces (tiempo);

}


void Luces(int tiempo)  
{
  //conversion seria 60xHrs=660 la misma tabla para los demas parametros //
int PotLED;  
 int InicioAmanecerLED=1080;     // 18:00 Hrs  
 int FinAmanecerLED=1140;        // 19:00 Hrs  
 int InicioAnochecerLED=1200;    // 20:00 Hrs  
 int FinAnochecerLED=1260;       // 21:00 Hrs  
 int MaxLED=125; //Maximo que vamos a encender los LED sobre 255  
    

 //Noche  
 if (tiempo >FinAnochecerLED || tiempo < InicioAmanecerLED )  
  {  
   PotLED=0;  
   Serial.println();
   Serial.print("NOCHE: ");
   Serial.println(PotLED);
   Serial.println();  
  
  }  

 //Amanecer  
 if (tiempo >= InicioAmanecerLED && tiempo <= FinAmanecerLED)  
  {  
   PotLED=map(tiempo,InicioAmanecerLED,FinAmanecerLED,0,MaxLED);  
   Serial.println();
   Serial.print("AMANECIENDO: ");
   Serial.println(PotLED);  
   Serial.println();
  }  

 //Dia  
 if (tiempo > FinAmanecerLED && tiempo < InicioAnochecerLED)  
  {  
   PotLED=MaxLED;  
   Serial.println();
   Serial.print("DIA: ");
   Serial.println(PotLED);  
   Serial.println();
  }  

 //Anochecer  
 if (tiempo >= InicioAnochecerLED && tiempo <= FinAnochecerLED)  
  {  
   PotLED=map(tiempo,InicioAnochecerLED,FinAnochecerLED,MaxLED,0);  
   Serial.println();
   Serial.print("ANOCHECIENDO: ");
   Serial.println(PotLED);  
   Serial.println();
  }  
 //Control  
 if(PotLED < 0)  
  {  
   PotLED=0;  
  }  

 if(PotLED >MaxLED)  
  {  
   PotLED=MaxLED;  
  }  
 analogWrite(9, PotLED);  

 delay(1000);  
}

surbyte

En los dos primeros ejempos hablas de 4 pines
En el 3er caso no hay mas que un pin al que le asignas un valor  PWM mejor dicho de brillo.

Donde me perdi? No se entiende.

car127

Hola,
   El primero es el origina 4 pines,  el seg seria la forma de usarlo según yo,
para su uso en el ejemplo tres y así reemplazar el
    analogWrite(9, PotLED);
que es la salida  para un led y cambiarlo por
    analogWrite(led, PotLED);
entonces así tendría 4 salidas para cuatro led y usarían el mismo código.
sigo con lo mismo del dimmer para el acuario, mas básico para ir agregando funciones de a poco


surbyte

#3
Nov 20, 2017, 08:55 pm Last Edit: Nov 20, 2017, 08:55 pm by surbyte
Asi?

Code: [Select]
for (int i=0;i<Pleds;i++)
   analogWrite(led[i], PotLED); 

car127

#4
Nov 21, 2017, 04:22 pm Last Edit: Nov 21, 2017, 08:45 pm by car127
Hola
    estuve viendo ejemplos de la función for y me párese que va agregando un elemento (primero pin3, luego pin4, pin5 y pin6  para mi caso),termina uno y sigue con otro como una secuencia  o estoy muy perdido.
y lo que quiero es que los cuatro elementos (pin3, pin4, pin5, pin6) actuen al mismo tiempo para no hacer el programa 4 veces con los mismos datos y cambiando solo el pin.
O seria muy descabellado poner algo como analogWrite(3 4 5 6, PotLED);
tiene que a ver una forma pero como


Lo marcado  **** prue1az4blan  es lo agregado y da este error
exit status 1
expected unqualified-id before numeric constant

sin esas partes funcionan los dos canales ok y abilitando al final esto //analogWrite(9, PotLED);

Code: [Select]

#include <Wire.h>    
#include "RTClib.h"  
//#include <OneWire.h>  
RTC_DS1307 RTC; // Crea el objeto RTC
#define PotLED  4 //creamos la variable leds de 4 elementos **** prue1az4blan
int led[PotLED] = {3,4,5,6,}; //creamos un vector para los pines a utilizar **** prue1az4blan

void setup ()  
{
Serial.begin(9600); // Establece la velocidad de datos del puerto serie
Wire.begin(); // Establece la velocidad de datos del bus I2C
RTC.begin();// Establece la velocidad de datos del RTC
//RTC.adjust(DateTime(__DATE__, __TIME__)); Solo lo habilitamos la primera vez para poner en hora el reloj
  
}

void loop () {
  int minute;
  int hour;
  int tiempo;
DateTime now = RTC.now(); // Obtiene la fecha y hora del RTC
Serial.print(now.year(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.day(), DEC);
Serial.print(' ');
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
Serial.println();
//Serial.print("Dia de la semana: ");
//Serial.println(now.dayOfTheWeek(), DEC);

tiempo=(now.hour()*60)+now.minute(); // Para que sea un numero entero lo medimos en minutos

 if (tiempo < 60)  
  {  
   tiempo=tiempo+1440; // para cuando sean las 12 de la noche (00 horas)
  }  
Serial.println();
Serial.print("Tiempo: ");
Serial.println(tiempo);
delay(1000); // La información se actualiza cada 1 seg.
Luces (tiempo);

}


void Luces(int tiempo)  
{  
 ///////////tiempos de progamacion//////////  
//conversion seria 60x11=660 la misma tabla para los demas parametros //

int PotAzul;  
 int InicioAmanecerAzul=660;      //11:00  
 int FinAmanecerAzul=720;         //12:00          
 int InicioAnochecerAzul=1260;    //21:00  
 int FinAnochecerAzul=1380;       //23:00
// int FinLuzLuna=1380;             //23:00//
 int MaxAzul=125; //Maximo que vamos a encender los LED sobre 255  
 
int PotLED;  
 int InicioAmanecerLED=720; //12:00  
 int FinAmanecerLED=780;  //13:00 //  
 int InicioAnochecerLED=1200; //20:00//  
 int FinAnochecerLED=1260;  //21:00          
 int MaxLED=125; //Maximo que vamos a encender los LED sobre 255  


    
//////////////////// Azul ////////////////////////
 //Luna
//if (tiempo <= FinLuzLuna) PotAzul=(FinAnochecerAzul-tiempo);
 //Noche  
 if (tiempo >FinAnochecerAzul || tiempo < InicioAmanecerAzul )  
 {  
   PotAzul=0;  
   Serial.println();
   Serial.print("NOCHE AZUL: ");
   Serial.println(PotAzul);
   Serial.println();  
  
  }  
  
  //Amanecer  
 if (tiempo >= InicioAmanecerAzul && tiempo <= FinAmanecerAzul)
 {  
  PotAzul=map(tiempo,InicioAmanecerAzul,FinAmanecerAzul,0,MaxAzul);  
   Serial.println();
   Serial.print("AMANECIENDO AZUL: ");
   Serial.println(PotAzul);  
   Serial.println();
  }  

 //Dia  
 if (tiempo > FinAmanecerAzul && tiempo < InicioAnochecerAzul)
 {  
   PotAzul=MaxAzul;  
   Serial.println();
   Serial.print("DIA AZUL: ");
   Serial.println(PotAzul);  
   Serial.println();
  }  

 //Anochecer  
 if (tiempo >= InicioAnochecerAzul && tiempo <= FinAnochecerAzul)
 {  
   PotAzul=map(tiempo,InicioAnochecerAzul,FinAnochecerAzul,MaxAzul,0);  
   Serial.println();
   Serial.print("ANOCHECIENDO AZUL: ");
   Serial.println(PotAzul);  
   Serial.println();
  }  
 /////////////////// PotLED ///////////////////////
  //Noche  
 if (tiempo >FinAnochecerLED || tiempo < InicioAmanecerLED )  
 {  
   PotLED=0;  
   Serial.println();
   Serial.print("NOCHE: ");
   Serial.println(PotLED);
   Serial.println();  
  
  }  
  //Amanecer  
 if (tiempo >= InicioAmanecerLED && tiempo <= FinAmanecerLED)
{  
   PotLED=map(tiempo,InicioAmanecerLED,FinAmanecerLED,0,MaxLED);  
   Serial.println();
   Serial.print("AMANECIENDO: ");
   Serial.println(PotLED);  
   Serial.println();
  }  
 //Dia  
 if (tiempo > FinAmanecerLED && tiempo < InicioAnochecerLED)
 {  
   PotLED=MaxLED;  
   Serial.println();
   Serial.print("DIA: ");
   Serial.println(PotLED);  
   Serial.println();
  }  
 //Anochecer  
 if (tiempo >= InicioAnochecerLED && tiempo <= FinAnochecerLED)
{  
   PotLED=map(tiempo,InicioAnochecerLED,FinAnochecerLED,MaxLED,0);  
   Serial.println();
   Serial.print("ANOCHECIENDO: ");
   Serial.println(PotLED);  
   Serial.println();
  }  

 //Control  
  if(PotAzul < 0)  
  {  
   PotAzul=0;  
  }  
 if(PotAzul >MaxAzul)  
  {  
   PotAzul=MaxAzul;  
  }  

 if(PotLED < 0)  
  {  
   PotLED=0;  
  }  

 if(PotLED >MaxLED)  
  {  
   PotLED=MaxLED;  
  }
   
  {
     for (int i=0;i<PotLED;i++)        // **** prue1az4blan

     analogWrite(led[i],PotLED); // El pines del 3 al 7 seran de salida    **** prue1az4blan
    }   


 //analogWrite(9, PotLED);  
 analogWrite(10, PotAzul);  

 delay(1000);  
}

rodripelto

Hola,
La solución es la que te ha dado surbyte.
A la vez no se puede, al menos con programación básica, no hay ninguna instrucción que mueva pines al mismo tiempo.
Pero la diferencia será muy pequeña.
Si alguna respuesta ha solucionado tu problema, da las gracias marcándola como solucionada.

surbyte

Si la hay pero si tiene problemas con esto para que introducir otro comando?

Pudes manejar el port directo pero involucra un manejto distinto al actual.

Ahora la diferencia es tal como rodripelto lo ha afirmado, inperceptible para el usuario. Si para algun aparato especial.

car127

Hola
     esta montado en prueba, pero note que al meterme por el monitor serial se apaga las luces y luego vuelve, eso se debe al uso del delay y para que no ocurra tendría que usar millis

Swift

Si en eso 2 delay que tienes de 1000 se espera el programa, te toca usar millis Aqui un ejemplo

surbyte

Ve a Documentación y luego el primero hilo dice Indice de temas Tutoriales, dentro encontrar una buena guia de como se usa millis().

Go Up