Concurso de fotografía AM

Temática: «Una panorámica de tu acuario».
Ya esta abierto el plazo para presentar fotografías.

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
Programación C desde Cero.
Respuestas: 135    Visitas: 47942
#61
(04-01-2016, 04:07 PM)kabout escribió: A lo mejor me voy a meter donde no me llaman jajaja

Pues a lo mejor tienes razón.

Esto es un foro de acuarios y estamos intentando que usuarios sin conocimientos previos de ningún lenguaje de programación puedan entender un pequeño programa que gestione un arduino, para gestionar algunos de los equipamientos adjuntos a los acuarios.

No es un curso de programación en serio, no es un debate sobre si cual o tal es mejor.

Es simplemente para entender la sintaxis básica de un C++ capado que se utiliza para programar los módulos arduino.

Si nos vas a aportar ayuda a la hora de orientar a profanos iniciándose que han de ir paso a paso y resolver las dudas que se planteen bienvenido, pero si es para dialogar y debatir sobre cosas fuera de lugar a este nivel, mejor abres un post específico
#62
(04-01-2016, 08:26 PM)ArturoS escribió:
(04-01-2016, 04:07 PM)kabout escribió: A lo mejor me voy a meter donde no me llaman jajaja

Pues a lo mejor tienes razón.

Esto es un foro de acuarios y estamos intentando que usuarios sin conocimientos previos de ningún lenguaje de programación puedan entender un pequeño programa que gestione un arduino, para gestionar algunos de los equipamientos adjuntos a los acuarios.

No es un curso de programación en serio, no es un debate sobre si cual o tal es mejor.

Es simplemente para entender la sintaxis básica de un C++ capado que se utiliza para programar los módulos arduino.

Si nos vas a aportar ayuda a la hora de orientar a profanos iniciándose que han de ir paso a paso y resolver las dudas que se planteen bienvenido, pero si es para dialogar y debatir sobre cosas fuera de lugar a este nivel, mejor abres un post específico

Oído cocina Wink
#63
(04-01-2016, 08:08 PM)kabout escribió:
(04-01-2016, 07:48 PM)Antonio Castro escribió:
(04-01-2016, 04:07 PM)kabout escribió: A lo mejor me voy a meter donde no me llaman jajaja

Pero podríais buscar como programar un arduíno con un lenguaje un poco más sencillo que C, como puede ser C#. Seguro que se podrá hacer de forma más simple que no a tan bajo nivel.

Aquí, hay un ejemplo de ello.

Arduino es hardware libre usando software libre, y una gran parte de su exito viene de eso.

C#es un lenguaje propietario y para ser sincero nunca tuve ni la necesidad ni la curiosidad por aprenderlo pero puestos a explicar en qué consiste encontre a alguien que en pocas y sencillas palabras lo describe perfectamente.

Diferencias entr C, C++ y C#

El C# no ha tenido mucho éxito.

Si quieres aprender un lenguaje fácil juega un poquito con lenguaje Python.

¡¡Me has citado un post de hace más de 10 años!! Big Grin

A ver llevo trabajando 5 años con C# y creo que lo que comentas es bastante anticuado. C# se utiliza en multitud de desarrollos empresariales y no es propietario ya que tanto el framework como el IDE de desarrollo es completamente gratuito.

¿No ha tenido éxito? Este artículo es más actual. Podrás ver los lenguajes demandados en la actualidad.

Es una opción más dentro de la gran variedad de lenguajes de programación que existen.

Era un simple aporte, cada uno que programe con lo que más le guste!

¿Cinco años? Eso podría explicar tu postura. En 2012 llegó a lo más alto, incluso superó durante unos meses a C++ y por un momento algunos pensaron que seguiría subiendo, pero no fue así. Quizás el que está anticuado seas tú y te aconsejo que seas más comedido.

[Imagen: Tiobe_index.gif]

La imagen no viene de un sitio con intereses comerciales. Microsoft mueve mucha opinión a su favor a base de talonario. La imagen viene de la Wikipedia.

Yo agradezco tu opinión, pero te voy a dar la mía. C# continua siendo un lenguaje que está entre los 10 más importantes porque su propietario Microsoft ha malgastado una fortuna en intentar que triunfe.

