QUEDADA AM - MAYO

Charla impartida por el SBC: «INICIACIÓN AL BETTA».
DOMINGO, 11 DE MAYO. ¡APÚNTATE YA!

Más info
image01

¿Aún no conoces AMA?

Hazte socio de Acuariofilia Madrid Asociación.
CERRADO EL PLAZO DE INSCRIPCIÓN

Más info
image01

Atlas de peces de AM

¡Hemos alcanzado las 800 fichas! Visita nuestro atlas de peces actualizado.

Más info
image01

Cardúmenes y sociabilidad

Nueva actualización de la tabla con una extensa relación de peces, donde podrás conocer qué entorno necesita cada especie, su sociabilidad y si convive o no en cardumen. ¡Pasa a descubrirla!

Mas info
image01
Aula Arduino para principiantes.
Respuestas: 1783    Visitas: 433417
#1,516
entonces a ver si me explico que tu respuesta la he tenido que leer tres o cuatro veces para enterarme.Blush
ahora unas cuantas preguntas:(me podéis mandar a la mierda cuando queráis)
1ª ¿las variables antes del setup se ponen cuando esta se va a repetir muchas veces dentro del programa, para facilitar el mismo?

2ª todo lo que se manda después del for necesita estar entre llaves¿verdad?

Cita: void loop()
{
for(int veces=0;veces<8;veces++)// 8 ciclos?

{
digitalWrite(2,HIGH);//2 salida5v
delay(2000);//encendido 2 segundos
digitalWrite(2,LOW); //apagado led 2

for(int pwm=0;pwm<256;pwm++)//salida de 0v a 5v pin3????
{
analogWrite(3,pwm); //encendido???
delay(1000);

}
digitalWrite(3,LOW);
digitalWrite(4,HIGH);
delay(2000);
}
}

3ª Pero dentro de unas llaves como en este caso ¿puede haber otras?



4ª En este caso enciendo el led denominandolo como pwm y lo enciendo como analogWrite(3,pwm); y lo apago como digitalWrite(3,LOW); ¿eso esta bien???Huh
#1,517
El turrón y el champán están nublando tu mente Pedro

1º - Las variables se crean para ser usadas en su contexto, si su valor va a ser usado y modificado (si no se modifica crea una constante) por diferentes rutinas que han de compartir el valor, en el nivel superior de las mismas para que sean visibles a todas ellas.
Una variable global, declarada en el encabezado, fuera de cualquier rutina tiene alcance global, puede ser usada/modificada por cualquier rutina. Quedando un espacio reservado en la memoria para ella.
Si una variable se define dentro de una rutina o de un bucle solo es visible para el código del mismo, se le reserva temporalmente un espacio de memoria, y al acabar este se elimina y se recupera la memoria. Y si vuelves a entrar en la rutina se crea de nuevo limpia (salvo que la declararas static).

2º 3º - En toda rutina o bucle (if, for, while,...) puedes poner solo un comando a continuación, pero si va a estar compuesto por varios comandos se abre una llave y finalmente se cierra para indicar entremedias que comandos se han de ejecutar. Y puedes anidar cuantos se quieran (pero cuenta que sean pares y no se te olvide ún cierre, o pongas de más). Identa (tabula) el código para que lo veas mas claro. Y recuerda lo comentado de variables locales.

4º Un pin de arduino declarado output va a recibir por el procesador un voltaje en función de la orden dada, digitalWrite(p,LOW) te lo pone a 0v, digitalWrite(p,HIGH) te lo pone a 5v y para poner en un pin pwm un voltaje intermedio analogWrite(p,valor), teniendo valor 8bits 2^8 =0..255 (cuidado que analogRead de un pin analógico te devuelve un valor de 10bit 2^10=0..1024).
Realmente en el pwm no es un voltaje fijo sino es un voltaje promedio de una onda cuadrada entre 0 y 5, que según el porcentaje de High y Low obtiene ese promedio.
#1,518
Pedmar el tema del ámbito de existencia de las variables es una cuestión que necesita ser explicada muy temprano, pero no es fácil de entender hasta que ya se han practicado con ellas.

Para manejar programas sencillos no es necesario dominar un tema que si se intenta explicar en toda su amplitud a un novato provocará el rechinar de neuronas.

Lo básico es empezar comprendiendo el funcionamiento de las variables globales y de las variables locales.

Las variables globales son aquellas que se declaran fuera de una función y que generalmente se ponen al principio de los programas, (podrían ponerse en otra parte pero siempre fuera de las funciones), tienen una existencia global al programa. Pueden accederse desde dentro de cualquier función salvo que en una función se declare una variable con el mismo nombre, ya que la ocultaría.

