Error read operation not supported for memory "flash" avrdude: failed to read all of flash memory, rc=-2

Buen día estimados, este es mi primera vez participando en el foro, esto surge puesto que me a nacido una duda frente a un error el cual se me a presentado, el error en especifico es

read operation not supported for memory "flash"
avrdude: failed to read all of flash memory, rc=-2

Este error nace al momento de enviar mi código de un programa el cual estoy realizando en conjunto con una aplicación móvil.
el código es el siguiente

#include <SoftwareSerial.h>
  #include <LiquidCrystal_I2C.h>
  #include "Adafruit_Sensor.h"
  #include "Adafruit_AM2320.h"
  #include <Separador.h>
  Separador s;
  SoftwareSerial BT(10,11); 
  Adafruit_AM2320 am2320 = Adafruit_AM2320();
  LiquidCrystal_I2C lcd(0x27,16,2);
  #define relefoco 2
  #define releventi 3
  #define relehumi 4
  char data = 0;
  int ht = "n";
  int Tmax,Tmin,Hmax,Hmin;
void setup() {
  
  // setup pantalla 
  lcd.init();
  lcd.backlight();
  lcd.clear();
  
  //setup sensor H/T
Serial.begin(9600);
  while (!Serial) {
    delay(10);
  }
  am2320.begin();
  
  // setup rele
  pinMode(relefoco, OUTPUT);
  pinMode(relehumi, OUTPUT);
  pinMode(releventi, OUTPUT);

  //setup BT
  BT.begin(9600);

  // mandar mensaje
  BT.println(F("Bienvenido !!"));

}

void loop() {
 int humedad = am2320.readHumidity();
 int temperatura = 30;
  if (BT.available()){
    RecibirPara();
  }
  if (humedad >= Hmax){
    digitalWrite (relehumi,1);
  }
  if (humedad <= Hmin){
    digitalWrite (relehumi,0);
  }
  if (temperatura <= Tmin){
    digitalWrite (releventi,1);
  }
  if (temperatura >= Tmax){
    digitalWrite (releventi,0);
  }
  
BTentrega();
MostrarPantalla();


}
void RecibirPara(){

  String datosBT = BT.readString(); //Lee mensaje enviado por BT
  String Tmax = s.separa(datosBT, ';',0);
  String Tmin = s.separa(datosBT, ';',1);
  String Hmax = s.separa(datosBT, ';',2);
  String Hmin = s.separa(datosBT, ';',3);
  String TimeLuzHig = s.separa(datosBT, ';',4);
  String TimeLuzLow = s.separa(datosBT, ';',5);
   
  return Tmax,Tmin,Hmax,Hmin,TimeLuzHig,TimeLuzLow;
   
  delay(500);
}
void BTentrega(){

  BT.print(F("temepratura: "));
  BT.println(am2320.readTemperature());
  BT.print(F("Humedad: "));
  BT.println(am2320.readHumidity());
  delay(500);
}
void MostrarPantalla(){
   lcd.setCursor(0,0);
  lcd.print(am2320.readTemperature());
  lcd.print(F("C"));
  lcd.setCursor(0,1);
  lcd.print(am2320.readHumidity());
  lcd.print(F("%HR "));
  lcd.setCursor(7,1);
  lcd.print(F("Vent: "));
  if(data=='1'){
  lcd.print(F("ON_"));  
  }
  if(data=='2'){
    lcd.print(F("OFF"));
  }
}

Este error, me ha iniciado al momento de realizar los if en el loop.

alguien tiene alguna noción de que puedo estar realizado mal, cabe recalcar que estoy utilizando un arduino nano y la aplicación para programar Ardunio IDE versión 1.8.16

Venia bien hasta encontrarme con esta librería asi que hasta que no indiques de donde la descargaste poco puedo decirte.
Es mas algo me dice que es la responsable del problema pero es pura intuición.

Buen día estimado, la Liberia desconozco su procedencia inicial, debido a que la sacado de un video de youtube, de todas maneras esta librería la ocupa para des concatenar un conjunto de parámetros que serán enviados como un único dato desde el dispositivo móvil hasta el Arduino, alguna manera de reemplazar dicha librería por alguna de otra procedencia o alguna función nativa de Arduino para realizar este acto, por consiguiente comparto la librería utilizada llamada separador.

//Creado por Pablo Sánchez (Ioticos) para ser compartido, modificado, mejorado sin necesidad de autorización alguna.
//Saludos!

#include <Arduino.h>

#ifndef Separador_h
#define Separador_h


class Separador {
public:

	Separador();
	String separa(String data, char separator, int index);

private:

};

#endif
//Creado por Pablo Sánchez (Ioticos) para ser compartido, modificado, mejorado sin necesidad de autorización alguna.
//Saludos!


#include <Arduino.h>
#include "Separador.h"

Separador::Separador()
{

}

