Go Down

Topic: array (Read 999 times) previous topic - next topic

hola.
Estoy dando vueltas hace tienpo pero no logro entender como funciona.
Quiero controlar varias luces desde un programa y tengo problemas para poder interactuar las matrices con las variables.

ej.  digitalWrite(out[pin], s2);

dejo el code y si alguien puede ayudarme se lo agradeceria.
Quote
#include <EEPROM.h>


int inA10 = A10;
int out[] = {0, 1, 2, 3, 4, 5, 6};
int count = 0;
char mat;
char pin;
int sen;
char buf;
char mat1[4][4];


void setup(){
 Serial.begin(9600);
 for (count=0;count<6;count++) {
   pinMode(out[count], OUTPUT);
 }
}

void loop() {

 // se ingresan 4 calores,
 //valor uno escribe o lee,
// valor dos matris donde guarga los valores, de mometo es 1
// valor tres pin a travajar
// valor cuatro enciende o apaga
//ingreso los cuatro valores juntos desde el serie
// ej. 112H ----- 1=write, 1=mat, 2=pin H=HIGH.

if (Serial.available()>0){
 buf = Serial.read();
  if (buf == '1') {
     Serial.println("write"); //escribe o enciende y apaga
     writeMat();
  }
   if(buf == '2'){
     Serial.println("read"); //lee el estado del pin
     readMat();
   }

}
}

//--------------------

void puls(){
 
 
}
//--------------------

// guardo los valores dos, tres y cuatro en mat, pin y sen.
void writeMat() {
 if (Serial.available()>0){
  for (int i=0; i<3; i++){
      buf = Serial.read();
      delay(10);
      switch (i){
        case 0:
              mat = buf;
              break;
        case 1:      
               pin = (buf-1);
               break;
        case 2:
               if (buf == 'H'){
                sen = HIGH;
              }
              if (buf == 'L'){
                sen = LOW;
              }
              //digitalWrite(outA[0], s2);
              Serial.print("Var Mat: ");
              Serial.println(mat);
              Serial.print("Var Pin: ");
              Serial.println(pin);
              Serial.print("Var Sen: ");
              Serial.println(sen);
              Serial.print("Es. Pin: ");
              Serial.println(digitalRead(out[pin]));
              Serial.print("Pins a Modif: ");
              Serial.println(pin);
              Serial.print("Read Dig.Pins: ");
              Serial.println(digitalRead(out[pin]));
              Serial.print("Señal enviada: ");
              Serial.println(sen);
                                     
           digitalWrite(out[pin], s2);
                             
              Serial.print("Read Dig.Pins: ");
              Serial.println(digitalRead(out[pin]));
              Serial.println("");
              Serial.println("Read Pins...");
              Serial.print("Pin: ");
              Serial.print(out[pin]);
              Serial.print("    E= ");
              Serial.print(out[pin]);
              Serial.println("");
              Serial.println("");
              Serial.println("");
             // mat1[s0][s1] = s2;
             // Serial.println(mat1[s0][s1]);
              break;
     }      

 }
 /**Serial.print("M: ");
 Serial.print(s0);
 Serial.print("   V: ");
 Serial.print(s1);
 Serial.print("   E: ");
 Serial.println(s2);
 //Serial.print("E: ");
 //Serial.println(mat1[s0][s1]);
 s
 **/
 mat=0, pin=0, sen=0;
 buf = 0;
 Serial.flush();
 return;
}
}

//--------------------

void readMat() {
 if (Serial.available()>0){
  for (int i=0; i<2; i++){
       buf = Serial.read();
      //delay(10);
      switch (i){
        case 0:
              mat = buf;
              break;
        case 1:      
              pin = buf;
              break;
       }      

 }
 /**Serial.print("M:  ");
 Serial.print(s0);
 Serial.print(" V: ");
 Serial.print(s1);
 **/
 Serial.print(" E: ");
 Serial.println(mat1[mat][pin]);
 mat=0, pin=0;
 Serial.flush();
 return;
}
}

ionhs

