Estoy usando el IDE de Arduino con arduino-tiny
( enlace ) en un ATTIny85 . Mi código está maximizando la memoria RAM, o eso parece:
Al agregar un solo String
a mi código, incluso si solo lleva un carácter, se produce un error de compilación:
(...)region 'text' overflowed by 452 bytes
La línea que agrego para llegar a esto es simple
String name2 = "A";
(...)
matrix.print(temp2 + name2);
Solo para comparación: el tamaño del código del archivo .hex
sin la Cadena es 7.430 Bytes, con la Cadena definida pero no utilizada es 8092 bytes, y se define y se usa para desbordarse. Esto parece ser demasiado, especialmente porque no parece importar si mi String es A
o ABCDEFG
: siempre obtengo el desbordamiento en 452 bytes.
¿Alguna idea de cómo solucionar esto? Intenté colocar el String en PROGMEM
, pero el matrix.print
no funciona con ningún método de recuperación que haya intentado (además de copiar en la RAM, pero luego, de nuevo, obtengo el desbordamiento). También he intentado eliminar la biblioteca GFX de Adafruit, pero parece que de todos modos solo se incorporan las partes necesarias a la compilación (ya que no hubo cambios en el tamaño de archivo .hex
).
El código completo, solo para darle una idea de lo que estoy haciendo (accediendo a Adafruit 8x8 LED matrix
, leyendo un valor de temperatura de a DS18S20
termómetro digital de 1 cable, que emite un emoticono de entrada y salida, la temperatura y el nombre de mi hijo a esa matriz de LED;), está aquí:
#include <TinyWireM.h>
#include <Tiny_LEDBackpack.h>
#include "Adafruit_GFX.h"
#include <avr/pgmspace.h>
#include <OneWire.h>
#define ONE_WIRE_BUS 4
OneWire ds(4); // on ATTiny85 pin 1
int buttonState = 0;
byte addr[8];
float temp;
static uint8_t PROGMEM
smile_bmp[] =
{ B00111100,
B01000010,
B10100101,
B10000001,
B10100101,
B10011001,
B01000010,
B00111100 };
Tiny_8x8matrix matrix = Tiny_8x8matrix();
void setup() {
matrix.begin(0x70); // pass in the address
matrix.setBrightness(1);
}
void loop() {
byte addr[] = { 0x28, 0xad, 0x3f, 0x51, 0x4, 0x0, 0x0, 0x2a };
temp = readTemperatureFromSensor(addr);
matrix.begin(0x70); // pass in the address
matrix.setBrightness(1);
for (int8_t c=1; c<=2; c++) {
for (int8_t x=1; x<=15; x++) {
matrix.setBrightness(x);
matrix.clear();
matrix.drawBitmap(0, 0, smile_bmp, 8, 8, LED_ON);
matrix.writeDisplay();
delay(50);
}
for (int8_t x=15; x>=1; x--) {
matrix.setBrightness(x);
matrix.clear();
matrix.drawBitmap(0, 0, smile_bmp, 8, 8, LED_ON);
matrix.writeDisplay();
delay(50);
}
}
matrix.clear();
matrix.writeDisplay();
delay(50);
String name2 = "A";
int temp2 = int(temp);
matrix.setBrightness(10);
matrix.setTextSize(1);
matrix.setTextWrap(false);
matrix.setTextColor(1);
for (int8_t x=0; x>=-24; x--) {
matrix.clear();
matrix.setCursor(x,0);
matrix.print(temp2 + name2);
matrix.writeDisplay();
delay(200);
}
}
float readTemperatureFromSensor(byte addr[])
{
byte i;
byte present = 0;
byte type_s;
byte data[12];
float celsius;
ds.reset();
ds.select(addr);
ds.write(0x44,1); // start conversion, with parasite power on at the end
delay(1000); // maybe 750ms is enough, maybe not
present = ds.reset();
ds.select(addr);
ds.write(0xBE); // Read Scratchpad
// reading the data from the sensor
for ( i = 0; i < 9; i++) { // we need 9 bytes
data[i] = ds.read();
}
// convert the data to actual temperature
unsigned int raw = (data[1] << 8) | data[0];
if (type_s) {
raw = raw << 3; // 9 bit resolution default
if (data[7] == 0x10) {
// count remain gives full 12 bit resolution
raw = (raw & 0xFFF0) + 12 - data[6];
}
} else {
byte cfg = (data[4] & 0x60);
if (cfg == 0x00) raw = raw << 3; // 9 bit resolution, 93.75 ms
else if (cfg == 0x20) raw = raw << 2; // 10 bit res, 187.5 ms
else if (cfg == 0x40) raw = raw << 1; // 11 bit res, 375 ms
// default is 12 bit resolution, 750 ms conversion time
}
celsius = (float)raw / 16.0;
return celsius;
}