String Separador::separa(String data, char separator, int index)
{
	int found = 0;
	int strIndex[] = {0, -1};
	int maxIndex = data.length() - 1;

	for (int i = 0; i <= maxIndex && found <= index; i++) {
		if (data.charAt(i) == separator || i == maxIndex) {
			found++;
			strIndex[0] = strIndex[1] + 1;
			strIndex[1] = (i == maxIndex) ? i + 1 : i;
		}
	}

	return found > index ? data.substring(strIndex[0], strIndex[1]) : "";
}

favor su ayuda, agradecido de su atencion, quedo atento a comentarios.

Bueno, ultimamente no uso el IDE pero en VSCode me compila sin problemas. Voy a subirlo al NANO a ver que hace.
El código compila sin errores y recibo salidas de cada procedimiento.

--- Miniterm on COM5 115200,8,N,1 ---
--- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---
NANO arrancando.
NANO BTentrega.
NANO Pantalla.
NANO BTentrega.

#include <Arduino.h>

#include <SPi.h>
#include <SoftwareSerial.h>
#include <LiquidCrystal_I2C.h>
#include "Adafruit_Sensor.h"
#include "Adafruit_AM2320.h"
#include <Separador.h>
Separador s;
SoftwareSerial BT(10,11); 
Adafruit_AM2320 am2320 = Adafruit_AM2320();
LiquidCrystal_I2C lcd(0x27,16,2);
#define relefoco 2
#define releventi 3
#define relehumi 4
char data = 0;
int ht = "n";
int Tmax,Tmin,Hmax,Hmin;

void RecibirPara();
void BTentrega();
void MostrarPantalla();

void setup() {
  
  // setup pantalla 
  lcd.init();
  lcd.backlight();
  lcd.clear();
  
  //setup sensor H/T
  Serial.begin(115200);
  Serial.println("NANO arrancando.");
  am2320.begin();
  
  // setup rele
  pinMode(relefoco, OUTPUT);
  pinMode(relehumi, OUTPUT);
  pinMode(releventi, OUTPUT);

  //setup BT
  BT.begin(9600);

  // mandar mensaje
  BT.println(F("Bienvenido !!"));

}

void loop() {
 int humedad = am2320.readHumidity();
 int temperatura = 30;
  if (BT.available()){
    RecibirPara();
  }
  if (humedad >= Hmax){
    digitalWrite (relehumi,1);
  }
  if (humedad <= Hmin){
    digitalWrite (relehumi,0);
  }
  if (temperatura <= Tmin){
    digitalWrite (releventi,1);
  }
  if (temperatura >= Tmax){
    digitalWrite (releventi,0);
  }
  
  BTentrega();
  MostrarPantalla();
}

void RecibirPara(){

  String datosBT = BT.readString(); //Lee mensaje enviado por BT
  String Tmax = s.separa(datosBT, ';',0);
  String Tmin = s.separa(datosBT, ';',1);
  String Hmax = s.separa(datosBT, ';',2);
  String Hmin = s.separa(datosBT, ';',3);
  String TimeLuzHig = s.separa(datosBT, ';',4);
  String TimeLuzLow = s.separa(datosBT, ';',5);
   
  return Tmax,Tmin,Hmax,Hmin,TimeLuzHig,TimeLuzLow;
   
  delay(500);
}
void BTentrega(){
  Serial.println("NANO BTentrega.");
  BT.print(F("temepratura: "));
  BT.println(am2320.readTemperature());
  BT.print(F("Humedad: "));
  BT.println(am2320.readHumidity());
  delay(500);
}
void MostrarPantalla(){
  Serial.println("NANO Pantalla.");
  lcd.setCursor(0,0);
  lcd.print(am2320.readTemperature());
  lcd.print(F("C"));
  lcd.setCursor(0,1);
  lcd.print(am2320.readHumidity());
  lcd.print(F("%HR "));
  lcd.setCursor(7,1);
  lcd.print(F("Vent: "));
  if(data=='1'){
  lcd.print(F("ON_"));  
  }
  if(data=='2'){
    lcd.print(F("OFF"));
  }
}

NOTA:
Tal vez tu NANO presente algun problema, pq no pruebas un código mas simple cualquiera?

1 Like

Tal vez está mal seteado el Nano.
Prueba con "old bootloader"

Saludos

1 Like

Lo primero para decirte es mira como se plantea el mismo problema en el foro en inglés. La persona pone toda la información para poder seguir de donde viene el problema.

Al final dice que es posible que su problema se deba a que tenía un ESP8266 conectado y como no tenia otra fuente tal vez eso provocaba el problema. Lo retiró y el problema desapareció.

Intenta a ver si tienes algo similar en tu caso.

1 Like

Estimados agradezco cada una de las ayudas que me han brindado, e podido solucionar el fallo, e desconectado toda alimentación que brindaba el Arduino tanto como a la pantalla, como al modulo bluetooth, posterior a esto e enviado el código nuevamente al Arduino pudiéndose subir correctamente.

Agradezco nuevamente a cada uno de ustedes.