#1
May 01, 2011, 09:32 am Last Edit: May 01, 2011, 09:43 am by ionhs Reason: 1
Puf que de código, a simple vista se me ocurre que has declarado una variable como char que luego usas para trabajar con una matriz. Igual va bien pero en vez de char la haría int, al fin y al cabo es un número que marca una posición.
char pin;
int out[] = {0, 1, 2, 3, 4, 5, 6};
digitalWrite(out[pin], s2);

Te pongo un ejemplo que hice de un led rgb. Es una matriz donde se guardan 12 colores y cada color está formado por 3 tonos (rojo,verde y azul) cada 5 segundos cambia de color. Cuando enseña los 12 vuelve a enseñarlos pero de atrás para adelante.


He tenido que meterlo como una imagen porque al meter el código no se porque me lo modifica, es raro. Encima me modifica justamente la matriz.


int colores[12][3] = {
{0,255,255},{0,186,255},{0,115,255},{0,90,255},{0,0,255},{128,0,255},{255,0,255},{255,0,0},
{255,255,0},{128,255,0},{0,255,0},{90,213,213}};
int i = 0;
int incremento = 1;
int pinrojo = 11;
int pinverde = 10;
int pinazul = 9;

void setup()  {
 // declare pin 9-10-11 to be an output:
 pinMode(pinrojo, OUTPUT);
 pinMode(pinverde, OUTPUT);
 pinMode(pinazul, OUTPUT);
}

void loop()  {

 //enviar los colores

 analogWrite(pinrojo, colores
  • );
     analogWrite(pinverde, colores[1]);
     analogWrite(pinazul, colores[2]);

     i = i + incremento;

     // reverse the direction of the fading at the ends of the fade:
     if (i == 0 || i == 11) {
       incremento = -incremento ;
     }    
     // wait for 5 seconds to see the dimming effect    
     delay(5000);                            
    }


Mil disculpas, es mi primer codigo y como sabras siempre es un caoz

Sigo teniendo el mismo problema, prove el codigo del ej 3 http://www.arduino.cc/en/Tutorial/KnightRider   y funciona perfecto pero no comprendo que diferencia hay con el mio, la matriz esta declarada de la misma manera, los pinMode idem y digitalWrite(pinArray[count], HIGH); es similar a mi codigo digitalWrite(out[pin], sen);    " corrijo el codigo anterior decia digitalWrite(out[pin], s2); que es incorrecto"
Si declaro como int
int mat;
int pin;
int sen;
int buf;

me da el Serial.print

Variable Matriz: 50
Variable Pin: 50
Variable Senal: 1
Pins a Modificar: 50

Estado Pins: 1
Señal enviada: 1

Estado Pins: 1

y si
char mat;
char pin;
int sen;
int buf;

me da el Serial.print

Variable Matriz: 1

Variable Pin: 2

Variable Senal: 1

Pins a Modificar: 2

Estado Pins: 1
       //Serial.println(digitalRead(out[pin]));  Este valor tiene que ser 0 ya que esta apagada
Señal enviada: 1
  // digitalWrite(out[pin], sen);
Estado Pins: 1
       //Serial.println(digitalRead(out[pin]));  Este valor es correcto pero no tengo señal en el pin


para mi que en como interpreta la matris las variables que le envio pero no se como resolverlo.



ionhs

No se cual es el problema, sobre todo porque es demasiado grande y no tengo ni idea que quieres conseguir. Pero te voy a dar unas recomendaciones que seguramente alguna vez te las habrán dado.

- Antes de escribir el programa haz un diagrama de flujo, se que requiere trabajo y no solemos querer hacerlo.
- Simplifica el programa en programas más pequeños que funcionen bien y luego júntalos.
- Tal vez un compilador de C como "codeblocks" te puede ayudar a saber si tienes bien hechos los arrays, for... y demas instrucciones aunque las funciones especificas de arduino no las reconoce, cosa que es una faena.

Aun y todo mirando un poco más tu código hay otra cosa que me mosquea

