Leonardo COM desaparecido tras no iniciar automaticamente codigo.

Buenas a todos, este es mi primer mensaje (siento la falta de tildes o enies...escribo desde teclado UK)

Me decido a escribir porque tras buscar por google in en los foros no he sido capaz de solucionar el problema, diria que casi ni entiendo alguna de las soluciones.

Resumen>

La mayoria de los topics son porque el PC deja de reconocer la placa Leonardo completamente y los LEDS L y green quedan congelados. Mi caso es distinto, puesto que en el IDE sigo viendo el puerto COM5 y el LED naranja L no esta encendido. Pero usando el COM5 no puedo cargar programas.

Descripcion del problema y antecedentes.

La placa funcionaba perfectamente, escribi el sketch, lo cargue' y lo he tenido funcionando 48 horas, ya que es un sensor que necesita calentarse. Todo este tiempo la placa ha estado conectada al PC via USB y he estado viendo las lecturas del sensor tanto por el Serial Monitor como por la pantalla LCD.

Tras calibrar el sensor, decidi' llevar todo a dentro del laboratorio para empezar a usarlo. Conecte la placa a un cargador USB (iPad) y todo se encendio'...sin embargo la pantalla LCD no mostraba nada, tan solo estaba iluminada.

Me lleve la placa de vuelta al PC la volvi a conectar y esta vez ni tan siquiera me aparecio el puerto COM3 que es el que aparece con arduino para subir sketches, tan solo aparecia el puerto COM5 y el Sketch pre-cargado no funcionaba.

Tras mucho buscar descubri' que la placa Leonardo tiene varios problemas con la simulacion de USB y que algunos Sketches pueden romper el "bootloader" Pero no encuentro por ninguna parte como exactamente un sketch puede romper el arranque ni como evitarlo

Para complicar las cosas, veo en todos los hulos que la unica forma de arreglar una placa que no reconoce el PC es programarla por ICSP usando otra placa arduino, cosa que no tengo.

Asi que tengo la esparanza de que esto tenga solucion ya que el COM5 sigue apareciendo.

Me compre' la placa Leonardo pensando que era la actualizacion de la UNO, ahora se que no es cierto y que la UNO me habria sido mucho mas sencilla de usar.

Preguntas

?Puedo solucionar el problema sin tener que comprar una segunda placa?
?Como modificar mi codigo para que esto no ocurra otra vez?
?Esta relacionado con que no iniciase automaticamente?

Os dejo el codigo que use tanto embebido como con link a GitHub. (Soy aun novato en todo esto y este tipo de problemas estan siendo un mundo para mi... )

Link: GitHub - Ravenneo/CO2-sensor: Lab CO2 Sensor
Codigo:

// Include Libraries
#include "Arduino.h"
#include "LiquidCrystal_PCF8574.h"
#include "MQ135.h"

// Pin Definitions



// Global variables and defines
// There are several different versions of the LCD I2C adapter, each might have a different address.
// Try the given addresses by Un/commenting the following rows until LCD works follow the serial monitor prints.
// To find your LCD address go to: http://playground.arduino.cc/Main/I2cScanner and run example.
//define LCD_ADDRESS 0x3F
#define LCD_ADDRESS 0x27
// Define LCD characteristics
#define LCD_ROWS 2
#define LCD_COLUMNS 16
#define SCROLL_DELAY 150
#define BACKLIGHT 255
// object initialization
LiquidCrystal_PCF8574 lcdI2C;

// MQ135 gas sensor
//
// Datasheet can be found here: https://www.olimex.com/Products/Components/Sensors/SNS-MQ135/resources/SNS-MQ135.pdf
//
// Application
// They are used in air quality control equipments for buildings/offices, are suitable for detecting of NH3, NOx, alcohol, Benzene, smoke, CO2, etc
//
// Original creator of this library: https://github.com/GeorgK/MQ135

#define PIN_MQ135 A2
MQ135 mq135_sensor = MQ135(PIN_MQ135);

float temperature = 21.0; // assume current temperature. Recommended to measure with DHT22
float humidity = 25.0; // assume current humidity. Recommended to measure with DHT22

void setup() {
  Serial.begin(9600);
  while (!Serial) ; // wait for serial port to connect. Needed for native USB
  Serial.println("start");

  // initialize the lcd
  lcdI2C.begin(LCD_COLUMNS, LCD_ROWS, LCD_ADDRESS, BACKLIGHT);
}
// Main logic of your circuit. It defines the interaction between the components you selected. After setup, it runs over and over again, in an eternal loop.

void loop()
{
  float rzero = mq135_sensor.getRZero();
  float correctedRZero = mq135_sensor.getCorrectedRZero(temperature, humidity);
  float resistance = mq135_sensor.getResistance();
  float ppm = mq135_sensor.getPPM();
  float correctedPPM = mq135_sensor.getCorrectedPPM(temperature, humidity);

  Serial.print("MQ135 RZero: ");
  Serial.print(rzero);
  Serial.print("\t Corrected RZero: ");
  Serial.print(correctedRZero);
  Serial.print("\t Resistance: ");
  Serial.print(resistance);
  Serial.print("\t PPM: ");
  Serial.print(ppm);
  Serial.print("\t Corrected PPM: ");
  Serial.print(correctedPPM);
  Serial.println("ppm CO2");
  lcdI2C.clear();                          // Clear LCD screen.
  lcdI2C.print("CO2 Gas Sensor");                   // Print print String to LCD on first line
  lcdI2C.selectLine(2);                    // Set cursor at the begining of line 2
  lcdI2C.print(correctedPPM);                   // Print print String to LCD on second line
  lcdI2C.print("ppm CO2");
  delay(10000);

}

Error que me aparece si intento subir un simple Blink usando COM5 incluso con el truco de mantener reset y soltar:

Arduino: 1.8.9 Hourly Build 2019/02/04 10:33 (Windows 10), Board: "Arduino Leonardo"

Sketch uses 4130 bytes (14%) of program storage space. Maximum is 28672 bytes.
Global variables use 149 bytes (5%) of dynamic memory, leaving 2411 bytes for local variables. Maximum is 2560 bytes.

avrdude: butterfly_recv(): programmer is not responding
avrdude: butterfly_recv(): programmer is not responding
avrdude: butterfly_recv(): programmer is not responding
avrdude: butterfly_recv(): programmer is not responding
avrdude: butterfly_recv(): programmer is not responding
Found programmer: Id = "�"; type = �
    Software Version = i.

Respecto a mis tres preguntas, parece que puedo autoresponderme una de ellas...

?Esta relacionado con que no iniciase automaticamente?

Aparentemente la placa Leonardo tiene dos seriales. serial y serial1. Serial se usa para crear el COM3 virtual y serial1 para los I/O (?)

Si mi co'digo era:

void setup() {
  Serial.begin(9600);
  while (!Serial) ; // wait for serial port to connect. Needed for native USB
  Serial.println("start");

Puede que me haya cargado el COM virtual USB quizas deber'ia haber usado algo as'i como...

void setup() {
  Serial1.begin(9600);
  while (!Serial1) ; // wait for serial port to connect. Needed for native USB
  Serial1.println("start");

Y luego todo serial1.print etc etc.... todo esto es guessing porque la verdad es que no tengo mucha idea, pero quiz'as a alguien le sea util.

He encargado una placa UNO para usar el mismo co'odigo, espero que funcione si el cableado lo hago igual. La leonardo no tengo ni idea de como arreglarla encontre' este tutorial en youtube...pero no me atrevo a probarlo por ahora

Pues nada, vuelvo a responderme a mi mismo por si es de ayuda para alguien en el futuro.

Sensor MQ135 Placa Arduino UNO LCD+I2C funciona perfectamente, el problema viene con la placa Leonardo.

He escrito lo que mi conocimiento me permite en el Read me de mi Github ( GitHub - Ravenneo/CO2-sensor: Lab CO2 Sensor )

Si alguien pudiese confirmar lo del serial-serial1 en el code para Leonardo, lo actualizare..ya que mi leonardo ha quedado inusable y no puedo comprobarlo.