consulta de código de novato = Arduino & DS18B20

3

he estado usando picaxe durante algunos años, pero ahora toca con arduino y trato de aprender cómo funciona todo.

Tengo un par de arduinos que hablan a través de la biblioteca HOPERF con éxito y ahora quiero enviar algunos datos significativos a través del enlace.

Tengo el código para el DS18B20 ejecutándose en el cliente aurduino e "imprimiendo" el valor de temperatura en la PC a través de USB, pero simplemente no estoy seguro de cómo introducirlo en los comandos HOPERF para enviarlo por RF. Aquí está un poco del código. La segunda línea es donde se envían los datos a través de HOPERF. Lo que debo hacer es reemplazar la cadena "prueba" con los datos devueltos por el comando (sensores.getTebyCByIndex (0)) de la 4ª línea.

sensors.requestTemperatures();            // Send the command to get temperatures
client.sendto(11, (uint8_t*)"test\n", 6); // Includes the NUL at the end of the string
Serial.print("sending\n");
Serial.print(sensors.getTempCByIndex(0)); //prints the temp value over the USB

¿Alguna pista a alguien? Prefiero aprender, pero haciendo cosas como esta, ¡y sí, primero hice la cosa de "BLINK"! Encuentro que hacer algo que me parece útil me ayuda a aprender más rápido :-)

Estoy luchando un poco con la elaboración de los documentos, ya que no parece haber un buen "manual", y los picaxes siguen :-(

    
pregunta Stocky6409

4 respuestas

2

En C, casi cualquier tipo de datos puede representarse como una matriz de bytes. Sin entrar en un curso completo sobre tipos de datos y punteros en C (de todos modos no estoy calificado para hacerlo), lo siguiente debería funcionar en el extremo de transmisión:

float tempC = sensors.getTempCByIndex(0);
client.sendto(11, (uint8_t *)&tempC, sizeof(tempC));

En el extremo receptor, harías algo como esto:

float tempC;
server.recv((uint8_t *)&tempC, sizeof(tempC));
    
respondido por el blalor
1

Es posible que desee pasar un tiempo aprendiendo C o C ++ en una PC primero, con un curso / libro de programación estándar, antes de comenzar a agregar cosas más complejas como microcontroladores y enlaces de RF y USB, etc. Sin una base sólida, se encontrará con muchos problemas como este donde se quedará atascado en los elementos más básicos. Por supuesto, si su objetivo es simplemente juntar rápidamente este elemento, y no quiere perder tiempo aprendiendo o planeando usar estas habilidades a largo plazo, entonces mi sugerencia podría no ser útil.

Aquí hay un libro gratuito al azar en C ++: Pensando en C ++

    
respondido por el davr
0

¿Qué devuelve a sensores.getTempCByIndex (0)? Si se trata de una cadena, deberías poder lanzarla de la misma manera que la cadena de prueba.

Si no es un número (¿flotante?), ¿el segundo argumento de client.sendto () tiene que ser un uint8_t *? ¿Puedes lanzar de uno a otro?

¿Necesitas lanzarlo? No sé si la función client.sendto () y lo que sea que la esté recibiendo están en la biblioteca o están escritos por usted. Si los ha escrito, podría modificarlos para que acepten el tipo de valor devuelto por sensores.getTempCByIndex (0), entonces no necesitaría una conversión.

[EDITAR (en respuesta a los dos primeros comentarios a continuación)] Sé que los bocetos de Arduino son un subconjunto de C, pero no estoy seguro de qué bits de C funcionan y cuáles no. Hay una discusión aquí sobre cómo lanzar un flotador (número de punto flotante) a un cadena en el Arduino, pero parece estar diciendo que el método puede requerir mucha memoria. Básicamente, una conversión se realiza cuando cambias el tipo de una variable (por ejemplo, float - > string), en C, normalmente lo haces poniendo el nuevo tipo entre corchetes que precede a la variable a cambiar.

Mirando el código que tienes:

client.sendto(11, (uint8_t*)"test\n", 6);

que parece estar lanzando la cadena "test \ n" (normalmente llamada literal de cadena) a un uint8_t *, que parece ser un puntero a un byte de datos de 8 bits o posiblemente el primer byte de una matriz de uint8_t bytes. Supongo que toda esta llamada a la función está convirtiendo la cadena en 6 bytes para transmitir, siendo 6 la longitud de la cadena.

¿El receptor decodifica automáticamente el mensaje de nuevo a una cadena? Los comentarios en el código fuente de su biblioteca parecen sugerir que puede enviar cualquier dato codificado en binario como el paquete en su datagrama / mensaje, así que en lugar de convertir su flotante existente en una cadena, podría convertir la parte del número entero en un entero y Envíelo, luego tome los primeros 2 o más dígitos de la parte decimal y envíelos como un entero y luego reconstruya el flotador en el extremo lejano.

En la parte inferior de esta página se menciona la función estándar de C, itoa, que se utiliza para convertir un número entero. (número entero) a una cadena ascii, si puede dividir su número en una parte de número entero y una parte decimal, puede codificarlos usando esto como una cadena y concatenarlos (el programador de computadoras habla para unirlos) en "wholenumberstring" + " . "+" cadena decimal "y luego coloque la cadena resultante en client.sendto () asegurándose de que el argumento final para client.sendto () sea la longitud de la cadena recién formada. También le indica en esa página cuál será la sobrecarga en términos de memoria al usar diferentes implementaciones de itoa.

Un pensamiento adicional, ¿cómo están entrando sus datos de temperatura en el Arduino? ¿Obtiene un valor flotante o realmente obtiene un valor analógico (por ejemplo, en el rango de 0 a 255 según la resolución) que luego se convierte a un valor decimal. Podría ser más fácil enviar los datos sin procesar como una cadena a través del enlace y convertirlos en el otro extremo.

    
respondido por el Amos
0

Gracias a todos los que contribuyeron. Mi código funciona y he aprendido sobre hardware serie, rf comms, software serie, cast, float, serial LCD y dallas onewire, todo en 2 días :-)

    
respondido por el Stocky6409

Lea otras preguntas en las etiquetas