Dentro de las funciones se pueden declarar variables pero estas solo tendrán existencia dentro de la función y al salir de la función se destruye.

Podría decirse que una variable es un trozo de memoria con un determinado tamaño y que tiene asociado un tipo de dato. Sirven de contenedores para guardar valores. Para cambiar su contenido se escribe en la memoria un contenido diferente. No es como una caja que puede estar vacía. Siempre contienen algo.

Las variables globales se crean en el mismo momento en que se declaran antes de que se ejecute nada, pero las variables locales se crean en el momento de ejecutarse la función. Eso implica crear ese espacio disponible en memoria para contener el tipo de dato contenido.

Dicho así parece simple pero hay que comprender que desde dentro de una función se puede llamar a otras y desde esas a otras y todo tiene que funcionar por complejo que sea el anidamiento de unas llamadas dentro de otras. Pensemos que hay funciones que se pueden usar con mucha frecuencia desde muchas otras que a su vez pueden llamarse entre sí. Al igual que una variable local puede ocultar a una variable global con el mismo nombre sin destruirla, dentro de una función no se podrá acceder a otras variables locales.

Dentro de una funcion se pueden declarar variables no solo al principio sino en cualquier parte. La variable no existirá hasta que se declare. Se crea en ese mismo instante.

Los argumentos que se pasan a una función son como variables locales, pero que van a recibir un valor en la llamada a la función.

Si ponemos la declaración de una variable dentro de un bloque entre llaves { } las variables se crean en ese bloque y se destruyen al salir del bloque y un bloque permite sustituir una sentencia por una serie de sentencias.
Por ejemplo:

if (condicion){
int variableInternaAlbloque;
...;
...;
...;
}

Desde dentro de una función, nada impide llamar a la propia función. Eso es un poco complicado de entender como funciona y se llama recursividad. Lo que ocurre en estos casos es que las variables locales de la primera llamada continúan existiendo con independencia de las variables de la segunda llamada pese a tener el mismo nombre. Las variables dentro de la nueva llamada ocultaran a las variables homónimas de llamadas previas como si fuera variables locales de otras funciones diferentes.

Por ejemplo, yo podría definir una función que llamaremos función factorial y dentro del códido indicar al ordenador que el factorial de un número es ese número multiplicado por el factorial de ese número menos uno. Parece raro que en la forma de resolver un problema hagamos una llamada a la misma función factorial, eso sí con el número decrementado.

De hecho, tal cual acabo de explicarlo no funcionaría porque si no ponemos algo más, la función se llamaría a si misma contínuamente hasta agotar toda la memoria. Eso ocorriría porque no damos ninguna opción a salir de ninguna de esas llamadas salvo llamándose otra vez a sí misma y cada una de esas llamadas consume memoria para crear sus propias variables locales, que aúnque tengan el mismo nombre, podrán contener un valor diferente.

Lo único que se necesita para que la recursivida funcione es que la función factorial consulte antes que nada si el número cuyo factorial deseamos obtener es uno y en ese caso devolvemos como resultado el valor uno ( 1!= 1), en caso contrario diremos que el resultado es el número multiplicado por factorial del número.

Si ponemos un número muy alto podría agotar la memoria, y cascar, en caso contrario cuando las llamadas una dentro de otras lleguen a preguntar por el factorial de 1 empezaran a salir de cada una de las llamadas devolviendo el resultado a la llamada anterior hasta terminar.

Código:
int Factorial(int n) {
  if (n <= 1)
    return 1;
  else
    return (n * Factorial(n-1));
} // end Factorial

Factorial de N se representa por N!

4! = 4 * 3! ---> necesita llamar nuevamente a factorial
3!= 3 * 2! ---> necesita llamar nuevamente a factorial
2!= 2 *1! ---> necesita llamar nuevamente a factorial
2!= 2*1 ---> el factorial de 1 es 1, retornamos resultado
3! = 3* (2*1) ---> retornamos resultado
4! = 4 * (3 * (2*1)) ---> retornamos resultado

Es evidente que este problema se resuelve más fácil con un simple bucle, pero es un ejemplo sencillo de como funcionaría una función llamándose a sí misma.

Pedmar, una de las cosas que te recomiendo practicar es intercalar dentro de tus programa código de trazas.

Son instrucciones para mostrar el valor de alguna variable.
Por ejemplo:
Serial.println("La variable X contiene ");
Serial.println(X);

De esa forma puede ir intentando ver lo que ocurre.

No sigo para no agobiar.

