inviare comando da arduino nano ad arduino mini tramite blutooth

salve , premetto la mia quasi totale ignoranza , su arduino .
io ho costruito un joystik per i vecchi video giochi anni 80 , volevo trasformarlo in un joystik bluetooth .
ho trovato vati progetti che usano dei pad della xbox360 o ps3 . ma durante la mia ricerca ho trovato una discussioe che trattava di trasmettere dati tramite bluetooth .
nella discussione cè un esempio su come far accendere u led facendo comunicare due arduio nano tramite bluetooth .
praticamente sul primo cè un pulsante e ovviamente sul secondo cè un led .
come inizio sarebbe perfetto .
vi posto il codice :

//*****TX BLUETOOTH***
//Realizzato da ElettroshockNow (ElettroshockNow@gmail.com)
// e condiviso su EnergiAlternativa.org
//
//ATTENZIONE:
//
//CC BY-NC-SA 4.0
//Uso non commerciale, modificabile, con obbligo di condivisione-
//http://creativecommons.org/licenses/by-nc-sa/4.0/deed.it
//
//
const int Tastatore = 10;
const int ledPin =  13;
const byte Ripeti_invio = 2;
byte Invio = 2;

void setup() {
 Serial.begin(57600) ;
 pinMode(Tastatore, INPUT); 
 pinMode(ledPin, OUTPUT);  
}


void loop() {
 if (digitalRead(Tastatore) && Invio){
   digitalWrite(ledPin, LOW);
   Serial.print("off");
   Serial.print("/");
   Invio--;
 }
 else if (!digitalRead(Tastatore) && Invio < Ripeti_invio) {
   digitalWrite(ledPin, HIGH);
   Serial.print("on");
   Serial.print("/"); 
   Invio++;
 }
}

e il codice per la ricivente :

//*****RX BLUETOOTH***
//Realizzato da ElettroshockNow (ElettroshockNow@gmail.com)
// e condiviso su EnergiAlternativa.org
//
//ATTENZIONE:
//
//CC BY-NC-SA 4.0
//Uso non commerciale, modificabile, con obbligo di condivisione-
//http://creativecommons.org/licenses/by-nc-sa/4.0/deed.it
//
//
int led = 13;
char Stringa_Ricevuta[5]; 
byte Indice_RX = 0;
byte inByte;


void setup() {
 Serial.begin(57600) ;
 pinMode(led, OUTPUT);
}


void loop()
{
 if (Serial.available())
 {
   inByte =Serial.read();
   if ((inByte != 47) && (Indice_RX < 4)) //Ricevi il dato fino / all'invio e max 5 byte
   { 
     Stringa_Ricevuta[Indice_RX++] = inByte;
   }
   else 
   {
     if (strcmp(Stringa_Ricevuta, "off") == 0)digitalWrite(led, LOW);
     else if (strcmp(Stringa_Ricevuta, "on") == 0)digitalWrite(led, HIGH);
     
     Stringa_Ricevuta[Indice_RX] = 0;
     Indice_RX = 0;
   }
 }
}