- No entiendo porque pin lo declaras como "char" ya que esto es para caracteres y las posiciones de las matrices se identifican por números enteros "int". No quiero decir (porque no lo he probado) que con char no funcione pero no le veo lógica.
- Luego escribes:
int out[] = {0, 1, 2, 3, 4, 5, 6};
for (count=0;count<6;count++) {
    pinMode(out[count], OUTPUT);
  }
de esta manera el for se realiza cuando count es 0, 1 , 2, 3, 4, 5, osea que el pin 6 no lo estás declarando como salida por lo que será de entrada. (no se si es eso lo que quieres) El array de KnightRider tiene 6 valores el tuyo tiene 7. No creo que eso te afecte a tu programa porque luego abajo he visto que los arrays los usas hasta el 3, pero ten cuidado. Como te he dicho antes trocea el código en trozos y así podrás encontrar el fallo porque hay mucho tomate. Salu2

nayma

Otra cosa que no entiendo en tu código original es int inA10 = A10;
que además me parece que no lo usas para nada.

Hola
Gracias por tus consejos.
Mi objetivo es controlar luces temperatura, etc. para una mi casa. No tengo mucha idea de programación y estoy aprendiendo a los golpes, probando y probando. Puse el codigo como una orientacion ya que no esta refinado de ninguna manera. Se que y que se debe escribir varias sub-programas para luego unirlos en uno solo 
este es el codigo mar refinado

int out[] = {2, 3, 4, 5, 6, 7};
int count = 0;
int mat;
int pin;
int sen;
int buf;

void setup(){
  Serial.begin(9600);
  for (count=0;count<6;count++) {
    pinMode(out[count], OUTPUT);
  }
}

void loop() {

if (Serial.available()>0){
  buf = Serial.read();
   if (buf == '1') {
      Serial.println("write"); //escribe o enciende y apaga
      writeMat();
   }
    if(buf == '2'){
      Serial.println("read"); //lee el estado del pin
      readMat();
    }

  }
}

void writeMat() {
  if (Serial.available()>0){
   for (int i=0; i<3; i++){
       buf = Serial.read();
       delay(10);
       switch (i){
         case 0:
               mat = buf;
               break;
         case 1:       
                pin = (buf);
                break;
         case 2:
                if (buf == 'H'){
                 sen = HIGH;
                }
               if (buf == 'L'){
                 sen = LOW;
                }
                                 
            digitalWrite(out[pin], sen);
          break;
      }     
mat=0, pin=0, sen=0;
  buf = 0;
  Serial.flush();
  return;
}
}

chiva

Cambia estas dos líneas:
mat = buf;
pin = (buf);

por:
mat = buf-'0';
pin = buf-'0';

Ya que en buf tienes el número codificado en ASCII, por lo que debes pasarlo a número decimal.

Otras notas:
A10 hace referencia al pin analógico 10
char es lo mismo que 'int8_t' en el estándar de C, es decir, un número de 8 bits con signo, y puedes guardar lo que quieras. ¿que esos números luego según una tabla se codifican para representar letras? Pues que así sea, pero como si quieres guardarlos en un int o long.

Un saludo
Mercadillo electrónico. Kit iniciación a Arduino, shield LCD a color y más cosas!

Funciono, mil gracias. :D :D :D :D

Ahora para terminar de entender esto y que me quede claro, Todo lo que se almacene en el buffer que venga por el puerto esta en ASCII y para que pueda leerlo hay que pasarlo a DEC.
No comprendo que hace -'0'; ,evidentemente lo pasa a DEC

un saludo y gracias

chiva

#8
May 01, 2011, 11:30 pm Last Edit: May 01, 2011, 11:33 pm by chiva Reason: 1
Busca una tabla ASCII por internet, mira el valor decimal que equivale al '1', luego mira el del '0' y haz la operación de resta como lo puse arriba.
Te darás cuenta enseguida

1 es el valor decimal que representa el número 1 tal cual.
'1' es el número decimal que representa al 1 codificado en ASCII

De nada ;)
Mercadillo electrónico. Kit iniciación a Arduino, shield LCD a color y más cosas!

Go Up