Pedmar, pregunta lo que quieras y tranquilo, yo sé perfectamente donde me meto, y creo que es imprescindible ayudar un poco al comienzo que es lo que más cuesta.
#1,519
Pedmar, ayer di una respuesta larga y no sé hasta que punto todo eso te ayuda o no.

Una de tus preguntas veo que quedó sin respuesta.

Conviene usar variables globales siempre que se trate de datos que se van a usar globalmente en todo el programa y que cualquier función podría necesitar trabajar con ella.

Conviene usar variables locales cuando solo vamos a usar esa variable dentro de una función.

Si usáramos variables globales para todo, sería más lioso. Además sería ineficiente porque estaríamos reservando toda la memoria de una vez.

Si hacemos una llamada a una función que internamente usa variables, al terminar recuperamos todo el espacio de memoria que se usó dentro de la función.

A una función se le pueden pasar datos (argumentos). Estos funcionan como variables locales que recibirán una copia del valor que interesa sea manejado dentro de la función.

Si no usáramos estas técnicas, y trabajáramos todo con variables globales, cualquier función podría tocar variables que solo nos interesa tocar en otras partes del programa.

Las variables globales deben ser tratadas con cuidad dentro de una función, para no provocar efectos colaterales en otras funciones que también las usen.

En programación interesa mucho poder aislarse del resto del código para resolver un problema particular, y las variables locales nos ayudan a crear programas más fáciles de entender para los humanos.
#1,520
He preferido leer esto por la mañana a ver si consigo entender un % de la respuesta y con eso avanzar.
Me siento como un inútil -mega_shok.gif por que me cuesta muchísimo transportar toda la información que me dais, a un lenguaje entendible para mi; que nunca e programado...Voy a tener que hacerme un diccionario de términos...función,variable,condición,bucle, factorial etc... Undecided Me temo que me estoy metiendo en camisas de once varas, pero no voy a tirar la toalla tan pronto.
Ademas tengo el problema de que no tengo nada para hacer pruebas, de que pasa con los componentes cuando cambio un dato u otro.
intentaré buscar información por todos los medios posibles y cuando no pueda continuar preguntaré (no quiero quemaros a la gente que me estáis tratando de ayudar con preguntas interminables y repetitivas,por que si en algún momento empiezo a entender este idioma nuevo para mi me gustaría poder hacer cosas que merezcan la pena)
voy a asimilar toda esta información -hi.gif
#1,521
Si es que la culpa es nuestra cuando sin quererlo comentamos cosas que para nuestro entender son triviales cuando realmente para un usuario que comienza y va por el tema 1, las va encontrar en el tema 12.

No te cortes, a cualquier duda pregunta que el titulo de este tema es "Aula Arduino para principiantes" y es para eso y no para "hacer arcos de iglesia"

De todo lo anterior quedate solo que si una variable la declaras al principio es usable/modificable en todo el código y si la declaras dentro de una función lo es en ella, y si la dentro de {......} solo lo es dentro de las llaves
#1,522
(25-12-2015, 11:54 AM)pedmar escribió: ... me cuesta muchísimo transportar toda la información que me dais, a un lenguaje entendible para mi; que nunca e programado...Voy a tener que hacerme un diccionario de términos...función,variable,condición,bucle, factorial etc...

Factorial no tiene que ver con la programación, es un concepto matemático.

Glosarios de programación hay bastantes, pero cuando se empieza lo mejor es hacer lo que tú dices, crearse uno mismo un glosario usando tus propias palabras. Por cada concepto que pilles lo vas anotando.

Procedimiento Es un trozo de código (trozo de un programa) que tienen un punto de entrada y un punto de salida y que puede ser utilizado (llamado) desde otra parte de un programa. Algunas veces se les puede llamar subrutina, o función.

Función: Una función en sentido estricto es un procedimiento especial, capaz de retornar un resultado.

Variable: Es un elemento que permite almacenar un dato en alguna parte de la memoria. Contiene siempre algún valor que puede ser consultado. El contenido se puede alterar mediante una sentencia de asignación. (Por ejemplo: Varo1=37).

Identificador: Es un nombre formado por una secuencia de caracteres que se usa para denotar distintos elementos. Por ejemplo: Nombre de una variable, de una función, de un tipo de datos, etc. Los caracteres pueden ser letras mayúsculas y minúsculas asi como el carácter guión bajo '_' pero si bien también pueden incluir los dígitos del 0 al 9 estos nunca pueden usarse como primer carácter del identificador. No se pueden usar caracteres especiales ni letras con acentos. La diferencia entre mayúsculas y minúsculas se tiene en cuenta para determinar identificadores diferentes. No se permite usar identificadores que coincidan con una palabra clave.