la mia domanda e questa , praticamete mi servirebbero solo 5 contatti in piu ( destra , sinistra , alto , basso , sparo 1 e sparo 2? se ricopio il codice cambiando il pin di collegamento , po andar bene?
grazie

> albepancio: ti ricordo che in conformità al regolamento, punto 7, devi editare il tuo post (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More → Modify che si trova in basso a destra del tuo post) e racchiudere il codice all’interno dei tag CODE (… sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra).

Guglielmo

è la prima domanda che faccio per questo argomento ...... non ricordo di aver fatto gia un post su questo argomento ,
cmq se + cosi chiedo scusa

albepancio:
è la prima domanda che faccio per questo argomento ...... non ricordo di aver fatto gia un post su questo argomento ,
cmq se + cosi chiedo scusa

Ehhhhhh ? ? ? :o :o :o ... scusa, che c'entra ? ... ma lo hai letto bene il mio post ? ? ? Devi solo fare una correzione ...

Guglielmo

ok? :slight_smile:

Perfetto !!! :slight_smile:

Guglielmo

Secondo me si può semplificare il codice ...
... invece di inviare delle stringhe tipo "on", "off" ecc. non ti è più facile inviare UN solo carattere che identifica cosa è stato premuto ? In fin dei conti, con un solo carattere, anche eliminado i caratteri speciali e rimanendo nel set classico, 0..9, A..Z, a..z, comunque identifichi un bel po' di condizioni.

La trasmissione di un solo carattere più veloce, a livello di codice NON ti richiede l'uso della classe String, ma ti basta un char, il codice è più leggero e molto più semplice fare i confronti o, addirittura, usare uno switch/case :wink:

Guglielmo

//*****TX BLUETOOTH***
//Realizzato da ElettroshockNow (ElettroshockNow@gmail.com)
// e condiviso su EnergiAlternativa.org
//
//ATTENZIONE:
//
//CC BY-NC-SA 4.0
//Uso non commerciale, modificabile, con obbligo di condivisione-
//http://creativecommons.org/licenses/by-nc-sa/4.0/deed.it
//
//
const int fuoco1 = 5;
const int fuoco1r =  5;
const byte Ripeti_invio = 2;
byte Invio = 2;

void setup() {
  Serial.begin(57600) ;
  pinMode(fuoco1, INPUT); 
  pinMode(fuoco1r, OUTPUT);  
}


void loop() {
  if (digitalRead(fuoco1) && Invio){
    digitalWrite(fuoco1r, LOW);
    Serial.print("off");
    Serial.print("/");
    Invio--;
  }
  else if (!digitalRead(fuoco1) && Invio < Ripeti_invio) {
    digitalWrite(fuoco1r, HIGH);
    Serial.print("on");
    Serial.print("/"); 
    Invio++;
  }
}


//fuoco2
const int fuoco2 = 6;
const int fuoco2r =  6;
const byte Ripeti_inviofuoco2 = 2;
byte Inviofuoco2 = 2;

void setup1() {
  Serial.begin(57600) ;
  pinMode(fuoco2, INPUT); 
  pinMode(fuoco2r, OUTPUT);  
}


void loop1() {
  if (digitalRead(fuoco2) && Inviofuoco2){
    digitalWrite(fuoco2r, LOW);
    Serial.print("off");
    Serial.print("/");
    Invio--;
  }
  else if (!digitalRead(fuoco2) && Inviofuoco2 < Ripeti_inviofuoco2) {
    digitalWrite(fuoco2r, HIGH);
    Serial.print("on");
    Serial.print("/"); 
    Invio++;
  }
}


//alto
const int alto = 7;
const int altor =  7;
const byte invioalto = 2;
byte Invioalto = 2;

void setupalto() {
  Serial.begin(57600) ;
  pinMode(alto, INPUT); 
  pinMode(altor, OUTPUT);  
}


void loopalto() {
  if (digitalRead(alto) && Invioalto){
    digitalWrite(altor, LOW);
    Serial.print("off");
    Serial.print("/");
    Invio--;
  }
  else if (!digitalRead(alto) && Invio < Ripeti_invio) {
    digitalWrite(altor, HIGH);
    Serial.print("on");
    Serial.print("/"); 
    Invio++;
  }
}


//basso
const int basso = 8;
const int bassor =  8;
const byte Ripeti_inviobasso = 2;
byte Inviobasso = 2;

void setupbasso() {
  Serial.begin(57600) ;
  pinMode(basso, INPUT); 
  pinMode(bassor, OUTPUT);  
}


void loop1basso() {
  if (digitalRead(basso) && Inviobasso){
    digitalWrite(bassor, LOW);
    Serial.print("off");
    Serial.print("/");
    Invio--;
  }
  else if (!digitalRead(basso) && Inviobasso < Ripeti_inviobasso) {
    digitalWrite(bassor, HIGH);
    Serial.print("on");
    Serial.print("/"); 
    Invio++;
  }
}

//destra
const int destra = 9;
const int destrar =  9;
const byte Ripeti_inviofuoco1 = 2;
byte Inviofuoco1 = 2;

void setupdestra() {
  Serial.begin(57600) ;
  pinMode(fuoco1, INPUT); 
  pinMode(fuoco1r, OUTPUT);  
}


void loopdestra() {
  if (digitalRead(fuoco1) && Inviofuoco1){
    digitalWrite(fuoco1r, LOW);
    Serial.print("off");
    Serial.print("/");
    Invio--;
  }
  else if (!digitalRead(fuoco1) && Inviofuoco1 < Ripeti_inviofuoco1) {
    digitalWrite(fuoco1r, HIGH);
    Serial.print("on");
    Serial.print("/"); 
    Invio++;
  }
}


//sinistra
const int sinistra = 10;
const int sinistrar =  10;
const byte Ripeti_inviosinistra = 2;
byte Inviosinistra = 2;

void setupsinistra() {
  Serial.begin(57600) ;
  pinMode(sinistra, INPUT); 
  pinMode(sinistrar, OUTPUT);  
}


void loopsinistra() {
  if (digitalRead(sinistra) && Invio){
    digitalWrite(sinistrar, LOW);
    Serial.print("off");
    Serial.print("/");
    Invio--;
  }
  else if (!digitalRead(sinistra) && Inviosinistra < Ripeti_inviosinistra) {
    digitalWrite(sinistrar, HIGH);
    Serial.print("on");
    Serial.print("/"); 
    Invio++;
  }
}

questa e la modifica che ho fatto aggiungento i comandi aggiutivi. il modo che mi hai consigliato non so come poterlo fare , quindi a logica ho fatto questa modifica secodo te e giuasta?

No, non era questo che io intendevo ...
... il mio suggerimento era di NON usare più le stringhe, quindi NON più "on", "off" o cose simili, ma usare un singolo carattere, es. 'A', 'a', 'B', 'b', 'C', 'c', ... e così via, uno per indicare ciascuna condizione.

Quindi, ad esempio, Fire_1 premuto, trasmetto 'A', Fire_1 rilasciato, trasmetto 'a'; Fire_2 premuto trasmetto 'B', Fire_2 rilasciato trasmetto 'b', e così via ... tanto hai caratteri a sufficienza ...
... in ricezione la cosa ti si semplifica perché NON dovendo ricevere più una stringa ("on", "off", ecc) devi ricevere solo un singolo char e già sai cosa sta avvenendo.

Ovviamnete, per fare questo, il programma va interamente riscritto seguendo un'altra strada, e ...
... senza offesa, leggendo la tua "presentazione", purtroppo NON so se hai l'esperienza sufficiente per riuscire a farlo ::slight_smile:

Guglielmo

infatti ho scritto che questo non è il modo che mi avevi suggerito , ma a logica mi sembrava il modo di modificare il codice originale , .
si farlo come dici te , non saprei da dove iniziare :slight_smile: . la differenza dal codice che ho postato io e quello che mi hai suggerito di scrivere , sta ella semlicita o nella velocita con cui funziona il tutto?

p.s.
mi daresti qualche indizio su come dovrebbe venire:):):):):):

albepancio:
... mi daresti qualche indizio su come dovrebbe venire:):):):):):

Ci sono tanti esempi on-line ... QUESTO è uno veramente minimo che manda i comandi da uno smartPhone ... se guardi il codice vedi che se riceve '1' accende il LED, se riceve '0' lo spegne ... ovvero ... lavora con UN solo carattere :wink:

Guglielmo

if(Serial.available() > 0)   se la variabile e maggiore di 0 esegui i comandi successivi giusto?
  {
    data = Serial.read();      //Read the incoming data and store it into variable data questo non lò caito 
    Serial.print(data); qui invia i dati giusto?

if(data == '1') controlla il valore se è uguale a 1
digitalWrite(13, HIGH); qui imposta il pin 13 a livello alto
giusto?
quindi devo ripetere questi comandi per ogni direzione ( nominandolo el void setup e nel void loop)
e questo per quello che riguarda la ricevente .
per la trasmittente?
scusa se ho tirato degli strafalcioni .
dovrei documentarmi ma il tempo e pochissimo

void setup() {
  //Definisce i pin a cui sono collegati i LED
  pinMode(13, OUTPUT);  //alto
  pinMode(12, OUTPUT);  //basso
  pinMode(11, OUTPUT);  //destra
  pinMode(10, OUTPUT);  //sinistra
  pinMode(9, OUTPUT);   //fuoco
  //Inizializza la comunicazione seriale
  Serial.begin(57600) ; 
}

  //Legge un carattere dal seriale e lo pone in c
  char c = Serial.read();
  //Se il carattere letto è 'a' accende il LED rosso
  if (c == 'a') {
    digitalWrite (13, HIGH);

cosi puo andare???? ripetuto per ogni pin e questo per la ricevente

albepancio:
cosi puo andare???? ripetuto per ogni pin e questo per la ricevente

Si, più o meno la logica è quella ...

Guglielmo

ho trovato un corso on line ( ci sono le line guida di base) pero adesso come faccio ad iviare quei comandi al bluetooth?
codice simili ma da write va su read , va sull arduio ricevente,
ma per far trasmettere dalla periferica bluetooth?

La "periferica bluetooth" altro NON è che un semplce collegamento SERIALE tra i tuoi due Arduino, quindi ...
... devi solo implementare una comunicazione seriale (usando la SoftwareSerial) tra un arduino e l'altro.

Da una parte trasmetterai e dall'altra leggerai quello che trasmetti ... se cerchi ci sono un'infinità di esmepio per collegare via seriale due Arduino ... basta che ti ricordi che tu al posto di un filo hai due moduli BT (... cosa, a questo livello, ininfluente).

Guglielmo

void loop() {
if (digitalRead(fuoco1) && Invio){
digitalWrite(fuoco1r, LOW);
una cosa simile?

Ma hai fatto una ricerca con Google ? ? ? Cosa c’entra la digitalWrite() con l’invio di un carattere sulla seriale ? ? ? :o

Guglielmo

a dire il vero uso yhaoo ,,, ho cercato ed ho trovato questo mini corso http://www.mauroalfieri.it/corso-arduino-on-line.html, pensavo fosse quello il comado ,
mi documentero ancora e nel fine settimana cerchero di capirci qualcosa,,,
al limite me lo correggi? :slight_smile:

Ti consiglio una attenta lettura/studio di QUESTO proseguire con QUESTO e di acquistare qualche buon libro (es. QUESTO).

Guglielmo