Ajuda com Progmem

Olá, tenho a um arduino Standalone que montei, para controle de alguns sensores em um projeto que estou criando, porem, porem preciso gravar na memoria, os dados de alguns instantes antes de uma falha de energia, li que isto pode ser feito na EEPROM, porem ela tem um limite de memoria meio baixo, e um limite de leituras e escritas, depois li algo sobre a função PROGMEM, para gravar dados na memória flash, q qual, segundo o site do Arduino, não é volatil tambem, fiz a programação para utilizar este método, porem, estou com problemas na leitura dos dados da memória quando realimento a placa, erro que diz que a variavel não existe ainda. meu código está abaixo

#include <avr/pgmspace.h>

pinAlarm = 2;
char myChar;
int i;

void setup(){
 // myChar =  pgm_read_byte_near(signMessage); 
  pinMode(pinAlarm,INPUT);
}

void loop(){
  if (pinAlarm == LOW){
    prog_uchar signMessage[] PROGMEM  = {"Teste de Gravação"};
  }
}

Você pode colocar um módulo SD, e então quardar as informações no mesmo.

Ou então usar a EPROM Library que é bem fácil...

segue ... http://www.arduino.cc/en/Reference/EEPROM

Olá.
Pelo que eu li e entendi no site de referencia PROGMEM - Arduino Reference
Vc só pode armazenar durante a compilaçao e gravaçao no Arduino, ou seja, vc nao vai conseguir escrever dados na flash depois de carregado o programa.Vc só conseguirá ler os dados.
A saida mais facil é escrever na EEPROM mesmo. Ou vc pode comprar um shield SD como já disseram.

Ola pessoal, sou novo aqui no forum e tambem sou iniciante de eletronica e Arduino. Estava a procura exatamente disso, gravar valores ajustados em tempo de execucao e posteriormente ser lido o ultimo valor na inicializaçao do programa. Sera muito util no meu projeto. Quero compartilhar aqui um exemplo disso para pessoas que procuram por isso. Se tever algo errado por favor me corrijam. Espero ter ajudado. Abraço as todos

///
//Autor: Jordan
//Data:  13/02/2012
//
//Funciona da seguinte forma: digitanto o numero "1" decrescenta 100 ms do valor da variavel "tempo" e o numero "2" acrescenta 100 milisegundos. Em seguinda o valor é gravado
// na EEPROM. Durante a cada inicializacao do programa, o valor gravado na EEPROM do ultimo ajuste de tempo sera atribuido na variavel "tempo".
// carregaConfig() // Ler o ultimo valor em milisegundos gravado na EEPROM

#include <EEPROM.h>

int pin = 13; //Pino 13
int tempo = 1000; // Valor me milisegundos (1 segundo)
//boolean first = true;

void carregaConfig()
{
  int v = 0; // valor que foi gravado na EEPROM será atribuido aqui.
  for(int b = 0, c = 0; b < 16; b+=8, c++) // "b" é a posicao do bit para o deslocamento. No caso o deslocamento é feito de 8 em 8 bits ou 1 Byte. "c" contador para o indice do vetor "read".
  {                                        // 16 é a quantidade de bits retirado do vetor que no caso pode ser utilizado em uma variavel inteiro de 16 bits ou maior. caso necessite de 32 bits é só ajustar.
    v |= (EEPROM.read(c) << b); // Aqui é acrescentado cada Byte do vetor "read" na variavel inteiro "v" e assim formando o numero.
  }
  Serial.print("EEPROM Read = ");
  Serial.print(v);
  Serial.println();
  tempo = v;  //Atribuindo o valor ja inteiro que foi gravado na EEPROM a variavel de tempo em milisegundos.
}

void setup()
{
  Serial.begin(9600);
  pinMode(pin, OUTPUT);
  carregaConfig();
}

void loop()
{   
  if(Serial.available() > 0)
  {
    char val = Serial.read();
    Serial.println(val);
     
    switch(val)
    {
      case '1':
        tempo -= 100;
         break; 
      case '2':
        tempo += 100;
        break;
    }
    if(tempo <= 0) // Valor minimo de tempo é 100 milisegundos (0,1 segundo).
      tempo = 100;
    if(tempo >= 2000)
      tempo = 2000; // Valor minimo de tempo é 2000 milisegundos (2 segundos).
      
    for(int b = 0, c = 0; b < 16; b+=8, c++) // "b" é a posicao do bit para o deslocamento. No caso o deslocamento é feito de 8 em 8 bits ou 1 Byte. "c" contador para o indice do vetor "read".
    {                                        // 16 é a quantidade de bits retirado do vetor que no caso pode ser utilizado em uma variavel inteiro de 16 bits ou maior. caso necessite de 32 bits é só ajustar.
      EEPROM.write(c, (tempo >> b) & 0xFF); // Aqui é acrescentado cada Byte do numero inteiro com seu respectivo indice no vetor da EEPROM.
    }
  }  
  
  //pisca o LED do pino 13 (se utilizando Arduino).
  digitalWrite(pin, HIGH);
  delay(tempo);
  digitalWrite(pin, LOW);
  delay(tempo);  
}