Poll
Question: array y variables
array - 0 (0%)
variables - 0 (0%)
Total Voters: 0

Pages: [1]   Go Down
Author Topic: array  (Read 750 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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;
 }
}
Logged

Donostia
Offline Offline
God Member
*****
Karma: 3
Posts: 743
elektronikadonbosco
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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);                            
}

« Last Edit: May 01, 2011, 02:43:25 am by ionhs » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.


Logged

Donostia
Offline Offline
God Member
*****
Karma: 3
Posts: 743
elektronikadonbosco
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

0
Offline Offline
God Member
*****
Karma: 1
Posts: 524
Arduino inside
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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;
 }
}
Logged

Offline Offline
Edison Member
*
Karma: 23
Posts: 1375
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

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

Offline Offline
Newbie
*
Karma: 0
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Funciono, mil gracias. smiley-grin smiley-grin smiley-grin smiley-grin

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
Logged

Offline Offline
Edison Member
*
Karma: 23
Posts: 1375
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-wink
« Last Edit: May 01, 2011, 04:33:24 pm by chiva » Logged

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

Pages: [1]   Go Up
Jump to: