[risolto] Arduino UNO, Android, BlueSmirf, what's wrong??

Ciao a tutti,

mi sono appena iscritto e ho già bisogno dell'aiuto e della pazienza di qualcuno :stuck_out_tongue:

Ho comprato l' "Arduino Starter Kit" e, dopo aver scrupolosamente seguito le prime lezioni del libro allegato, ho imparato a controllare il display (anch'esso nel kit).

Per evolvermi, ho pensato di comprare il modulo bluetooth BlueSmirf RN-42, ho saldato i pin al modulo, l'ho infine collegato ai piedini RX e TX (incrociati) di Arduino, a 5V e GND, infine ho collegato tra loro i due pin rimasti (RTS e CTS-1).

Ho creato uno sketch che semplicemente legge dati dalla seriale, accende un led per 3 secondi, scrive tali dati sul display e reinvia sulla seriale tali dati preceduti da un "You wrote: ".
Ho impostato la velocità della seriale a 115200, che da quanto ho letto è il valore di default per il modulo bt.
Ho infine collegato tramite bt lo smartphone e creato la connessione seriale.

Se dal computer scrivo qualcosa tutto funziona: il led si accende, sul display appare il testo, lo smartphone riceve il messaggio.
Se dallo smartphone scrivo qualcosa....... Nulla :frowning:
Non si accende il led da me pilotato, non lampeggiano i led relativi alla seriale, non accade assolutamente nulla.
Infine, se connetto i pin RX e TX (0 e 1 di Arduino UNO) tra loro il sistema va in loop, esattamente come mi aspetto.

Ho pensato ad un problema sulla saldatura del pin TX del modulo, che quindi riceve da Arduino ma non invia, può essere o non andrebbe nulla in tal caso? Prima di toccare le saldature voglio provare ogni possibilità, dato che non ho esperienza col saldatore e rischio di fare danno..

Grazie per l'attenzione e portate pazienza :smiley:

Allego foto e codice, casomai potesse esservi utile per farvi un'idea completa. Non faccio alcun cambiamento ai parametri di default del modulo (anche perchè se anche gli invio qualcosa non ottengo feedback di alcun tipo).Non è un bel codice, probabilmente faccio operazioni inutili soprattutto sulle stringhe: devo ancora approfondire bene quali sono le operazioni permesse e come vengono gestiti i puntatori, io nel dubbio per ora istanzio una stringa nuova ogni volta che ne devo modificare il valore.

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

String last="";
String pre="";

const int internalLED = 13;

int count = 0;

void setup(){
  lcd.begin(16, 2);
  
  pinMode(internalLED, OUTPUT);
  digitalWrite(internalLED, LOW);
  
  Serial.begin(115200);
  
  Serial.println("Hello world!");
  
  lcd.clear();
  lcd.print("Hello world!");
}

void loop()
{
  if (Serial.available()) {
    delay(100);
    lcd.clear();
    int reading = 0;
    while (Serial.available() > 0) {
      if(!reading) {
        reading = 1;
        // salvo la stringa, poiche' dalla seconda riga passera' alla prima e sulla seconda comparira' quella nuova
        pre = String(last);
        last = String();
      }
      count = 0;
      digitalWrite(internalLED, HIGH);
      const char lastChar = Serial.read();
      last = String(last + lastChar);
    }
    
    reading = 0;
    Serial.println(String("You wrote " + last));
    
    lcd.setCursor(0,0);
    lcd.print(pre);
    lcd.setCursor(0,1);
    lcd.print(last);
    
    // la l che segue mi serve per l'eventuale scroll del messaggio sul display
    int l = (last.length()-16);
    if(l<0) l=0;
    int scrolled = 0;
    for (int positionCounter = 0; positionCounter < l; positionCounter++) {
      scrolled = 1;
      lcd.scrollDisplayLeft();
      delay(500);
    }
    // riporto il messaggio in posizione 0, solo se l'ho shiftato ovviamente
    if(scrolled) {
      delay(1000);
      for (int positionCounter = 0; positionCounter < l; positionCounter++) {
        // scroll one position left:
        lcd.scrollDisplayRight();
        // wait a bit:
        delay(50);
      }
    }
  }
  
  // mi occupo della temporizzazione del led, deve essere spento dopo circa 3 secondi. 30x100 millisecondi
  if(count>30) {
    //Serial.println("STILL ALIVE?");
    
    count = 0;
    digitalWrite(internalLED, LOW); // reset led state
  } else {
    count = count+1;
    delay(100);
  }
}

Edit:
Ho provato a rifinire la saldatura, staccato e riattaccato i cavi RX e TX. RX del modulo a TX di Arduino e viceversa.
Ora ho il funzionamento inverso: il cellulare invia e riceve, il pc riceve soltanto :-S
Se stacco temporaneamente il modulo dalla seriale, il pc invia correttamente e riceve la risposta. Se riattacco il modulo, riprendono a funzionare il modulo al 100% ed il pc in sola ricezione.

Pur avendo letto tutorial vari, ero fortemente convinto che la seriale fosse un bus e non un collegamento point-to-point! Ed il vedere che compilando lo sketch il cellulare riceveva qualcosa alimentava la mia convinzione.
Ho risolto attaccando il modulo a due pin qualunque ed usando una seriale software, era un tentativo che avevo fatto già ieri ma probabilmente era presente un altro errore poi scomparso!

Dopo una buona giornata persa dall'inizio del microprogetto ho quindi risolto :smiley: