Hola a todos, tengo una duda que debe ser muy básica:
¿Cómo se cuanto espacio de memoria me ocuparia almacenar una línea de datos como esta?
" 13º Lunes 24 Marzo 12:33:21", quiero hacer un datalogger y quiero ver si me conviene una gran EEPROM o necesito de una microSD, dependiendo claro de la frecuencia con que almacene datos.
mmm creo entender todo, es decir que debo tratar todo como numeros...mes (1 a 12), dia del mes (1 a 31), dia de la semana (1 a 7) y asi...para la temperatura eso si, debo darme un rango entre los -8º y 40º, por lo que suponiendo una resolución de 1º, necesitaría 48 estados, esto es 5 bits. Voy bien??
Ahora, esta manera que me dices, me serviría solo a mí que se como programe la palabra de X bits. ¿Podría también almacenar todo como caracteres??? De manera de que cualquier mortal pueda leer los datos almacenados?
Cuando lea los datos voy a tener una serie de cadenas de 0 y 1, como puedo hacer para traducirlas una vez que tenga por ejemplo 200 cadenas de datos, es decir 200 mediciones. ¿tendría que hacer un programa que las lea y me las muestre en caracteres ASCII?
Alcafuz:
¿tendría que hacer un programa que las lea y me las muestre en caracteres ASCII?
Efectivamente. Lo mejor es que te hagas una librería para tratar las palabras y así guardarlas y leerlas a tu antojo.
flico:
1 byte temperatura
2 byte Dia de la semana del 0-7
3 byte dia
4 byte mes del 0-12
5 byte hora
6 byte minuto
7 byte segundo
Es más aconsejable trabajar a nivel de bits, ya que de esta manera se desperdicia muchísima memoria y no es que se tenga mucha eeprom. Por ejemplo ¿para que utilizar un byte para almacenar el día de la semana si con sólo 3 bits es posible obtener el mismo resultado?
Hola,
en C se pueden usar los campos de bits, que pueden servir para optimizar el uso de memoria. En este caso, se podría definir una estructura que engloba los datos mencionados
struct datos_byte
{
int temperatura: 7; // 128 estados
unsigned int semana: 3; // 7 estados
unsigned int dia_mes: 5; // 31 estados
unsigned int nombre_mes: 4; // 12 estados
unsigned int hora: 5; // 24 estados
unsigned int minutos: 6; // 60 estados
unsigned int segundos: 6 ; // 60 estados
} datos;
Hola,
he hecho un programilla de empaquetado de datos (temperatura, semana, dia de mes, nombre de mes, hora, minuto, segundo) utilizando campos de bits (ocupa 5 bytes). Se les da unos valores arbitrarios, y se muestran los valores por puerto serie.
struct datos_byte
{
int temperatura: 7; // 128 estados
unsigned int semana: 3; // 7 estados
unsigned int dia_mes: 5; // 31 estados
unsigned int nombre_mes: 4; // 12 estados
unsigned int hora: 5; // 24 estados
unsigned int minutos: 6; // 60 estados
unsigned int segundos: 6 ; // 60 estados
} datos;
void setup()
{
Serial.begin(9600);
}
void loop()
{
// dando valores arbitrarios
datos.temperatura = 37;
datos.semana = 1;
datos.dia_mes = 2;
datos.nombre_mes = 3;
datos.hora = 4;
datos.minutos = 5;
datos.segundos = 6;
Serial.print("\n-----------------------\n");
Serial.print("sizeof(datos): ");
Serial.print(sizeof(datos), DEC);
Serial.print("\n-----------------------\n");
Serial.print("temperatura: ");
Serial.println(datos.temperatura, DEC);
Serial.print("datos.semana: ");
Serial.println(datos.semana, DEC);
Serial.print("datos.dia_mes: ");
Serial.println(datos.dia_mes, DEC);
Serial.print("datos.nombre_mes: ");
Serial.println(datos.nombre_mes, DEC);
Serial.print("datos.hora: ");
Serial.println(datos.hora, DEC);
Serial.print("datos.minutos: ");
Serial.println(datos.minutos, DEC);
Serial.print("datos.segundos: ");
Serial.println(datos.segundos, DEC);
delay(3000);
}
Es más aconsejable trabajar a nivel de bits, ya que de esta manera se desperdicia muchísima memoria y no es que se tenga mucha eeprom. Por ejemplo ¿para que utilizar un byte para almacenar el día de la semana si con sólo 3 bits es posible obtener el mismo resultado?
Tambien tienes razon, usando estos bits podria ahorrar el uso de memoria. No?
Dia 0-31 5 bits
Mes 0-12 4 bits
hora 0-23 5 bits
minuto 0-60 6 bits