Probablemente, lo que está pesando en su descenso sea que es un lenguaje propietario.

Opino que ni las funcionalidades de un programa ni los lenguajes de programación deberían tener derechos de autor. Los programas por el contrario sí. Faltaría más.

De todas formas esto no lo digo solo yo, lo dijo un asesor del Tribunal Europeo de Justicia, Yves Bot, que publicó su opinión en relación con el caso de SAS contra World Programming.

“Si se aceptara que una funcionalidad de un programa informático pudiera ser protegida como tal, eso equivaldría a que fuera posible monopolizar las ideas, en detrimento del progreso tecnológico y el desarrollo industrial”

Las ideas no tienen derechos de copyright ni son patentables, pero naturalmente Microsoft no opina lo mismo y las jugadas sucias le funcionaron muy bien durante un tiempo, pero le están creciendo los enanos y está perdiendo bastantes batallas importantes.

Si vienes para ayudar y aportar bienvenido.
#64
Antonio -please.gif-offtopic.gif-hk.gif-rules2.gif-orc.gif
#65
Aunque no aparezco por el post... no es que me he dado por vencido, estoy pendiente de vuestras discusiones Dodgy
Pero me estoy peleándome con el programa de pruebas, y buscando información, probando código, rompiendo lcd, led, corrigiendo fallos
Ya os breare con preguntas, lo bueno es que aquí romper es gratis-laughbounce2.gif
#66
(04-01-2016, 06:05 PM)rodazac escribió:
(04-01-2016, 04:56 PM)kabout escribió: Espero que te sirva de ayuda.

por supuesto que si!!!....toda ayuda o aclaración es bienvenida.


al final he puesto esto