Palabra clave: Es aquella que ya viene predeterminada en el lenguaje para ser usada con un propósito determinado y que no puede ser usada como identificador por esa razón. Se suelen usar para construir distinto tipo de sentencias.

Sentencia: En lenguaje C las sentencias suelen separarse por punto y coma;
Representa la unidad de acción.

Condición: Se llama así a un resultado de lógico (booleando) con dos posibles valores (falso o verdadero) y que puede determinar una acción u otra en función de su valor.

Bucle: Se lama así a una estructura de código que permite que en su interior se ejecuten varias veces una o más acciones.

Tipo básico:
Existen 5 tipos simples en C:
- char (carácter), ocupa 8 bits (1 bytes)
- int (entero), ocupa 16 bits (2 bytes)
- float (coma flotante), ocupa 32 bits (4 bytes)
- double (coma flotante doble precisión) ocupa 64 bits (8 bytes) (Disponible en Arduino DUE)
- void (sin valor). ocupa 0 bits (0 bytes)
#1,523
(25-12-2015, 03:38 PM)Antonio Castro escribió:
(25-12-2015, 11:54 AM)pedmar escribió: ... me cuesta muchísimo transportar toda la información que me dais, a un lenguaje entendible para mi; que nunca e programado...Voy a tener que hacerme un diccionario de términos...función,variable,condición,bucle, factorial etc...

Factorial no tiene que ver con la programación, es un concepto matemático.

Glosarios de programación hay bastantes, pero cuando se empieza lo mejor es hacer lo que tú dices, crearse uno mismo un glosario usando tus propias palabras. Por cada concepto que pilles lo vas anotando.

Procedimiento Es un trozo de código (trozo de un programa) que tienen un punto de entrada y un punto de salida y que puede ser utilizado (llamado) desde otra parte de un programa. Algunas veces se les puede llamar subrutina, o función.

Función: Una función en sentido estricto es un procedimiento especial, capaz de retornar un resultado.

Variable: Es un elemento que permite almacenar un dato en alguna parte de la memoria. Contiene siempre algún valor que puede ser consultado. El contenido se puede alterar mediante una sentencia de asignación. (Por ejemplo: Varo1=37).

Identificador: Es un nombre formado por una secuencia de caracteres que se usa para denotar distintos elementos. Por ejemplo: Nombre de una variable, de una función, de un tipo de datos, etc. Los caracteres pueden ser letras mayúsculas y minúsculas asi como el carácter guión bajo '_' pero si bien también pueden incluir los dígitos del 0 al 9 estos nunca pueden usarse como primer carácter del identificador. No se pueden usar caracteres especiales ni letras con acentos. La diferencia entre mayúsculas y minúsculas se tiene en cuenta para determinar identificadores diferentes. No se permite usar identificadores que coincidan con una palabra clave.

Palabra clave: Es aquella que ya viene predeterminada en el lenguaje para ser usada con un propósito determinado y que no puede ser usada como identificador por esa razón. Se suelen usar para construir distinto tipo de sentencias.

Sentencia: En lenguaje C las sentencias suelen separarse por punto y coma;
Representa la unidad de acción.

Condición: Se llama así a un resultado de lógico (booleando) con dos posibles valores (falso o verdadero) y que puede determinar una acción u otra en función de su valor.

Bucle: Se lama así a una estructura de código que permite que en su interior se ejecuten varias veces una o más acciones.

Tipo básico:
Existen 5 tipos simples en C:
- char (carácter), ocupa 8 bits (1 bytes)
- int (entero), ocupa 16 bits (2 bytes)
- float (coma flotante), ocupa 32 bits (4 bytes)
- double (coma flotante doble precisión) ocupa 64 bits (8 bytes) (Disponible en Arduino DUE)
- void (sin valor). ocupa 0 bits (0 bytes)

gracias de nuevo a los dos por demostrar tanta paciencia, sigo leyendo y leyendo -hypo.gif
#1,524
Me he registrado en la pagina que nos ha pasado Antonio, donde puedo hacer practicas con el arduino.

Después de varias pruebas veo que en el void loop. al poner for( int veces=0; veces<8;veces++) debería hacer 8 ciclos y no -no2.gif sigue y sigue, hasta que detengo la simulaciónSad

Código:
void setup() {
pinMode(2,OUTPUT); //2 salida
pinMode(7,OUTPUT); //3 salida
pinMode(4,OUTPUT); //4 salida
pinMode(8,OUTPUT);//8 SALIDA
pinMode(13,OUTPUT);//13salida
}
void loop()
{
[b]for( int veces=0; veces<8;veces++)// 8 ciclos?[/b]

{
digitalWrite(2,HIGH);//2 salida5v
    delay(200);//encendido 2 segundos
digitalWrite(2,LOW); //apagado led 2
digitalWrite(7,HIGH); //encendido???
    delay(1000);  
  digitalWrite(7,LOW);
  digitalWrite(4,HIGH);
   delay(1000);
  digitalWrite(4,LOW);
delay(500);
digitalWrite(8,HIGH);
   delay(1000);
  digitalWrite(8,LOW);
delay(500);
   digitalWrite(13,HIGH);
   delay(1000);
  digitalWrite(13,LOW);
delay(500);
}
}
#1,525
es porque el for esta dentro de loop(), todo lo que esté dentro de loop se va ejecutando hasta que se apaga(para la simulación).

ponle un delay muy grande entre el { del for y el del loop y ya verás como "para" después de 8 ciclos.
#1,526
Claro Pedro, se hace 8 veces, pero por cada bucle.

En un programa arduino hay dos procedimientos/funciones principales:

void setup() que recoge las sentencias que han de ejecutarse al iniciarse el programa y solo una vez.

void loop() es el bucle que se repite infinitas veces mientras el programa esté funcionando.

Tu bucle for hace que se ejecute 8 veces seguidas, y tras ello se sale del bucle for pero acaba terminando el procedimiento loop y este se reinicia.

Si quieres que solo se ejecuta una vez(8) o lo pones en el setup o si quieres que esté en loop defines una variable global booleana que tome el valor cierto en la definición o en setup. Y previo al for pones una sentencia condicional if que incluya el bucle for y que antes de terminar el loop tome el valor falso, así solo se ejecutará la primera vez que corra el loop


Código:
bool pasa = TRUE;

void setup() {
   pinMode(2,OUTPUT); //2 salida
   //.........................................
  
   // se puede poner aqui el bucle for para solo una ejecución
}

void loop()
{
  if (pasa){
      for( int veces=0; veces<8;veces++) // 8 ciclos?
      {  // sentencias del for
       }
      pasa = FALSE;   // una vez ejecutado el for lo ponemos a false para que no se haga mas en siguientes bucles
  }  // cerrar if

  digitalWrite(2,HIGH);//2 salida5v
  //.............................................
  delay(500);
}  // cerrar loop

Pedro cuando pegues código en un post pon mejor [ code ] que [ quote ] queda mas claro el código y no pierde la identacion ni los espacios aposta
#1,527
(27-12-2015, 08:44 PM)Aeros escribió: es porque el for esta dentro de loop(), todo lo que esté dentro de loop se va ejecutando hasta que se apaga(para la simulación).

ponle un delay muy grande entre el { del for y el del loop y ya verás como "para" después de 8 ciclos.

efectivamente le he puesto un delay(20000); despues del } del for y antes del} del loop y se ha parado justo a los 8 ciclos.
¿pero esto ocurre solo en la simulación u ocurrirá también con los componentes físicos?Huh
#1,528
Otra opción avanzando mas en las funcionalidades arduino es disponer en el montaje de un pulsador (hasta que no te lleguen los juguetes no te explico el detalle), y en vez de usar la variable "pasa" como TRUE/FALSE, realizar una lectura con digitalRead del pin del pulsador y entrar en el bloque if si está HIGH y no entrar si esta LOW; de esta forma se ejecuta el for cada vez que pulses y no se ejecuta si no pulsas
#1,529
(27-12-2015, 09:08 PM)pedmar escribió: ¿pero esto ocurre solo en la simulación u ocurrirá también con los componentes físicos?Huh

Pasa siempre, lo q hay dentro del loop() se ejecuta continuamente ( es como un for de infinitas veces).
#1,530
a ver si entiendo esta función: for????
Se supone que cada vez que comienza el loop,el programa lee la función for, int veces=0; y a continuación comprueba si es menor de 8 veces<8; si es menor le suma 1 veces++ y vuelve hacer el Bucle completo dentro del for.
La siguiente ocurrirá lo mismo y le sumara 1 seran 1+1=2 luego 2+1=3 y así respectivamente; con lo que cuando pase las 8 veces, se habrán sumado y cumplido la orden del for, y pasara a la orden siguiente?
En mi caso anterior, claro como la siguiente no existía comenzaba de nuevo el bucle del for desde 0

¿es mas o menos así?Huh

Usuarios navegando en este tema: 2 invitado(s)


Salto de foro: