Error al pasar codigo a Arduino Nano (pero funciona en UNO)

Buenas.

Tengo un codigo introducido en un arduino uno que funciona correctamente, pero cuando lo paso a un NANO me da el siguiente error y no se sube correctamente:

C:\Users\usuario\Downloads\Codigo_Definitivo__con_led_\Codigo_Definitivo__con_led_.ino: In function 'void DecodeerPauze(long int)':

C:\Users\usuario\Downloads\Codigo_Definitivo__con_led_\Codigo_Definitivo__con_led_.ino:88:14: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]

    Print(" "); Serial.print(" ");

             ^

He probado a subir al nano un blink y funciona correctamente, por lo que el error no es del driver. Las conexiones al LCD son las correctas, las he repasado mil veces pero creo que el fallo esta en los dos errores anteriormente citados.

¿Que es lo que ocurre?

Muchas gracias de antemano, un saludo.

Buenas. El código es el siguiente. Como digo en UNO funciona perfectamente pero al pasarlo a NANO da error y no funciona, no se si tengo que adaptar algo.

#include <Wire.h>
#include <LiquidCrystal.h> 

#define SLEUTEL 10  
#define BUZZER 12 
#define LED 11  

LiquidCrystal lcd(7,6,5,4,3,2);

void setup() {
  pinMode(SLEUTEL, INPUT_PULLUP);
  pinMode(BUZZER, OUTPUT);
  pinMode (LED, OUTPUT);
  Serial.begin(115200);
  lcd.begin(16,2);
       
}

float StreepDuur = 200.0;
boolean PrevS = false;
long tStartTeken, tStartPauze;
boolean S;
String kar = "";
void loop() {
  S = !digitalRead(SLEUTEL);

  if (S) {
    if (S != PrevS) {
      tStartTeken = millis();
      DecodeerPauze(tStartPauze);
    }
    digitalWrite(BUZZER, HIGH);
    digitalWrite(LED, HIGH);
  }
  else {
    if (S != PrevS) {
      tStartPauze = millis();
      Decodeer(tStartTeken);
    }
    digitalWrite(BUZZER, LOW);
    digitalWrite(LED, LOW);
  }

  if (abs(millis() - tStartPauze) > StreepDuur * 10) {
    DecodeerPauze(tStartPauze);
  }

  PrevS = S;
}

void Decodeer(long starttijd) {
  char teken = '?';
  long tijd = abs(millis() - starttijd); 
  float PuntDuur = StreepDuur / 3.0;

  if (tijd <= 4) return; 

  if (tijd <= PuntDuur) teken = '.';
  else if (tijd > StreepDuur) teken = '-';
  else if ((tijd > (StreepDuur + PuntDuur) / 0.3) && tijd <= StreepDuur) teken = '-';
  else teken = '.';

  if (teken == '-') {
    if (tijd > StreepDuur) StreepDuur++;
    if (tijd < StreepDuur) StreepDuur--;
  }
  else if (teken == '.') {
    if (tijd > StreepDuur / 3.0) StreepDuur++;
    if (tijd < StreepDuur / 3.0) StreepDuur--;
  }
  kar += teken;
  //Serial.println(teken);
}

void DecodeerPauze(long starttijd) {
  if (kar == "") return;

  char teken = '?';
  long tijd = abs(millis() - starttijd);
  if (tijd > StreepDuur - StreepDuur / 40) {
    DecodeerKar();
    //Serial.print();
  }
  if (tijd > StreepDuur * 10) {
    DecodeerKar();
    Print(" "); Serial.print(" ");
  }
  //else DecodeerKar();
  //Serial.println(teken);
}

void DecodeerKar() {
  static String letters[] = {
    ".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-",
    ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--..", "E"
  };
  int i = 0;
  while (letters[i] != "E") {
    if (letters[i] == kar) {
      Print((char)('A' + i));
      Serial.print((char)('A' + i));
      break;
    }
    i++;
  }
  if (letters[i] == "E") {
    Print(kar);
    Serial.print(kar);
  }
  kar = "";
}

int y = 0, x = 0;
void Print(String &s) {
  for (int i = 0; i < s.length(); i++) {
    upd(); 
    lcd.print(s[i]);
  }
}
void Print(char s) {
  upd();
  lcd.print(s);
}
void Print(char *s) {
  for (int i = 0; i < strlen(s); i++) {
    upd();
    lcd.print(s[i]);
  }
}

void upd() {
  lcd.setCursor(x, y);
  x++; if (x >= 20) {
    x = 0;
    y++;
  }
  if (y >= 4) {
    lcd.clear();
    x=y = 0;    
  }
}

ArduMyth:
Bien, ahora ya vemos que Print es una función propia con punteros.
El caso es que hay dos (con el mismo nombre) porque en uno se pasa un char y en otro un string (lo que cambia es el tipo de variable que se pasa por puntero). No me parece la forma más correcta pero para gustos colores.
El código NO tiene problemas de sintaxis y se puede subir perfectamente a un Arduino NANO. (Probado)

Saludos.

¿Entonces por que no me funciona este codigo y en cambio al subir el blink si?

ArduMyth:
Actualiza el IDE.

Nada, IDE actualizado y me sigue dando el mismo error:

Opciones de compilación cambiadas, reconstruyendo todo
C:\Users\usuario\Downloads\Codigo_Definitivo__con_led_\Codigo_Definitivo__con_led_.ino: In function 'void DecodeerPauze(long int)':

C:\Users\usuario\Downloads\Codigo_Definitivo__con_led_\Codigo_Definitivo__con_led_.ino:88:14: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]

    Print(" "); Serial.print(" ");

             ^

Solo para este caso, prueba a poner el espacio entre comillas simples en lugar de dobles:

    Print(' '); Serial.print(" ");

Correcto, lo he cogido de la web que citas, lo unico que he añadido es el LED. El arduino NANO es generico de aliexpress, pero no hay problema de comunicacion con mi ordenador porque he subido otros proyectos simples como el blink y funciona. El mismo codigo lo he probado en un arduino uno original y otro generico y funciona correctamente.

¿Tendria que modificar alguna funcion o algo para adaptarla a esta placa?

Otra cosa que podrías probar es dejar las dobles comillas como estaban y añadir el const a la declaración de la función:

void Print(const char *s) { // <-- Añadido aquí el "const"
  for (int i = 0; i < strlen(s); i++) {
    upd();
    lcd.print(s[i]);
  }
}

Yo tambien lo acabo de probar, y ha subido sin problema al nano

ArduMyth:
Fin del problema (que no es tal)

Ante todo es un warning y nada más (Fui el primero que me salté esto al leer y después se nos escapó a todos) Un warning no es un error es una advertencia.
Básicamente nos hemos estado comiendo la cabeza al asumir que el código no podía subirse ya que @Rafagar no indicó si probó o no el sketch.

En cualquier caso si se quisiera evitar el warning es tal cual dice @ignorante_absoluto. :art:

Presupondré que dicho warning sale en tu compilador por algún tipo de configuración diferente ( y esto es por imaginar algún motivo, porque realmente lo desconozco), ya que todos podemos compilar y subir y tú también puedes @Rafagar, ya que sólo es un warning......... Lo que ya sí es raro es que dicho warning te salga sólo en un tipo de Arduino.

Cómo dije algo se tenía que estar escapando... y me da @Rafagar qué algo más de información es incorrecta o faltó acerca de subir este sketch, mareándome yo el primero si entender qué te estaba pasando.

Pero bueno, lo primero es que si lo subes algo mira si funciona o no, antes de presuponer que no.

Un saludo a todos :slight_smile:

Por supuesto al subirlo lo probe en la protoboard tal y como hice con el UNO y no funciona. Lo mas cercano a la solucion que he encontrado ha sido lo del compañero que me ha dicho que cambiase las dobles comillas por comillas simples, ahi si se sube sin ningun warning pero no termina de funcionar bien. Finalmente he decidido llevar a cabo el proyecto en una placa UNO y ya esta. Muchisimas gracias por vuestra ayuda y paciencia, que no ha sido poca.

Que raro lo que dices.
Primero que un warning no afecta generalmente un código.
Segundo que UNO y NANO casi son idénticos.

Me llama la atención que digas que no funciona en tu NANO.

Lo he puesto en mi compilador y tengo estos Warnings no uno solo

1er warning. Elimina teken y listo.

In function 'void DecodeerPauze(long int)':
warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]
void DecodeerPauze(long starttijd) {
  if (kar == "") return;
  char teken = '?';  // la defines y no la usas mas. Borrala

El warnign con Print me llama la atención porque tu codigo tiene 3 Print definidos que esperan 3 argumentos diferentes.
Guauu eso si que me ha sorprendido

void Print(String &s) {
  for (int i = 0; i < s.length(); i++) {
    upd(); 
    lcd.print(s[i]);
  }
}
void Print(char s) {
  upd();
  lcd.print(s);
}
void Print(char *s) {
  for (int i = 0; i < strlen(s); i++) {
    upd();
    lcd.print(s[i]);
  }
}

Porque simplemente no defines a cada uno con algo que los diferencie?
Y va a funcionar te lo aseguro.