void loop(){
Serial.println(LuzRoja=255 ,LuzVerde=255);
if (LuzRoja > 200)
{
Serial.println("rodazac");
}
else
{
Serial.println("luz tenue");
}

para colocar las llaves he tenido que buscar,
donde estaba un ejemplo parecido.para copiar su posición.

al final he puesto Serial.println en vez de Serial.print
para separar el texto

Serial.println(LuzRoja=255 ,LuzVerde=255);

Es muy curioso lo que que has puesto y aunque se aun poco avanzado para vuestro nivel, no me resisto a comentar la forma en que el compilador parece haber interpretado esto. El compilador ha conseguido darle una interpretación muy curiosa a esto .

El compilador está interpretando asignaciones como si fueran ademas de asignaciones fueran expresiones que pasan valor a Serial.println(...) Puede hacerlo porque aunque no sea frecuente las asignaciones pueden usarse de esa forma, como sifuera una expresión más. Son cosas rara que C permite para que el programador pueda optimizar el código pero no se recomienda usarlo como forma habitual porque perjudica la legibilidad del programa.

El caso más habitual y más legible es la asignación múltiple:

va= vb= vc= vd= 5;

Con esto se asignaría a las variables a,b,c y d pel valor 5, pero en un caso más general nada impide hacer cosas más raras del tipo:

va = 5 + (vb=4) + (vc=7);

Ademas de asignar el valor 7 a vc y el valor 4 a vb se usa como expresion y lo siguiente que hace el compilador una vez que evalua la expresión es continuar de la siguiente forma.

va = 5 + 4 + 7;

Y por último

va = 16;

Serial.println(LuzRoja=255 ,LuzVerde=255);

Es equivalente a hacer lo siguiente.
LuzRoja=255; // Asignación del valor 255 a la variable LuzRoja
LuzVerde=255; // Asignación del valor 255 a la variable LuzVerde
Serial.println(255 , 255);

Cuando Serial.println recibe dos valores enteros separados por una coma interpreta el segundo como tipo de representacion deseado

Serial.println(255, DEC); equivale a Serial.println(255); y muestra el valor en decimal, es decir 255. (es la forma más habitual).

Las constantes previstas y documentadas son estas: DEC, HEX, OCT, BIN, BYTE,

Has usado algo muy extraño
Serial.println(255 , 255); y te ha mostrado el resultado 10. Huh

He sentido curiosidad por saber como se definen las constantes usadas normalmente.


#define DEC 10
#define HEX 16
#define OCT 8
#define BIN 2
#define BYTE 0

Es decir:
Serial.println(255 , 10); mostraria 255 en formato decimal (el habitual) y daria 255
Serial.println(255 , 16); mostraria 255 en formato hexadecimal y daría FF.
Serial.println(255 , 8); mostraria 255 en formato octal y daría 377.
Serial.println(255 , 2); mostraria 255 en formato binario y daría 11111111.

Los humanos usamos el sistema de representación decimal (10 dígitos diferentes)
pero para los ordenadores algunas veces viene bien usar otros sistemas. Internamente en la memoria son ceros y unos (sistema binario).

Podeis usar una calculadora online para pasar de un formato a otro.
http://metricconversion.biz/es/conversio...meros.html

Lo curioso es que no has usado como base numerica una de las habituales.
Has dicho que te muestre 255 en base 255 y el resultado es 10.

Yo he recordado que N en base N da 10 y ese resultado me ha servido para explicar una instrucción misteriosa. Al final ha sido un reto y una vez resuelto me ha permitido aprender un poco más.

Yo lamento si alguien no se ha enterado, pero por lo menos he conseguido enterarme yo ja, ja. -nosweat.gif
#67
(04-01-2016, 09:51 PM)pedmar escribió: Aunque no aparezco por el post... no es que me he dado por vencido, estoy pendiente de vuestras discusiones Dodgy
Pero me estoy peleándome con el programa de pruebas, y buscando información, probando código, rompiendo lcd, led, corrigiendo fallos
Ya os breare con preguntas, lo bueno es que aquí romper es gratis-laughbounce2.gif

En efecto, para aprender da cierta tranquilidad es bueno saber que no va a echar humo ningún componente ja, ja. Big Grin

El emulador tiene la opción de ejectuar normalmente, es decir todo de corrido, pero pinchando el el bichito (opción depuración) te da opciones para poner puntos de parada de la ejecución y te da opción igualmente a ejecutar paso a paso el código.

Ejecutar de esa forma puede ayudaros para que percibais visualmente por donde va pasando la ejecución del programa instrucción a intrucción dando saltos de unas líneas a otras por culpa de las ciertas sentencias de control que son instrucciones que rompen la secuencia natural de ejecución línea a linea. Por ejemplo bucles, sentencias condicionales, llamadas a otras funciones, etc.

En el modo paso a paso, podéis ver que la ejecución del programa también hace sus paraditas en los comienzos de las funciones y en los finales de las mismas porque a nivel interno son instrucciones muy concretas para el compilador.

Creo que el emulador es un juguete bastante útil para aprender el lenguaje desde cero. Algunos no captáis con claridad el orden en que se van ejecutando las instrucciones.
#68
ufffff despues lo leo mas despacio.no me he enterado de nada
puede ser que
Serial.println(LuzRoja=255 ,LuzVerde=255);
en realidad seria Serial.println 250
pero el programa a puesto Serial.println 250,10


pero no lo entiendo por que he puesto esto
if (LuzRoja > 200)
{
Serial.println("rodazac");
}
else
{
Serial.println("luz tenue");
}

if (LuzVerde > 200)
{
Serial.println("arbol");
}
else
{
Serial.println("planta");
}

y cambia según modifico los valores
si pongo esto Serial.println(LuzRoja=255 ,LuzVerde=255);
escribe las palabras que le he puesto para valores altos

pero si el programa interpreta esto Serial.println(LuzRoja=255 ,LuzVerde=10);
no tendría que escribir.
para la luz roja la palabra de nivel alto
y para la luz verde la palabra de nivel bajo


leches que lio y me lo quería perder





y como se suele decir cada loco con su tema
he modificado unas cosillas, para dimear la luz roja .
pero va a ser que no -nosweat.gif-nosweat.gif-nosweat.gif

se compila, tarda mas en ejecutarse
pero el led se enciende de golpe
////////////////////////////////////////////////////////////////////////////
también he probado con esto
{
for (int LuzRoja=0;LuzRoja<= 255;LuzRoja++){
Serial.println(LuzRoja ,LuzVerde);
delay(10);
}

///////////////////////////////////////////////////////////////////////////
int LuzRoja = 0 , LuzVerde = 255;

void setup(){
Serial.begin(9600); // inicializar el puerto serial
while(!Serial); // Esperar a que esté preparado
Serial.println("Preparado");
pinMode(Pin_Led_Rojo, OUTPUT);
pinMode(Pin_Led_Verde, OUTPUT);
}

void loop(){

while(LuzRoja < 255){
delay(50);
LuzRoja ++;


}
Serial.println(LuzRoja ,LuzVerde);

delay(10);

if (LuzRoja > 200)
{
Serial.println("rodazac");
}
else
{
Serial.println("luz tenue");
}

if (LuzVerde > 200)
{
Serial.println("arbol");
}
else
{
Serial.println("planta");
}


que guerra doy....si saco los pies del tiesto decírmelo
antes de que me ponga muy pesado
#69
A:
Esas cosas de los puntos, las comas, los asteriscos.... por ahí sueltos, es lo que hace a un medio profano a veces volverse loco intentando interpretar que quiere hacerse con una instruccion, esto de C no es versatilidad es libertinaje.

R:
en "Serial.println(LuzRoja=255 ,LuzVerde=255);" según ha comentado Antonio asigna los valores a la variables: LuzRoja=255, LuzVerde=255

Por eso se cumplen los if > 200

otra cosa es que el C interprete la orden como: pinta_en_serial el num 255 en base 255, pintando un 10

Y esto "Serial.println(LuzRoja ,LuzVerde);" será pinta valor de luzroja en base valor de luzverde



Este bucle
Código:
while(LuzRoja < 255){
delay(50);
LuzRoja ++;


}

no tiene mas valor que un retraso, solo va sumando 1 hasta que luzroja llega a 255; creo que te falte meter un analogwrite para que te vaya subiendo la intensidad del led rojo.
O puede que la ultima } tenga que estar en la penultima linea del loop para que el bucle while incluya todas las sentecias


Para que te salgan bien los pintados haz así

Serial.print("Luz Roja: ");Serial.println(LuzRoja, DEC);
Serial.print("Luz verde: ");Serial.println(Luzverde, DEC);

Primero pinta un texto (entre "") y luego el valor entero de la variable en base decimal. Salta a linea siguiente y repite con la otra variable.

Serial.print pinta el texto y deja el cursor al final de lo pintado; Serial.println pinta y hace un salto de linea al final
#70
Disculpad el inciso.

(04-01-2016, 10:23 PM)Antonio Castro escribió: ...

Yo lamento si alguien no se ha enterado, pero por lo menos he conseguido enterarme yo ja, ja. -nosweat.gif

Un poco más y terminas hablando de matemática discreta y congruencias pero yo sí me he enterado. Un caso realmente curioso.

Os sigo, el tema está muy interesante, estos días atrás tenía tiempo y ganas de cacharrear, pero no PC y, ahora que tengo PC no tengo tiempo a penas. Sad

No obstante leí un texto antiguo de Antonio sobre como interpolar valores entre dos puntos y llevo unos días rumiando como usar la función gaussiana para que el encendido no sea tan lineal.
#71
(05-01-2016, 12:09 AM)ArturoS escribió: A:
Esas cosas de los puntos, las comas, los asteriscos.... por ahí sueltos, es lo que hace a un medio profano a veces volverse loco intentando interpretar que quiere hacerse con una instruccion, esto de C no es versatilidad es libertinaje.

R:
en "Serial.println(LuzRoja=255 ,LuzVerde=255);" según ha comentado Antonio asigna los valores a la variables: LuzRoja=255, LuzVerde=255

Por eso se cumplen los if > 200

otra cosa es que el C interprete la orden como: pinta_en_serial el num 255 en base 255, pintando un 10

Y esto "Serial.println(LuzRoja ,LuzVerde);" será pinta valor de luzroja en base valor de luzverde



Este bucle
Código:
while(LuzRoja < 255){
delay(50);
LuzRoja ++;


}

no tiene mas valor que un retraso, solo va sumando 1 hasta que luzroja llega a 255; creo que te falte meter un analogwrite para que te vaya subiendo la intensidad del led rojo.
O puede que la ultima } tenga que estar en la penultima linea del loop para que el bucle while incluya todas las sentecias


Para que te salgan bien los pintados haz así

Serial.print("Luz Roja: ");Serial.println(LuzRoja, DEC);
Serial.print("Luz verde: ");Serial.println(Luzverde, DEC);

Primero pinta un texto (entre "") y luego el valor entero de la variable en base decimal. Salta a linea siguiente y repite con la otra variable.

Serial.print pinta el texto y deja el cursor al final de lo pintado; Serial.println pinta y hace un salto de linea al final

Arturo, la asignación del valor 255 a cada una de las variables la hace cada vez que intenta imprimir los valores. Al obtener el valor de esa expresión que contiene la asignación esta ha de ejecutarse.

Existe un error muy común en C y que puede resultar difícil de detectar porque pasas la vista por encima del código y puedes no verlo. Consiste en usar '=' asignación en lugar de la comparación igual '=='. En cualquiera de los dos casos se puede interpretar como una expresión que puede proporcionar un valor entero y un valor entero puede interpretase como resultado de una expresión lógica.

Una expresión entera que tenga valor cero se interpretará como un valor false. Una expresión entera con valor distinto de cero se interpreta como valor true. Son cosas feas de C que pueden ser resultado de un error de programacion porque no hace falta usar cosas tan retorcidas en un programa normal.

Puedes probar con cosas como:

if (6){ // 6 es distinto de cero, por lo tanto se interpreta como true
...
}
#72
Creo que habría que volver a los planteamientos de base.
Estamos trabajando con variables de tipo entero declaradas como variables globales o como variables locales dentro de una función.

Un ejercicio que no sé si habeis intentado es el 4

A partir de dia del mes y més de nacimiento obtener signo zodiacal.

Os ayudo con algunas sugerencias.

En el ejercicio de los LEDS Verde y Rojo aprendimos a introducir dos números enteros desde el monitor serial. En esta ocasión, intruciremos igualmente dos números y los guardaremos en una variable global Mes y en otra Dia.

Ya hemos visto que ocurre cuando lo que queremos mostrar es un literal y no ponemos comillas dobles así que recordad usarlas para cosas como Serial.println("Acuario");

En un mes solo puede haber dos signos del zodiaco y los signos del zodiaco se corresponde con los meses y días del mes de la siguente forma.

(01) Acuario: 22 de enero - 21 de febrero
(02) Piscis: 22 de febrero - 20 de marzo
(03) Aries: 21 de marzo - 20 de abril
(04) Tauro: 21 de abril - 20 de mayo
(05) Géminis: 21 de mayo - 21 de junio
(06) Cáncer: 22 de junio - 22 de julio
(07) Leo: 23 de julio - 22 de agosto
(08) Virgo: 23 de agosto - 21 de septiembre
(09) Libra: 22 de septiembre - 22 de octubre
(10) Escorpio: 23 de octubre - 21 de noviembre
(11) Sagitario: 22 de noviembre - 22 de diciembre
(12) Capricornio: 23 de diciembre - 21 de enero

Por eso habrá que preguntar primero por cada uno de los meses y en caso de localizar un mes preguntaremos que día es y con eso ya estaría todo.

Hay varias formas de hacerlo. Usaremos las sentencias condicionales if, else que ya conocemos. Para hacer este programa hace falta hacer muchas preguntas if, else y algunas de ellas hay que colocarlas dentro de otras. Os ayudo un poco.

Código:
if (Mes==1){
   if (Dia<22){
         Serial.println("Capricornio");
   else{
         Serial.println("Acuario");
   }
}
else if (Mes==2){
     ...
}
...
...
...
else if (Mes==12){
     ...
}
else{
      Serial.println("Error: Mes fuera de rango (1..12)");
}
Si no funciona bien, ejecutando paso a paso, podreis ver como va funcionando el programa y detectar fallos.

Ánimo.
#73
No sería mas entendible usar una estructura Switch Case con case a nº mes y dentro de cada case un if para control del día.

Las estructuras if-else-if son muy potentes pero un poco liosas si se anidan muchas, acabas metiendo la pata y no las anidas bien.

Código:
switch (mes) {
    case 1:
       if (Dia<22) Serial.println("Capricornio");
       else Serial.println("Acuario");
       break;
    case 2:
       if (Dia<22) Serial.println("Acuario");
       else Serial.println("Piscis");
       break;
//............
   }
#74
Aún no se había hablado de ello.

Evidentemente es bastante mejor, me consta que lo sabes hombre. Queda mucho más clarito, pero tenemos volver a lo elemental porque ni siquiera han practicado ahora lo suficiente con las instrucciones condicionales if else.

Quiero que usen las estructuras if else que son básicas y versátiles para que las ejecuten paso a paso con el depurador y se hagan una idea de como funciona un programa con bifurcaciones y poco a poco irán pillando como funciona un programa.

Las estructura condicional switch case viene siempre muy bien cuando se trata de decidir que acción ejecutar en funcion de un valor concreto de una variable. En este caso con el Mes podemos usar switch case, pero con la variable Dia no, porque la comparación no se hace en terminos de preguntar por si es igual a algún valor, sino de comparar si es menor o no.

Como premio por adelantarte, te nombro profesor adjunto, ja, ja. -nosweat.gif.

Piensa en algo muy facilito que puedan hacer con lo visto hasta ahora porque prefiero que avancen despacio y consolidando lo que aprendan. Cuidadin Arturo, faaaaciiiliiitooo -happy.gif Intenta de momento evitar introducir conceptos nuevos, o tipos de datos nuevos, en la medida que sea posible claro, porque unos pocos conceptos sencillos pueden dar mucho juego inicialmente y ayudan a suavizar la curva de aprendizaje que para los que parte de cero es como intentar trepar por una pared.

Echaré mano de ti, si no te importa, porque cada vez tengo en marcha más cosas y una ayudita tuya para estos primeros pasos que tú ya dominas me vendría muy bien si a ti te apetece. Cualquier duda me contactas directamente y me preguntas.
#75
Estoy últimamente tratando de entender como funcionan las entradas y salidas de arduino
El tema de variables mas o menos lo entiendo, pero este mismo tema me ha llevado a tratar de entender el tema de 1 byte 2, 16, 32 etc...por que aunque parece un concepto sencillo me esta costando un poco asimilar.

este es el ultimo codigo que he realizado para entender un poco como funcionan las entradas analorRear.
Código:
/*PRUEBA DE SALIDAS ANALOG*/

/* El voltaje de salida del sensor
  es interpretado por el Arduino con valores (donde 0V es 0 y 5V es 1023).
  Para poder convertir estos valores nuevamente a voltios: hay que multiplicar
  el valor por 5(que son los 5 Voltios máximos de señal que da el sensor)
  dividirlo por 1023 que es el entero más grande en un rango de 10 bits. Luego
  tenemos que convertir este voltaje en grados centígrados.
  Ahora tenemos que 10mV son 1ºC.
  Si multiplicamos estos 10mV por 100, tendremos que 1V son 1ºC. */  
  
void setup() {
Serial.begin(9600);
pinMode(13,OUTPUT);



}
void loop() {

int potencio=analogRead(A0);//variable de potenciometro
  int sender=analogRead(A1);//variable de sensor temperatura
digitalWrite(13,HIGH);
  delay(500);
  Serial.println(potencio);//envia el dato en bits de 0-1023
  delay(2000);
  sender = analogRead(A1); //Lee los datos del sensor LM35
  sender = (5.0 * sender * 100)/1023.0;//formula:ºC =valor X 5 X 100 /1023
  Serial.println(sender);//envia datos del sensor al monitor serial
    
  delay(2000);
  
  
}

La verdad es que quizás meto mucho testo en los códigos,¿?¿?¿?¿? pero este me ayuda a entender el paso a paso.
Acepto como siempre cualquier tipo de critica sobre mi intento de entender todo este mundo. Pero por favor ser benévolos con mi ignorancia; y que sepáis que aunque cada vez entiendo mas lo que comentáis...Aún paso un buen rato leyendo y desglosando las repuestas de algunos-pardon.gif...

Usuarios navegando en este tema: 2 invitado(s)


Salto de foro: