accensione /spegnimento evento tramite bluetooth

Salve ragazzi sto’ realizzando questo progettino ma non ne vengo a capo: ho creato una applicazione tramite app invento con la quale selezione inizio (ore e minuti) e fine (ore e minuti) di un evento.Ora tramite bluetooth vorrei trasmettere il tutto ad arduino (sul quale monto oltre che ad un h05 per la comunicazione bluetooth anche una rtc per la gestione dell’orario).Problema uno come si vede dall’immmagine la risultante dei miei orari è “ORE_START” ecc… come posso gestire la ricezione di questo dato con arduino . Allego anche il codice con il quale vorrei partire ma da modificare:

#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11);


// imposto i pin per la comunicazione seriale
// Collegare i pin: RX=>11 TX=>10

void setup()
{
  pinMode(2, OUTPUT); //questi sono i pin di ciascun relè
  pinMode(13, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  digitalWrite(2, HIGH);
  digitalWrite(3, HIGH);
  digitalWrite(4, HIGH);
  digitalWrite(5, HIGH);
  digitalWrite(6, HIGH);
  digitalWrite(7, HIGH);
  digitalWrite(8, HIGH);
  digitalWrite(9, HIGH);
  delay(2000);




  mySerial.begin(9600); // setto la comunicazione seriale
   Serial.println("ok" );  //scrivo sul monitor seriale
   delay(1000);
}


void loop()
  
{
  
  while (mySerial.available())
  {
    char dato = mySerial.read(); // "dato" è il valore che viene ricevuto dalla seriale
    switch (dato)
    {
      case 'ORE_START': // Se ricevo la lettera A,
     
        {
          digitalWrite(13, HIGH); // attivo il relè collegato al pin12
          mySerial.println("Relè 1 ON");
          break;
        }
      case 'a': // Se ricevo la lettera a
        {
          digitalWrite(2, HIGH); // Spengo il relè
          mySerial.println("Relè 1 OFF");
          break;
        }
      // E così anche di seguito...
      case 'B':
        {
          digitalWrite(3, LOW);
          mySerial.println("Relè 2 ON");
          break;
        }
      case 'b':
        {
          digitalWrite(3, HIGH);
          mySerial.println("Relè 2 OFF");
          break;
        }


      case 'C':
        {
          digitalWrite(4, LOW);
          mySerial.println("Relè 3 ON");
          break;
        }
      case 'c':
        {
          digitalWrite(4, HIGH);
          mySerial.println("Relè 3 OFF");
          break;
        }
      case 'D':
        {
          digitalWrite(5, LOW);
          mySerial.println("Relè 4 ON");
          break;
        }
      case 'd':
        {
          digitalWrite(5, HIGH);
          mySerial.println("Relè 4 OFF");
          break;
        }
      case 'E':
        {
          digitalWrite(6, LOW);
          mySerial.println("Relè 5 ON");
          break;
        }
      case 'e':
        {
          digitalWrite(6, HIGH);
          mySerial.println("Relè 5 OFF");
          break;
        }
      case 'F':
        {
          digitalWrite(7, LOW);
          mySerial.println("Relè 6 ON");
          break;
        }
      case 'f':
        {
          digitalWrite(7, HIGH);
          mySerial.println("Relè 6 OFF");
          break;
        }
      case 'G':
        {
          digitalWrite(8, LOW);
          mySerial.println("Relè 7 ON");
          break;
        }
      case 'g':
        {
          digitalWrite(8, HIGH);
          mySerial.println("Relè 7 OFF");
          break;
        }
      case 'H':
        {
          digitalWrite(9, LOW);
          mySerial.println("Relè 8 ON");
          break;
        }
      case 'h':
        {
          digitalWrite(9, HIGH);
          mySerial.println("Relè 8 OFF");
          break;
        }
    }
  }
}

insomma una volta che trasmetto i dati come da figura non so' come gestirli con arduino.qualcuno potrebbe darmi qualche dritta/esempio? Grazie

  1. Perché il while ? Sei già in un loop() che gira in continuazione ... ti basta "if( Serial.available() ) { ..... }" tanti ci passi in ad ogni giro del loop().

  2. Non vedo dove è definito ORE_STRAT e messo come lo hai messo tu NON funziona ... 2.1 devi fare un #define ORE_START 'A' 2.2 nel case devi mettere "case ORE_START" senza alcun apice 2.3 o, più semplicemente, senza la #define, fai come hai fatto per gli altri casi.

Correggi, riprova, posta il codice corretto e ... poi spiega cosa non va.

Guglielmo

scusami guglielmo ma se io vorrei essere sicuro dei dati che ricevo posso stamparli sulla seriale pur avendola usata come connessione bluetooth?

Tu non stai usando la seriale … tu per il bluetooth stai usando la SoftwareSerial sui pin 10 e 11 quindi … la seriale è libera e la puoi usare … piuttosto, mi sembra manchi Serial.begin(9600) nel setup() … ::slight_smile:

Comunque, se vuoi verificare il funzionamento del modulo … questo programmino prende quello che scrivi sul monitor seriale e lo manda al bluetooth e quello che arriva dal bluetooth lo manda sul monitor seriale :

#include <SoftwareSerial.h>

#define  SS_RX 10            // RX PIN to receive  data
#define  SS_TX 11            // TX PIN to transmit data

SoftwareSerial ssSerial(SS_RX, SS_TX);

void setup()
{
  delay (2000);
  //
  Serial.begin(9600);        // Initialize USB Serial port
  ssSerial.begin(9600);      // Initialize SoftwareSerial port
  //
  Serial.println("--- Ports ready ---");
  Serial.println("");
}

void loop()
{
  if (ssSerial.available() > 0) Serial.write(ssSerial.read());
  if (Serial.available() > 0) ssSerial.write(Serial.read());
}

… e più che collaudato … quindi … :wink:

Guglielmo

domani proverò a sistemare il codice ed a sottoportelo.Intanto ti ringrazio molto

scusami guglielmo ma non capisco nel codice che mi hai postato dove devo inserire i dati che mi arrivano dalla mia app tramite bluetooth.
attualmente ho realizzato questo codice:

#include <Time.h>


#include <SoftwareSerial.h>


int ORE_START;
int MINUTI_START;
int ORE_STOP;
int MINUTI_STOP;




#define  SS_RX 10            // RX PIN to receive  data
#define  SS_TX 11            // TX PIN to transmit data

SoftwareSerial ssSerial(SS_RX, SS_TX);

void setup()
{
  delay (2000);
  //
  Serial.begin(9600);        // Initialize USB Serial port
  ssSerial.begin(9600);      // Initialize SoftwareSerial port
  //
  Serial.println("--- Ports ready ---");
  Serial.println("");
}

void loop()
{
  if (ssSerial.available() > 0) Serial.write(ssSerial.read());
  if (Serial.available() > 0) ssSerial.write(Serial.read());
}

avrei bisogno di vedere se i miei dati (dichiarati all’inizio) vengono visti da arduino in modo da poter poi procedere a fare la parte di codice che tramite l’orologio mi pemetterà di paragonarli.
grazie

allego anche una immagine della mia app dove si vede che genere di dati invio tramite bluetooth

Tutto ciò che arriva sul bluetooth viene inviato al monitor seriale, quello che scrivi nel monitor seriale viene inviato al bluetooth, quindi ... ... apri il monitor seriale, accoppia il tuo ... cose è? ... telefono? ... al modulo bluetooth e, tutto quello che invii, viene visualizzato.

Guglielmo

grazie mille ora infatti vedo in seriale la sequenza di numeri che rappresentano i miei orari di start e stop (es: 10402310) 10 e 40 - 23e10 ora come faccio ad associarli ad un orario per fare l’accensione e spegnimento da dove mi consigli di partire per fare tale associazione?

Il problema, quando si lavora con date/ore è sempre quello ... ... come sommo tot giorni ? come sottraggo tot ore, come comparo una data/ora con un'altra?

Tutto si risolve banalmente, se, invece di lavorare come siamo abituati in giorno/mese/anno ore:minuti:secondi, si lavora in Unix Time o Epoch ... ovvero un numero "unsigned long" che rappresenta sempre i secondi passati a partire da una certa data (normalmente dal 1/1/1970).

Ad esempio, in questo momento è il 8 Maggio 2016 ore 16:25:08 da cui Unix Time: 1462717508

Capisci che è infinitamente più semplice fare qualsiasi cosa lavorando con un "unsigned long" che nel formato a noi comune ... il problema è la conversione, ma ... quasi tutte le librerie che trattano il tempo, prevedono al loro interno una funzione che, dati appunto data e ora, ritorna lo Unix Time (... guarda dentro la tua libreria Time e vedrai che probabilmente c'è).

Se poi NON ti interessa la data, ma solo ore:minuti:secondi ... beh, è ancora più semplice ... qualsiasi orario si trasforma in un unsigned long con HH x 3600 + MM x 60 + SS (1 giorno = 86400 secondi) ...

... comparare un orario con un'altro sarà semplicemente comparare un numero unsigned long con un altro ... la sola cosa a cui occorrerà prestare attenzione è se un orario è di un giorno e l'altro orario e di un'altro ... nel qual caso occorrerà giocare un po' con i confronti numerici ;)

Guglielmo

grazie guglielmo gentilissimo come solito ma il mio problema era proprio come estrapolare ora quel dato dalla seriale per poterlo lavorare da dove partire? In pratica ho una serie di numeri che leggo sul monitor seriale da dove comincio per poterli lavorare?

… beh … sicuramente devi fare un ciclo di lettura, devi identificare in qualche modo la fine dei numeri (es. usa un separatore … normalmente CR) e li devi memorizzare in una stringa di caratteri (char array) e poi devi trattarli … ad esempio separare le ore e i minuti di accensione, separare le ore e i minuti di spegnimento e a quel punto trasformarli in una rappresentazione numerica come su detto.

Fai un passo alla volta, metti dei separatori (es. hhmmCRhhmmCR) così da identificare i blocchi e … vediamo poi come andare avanti.

Guglielmo

grazie mille mi studio la cosa poi ci risentiamo...

Forse ti semplifichi la vita se il messaggio che invii lo formatti così :

HHon**,MMon,HHoff,MMoffCR**

nota le “,” tra un elemento e l’altro ed il CR solo alla fine.

Questo ti permette di ricevere tutta la stringa fino al CR che indica la fine della stringa e poi di separare facilmente i vari elementi grazie alle virgole che separano ogni elemento.

Ti consiglio di guardare la AVR libc (che è sempre disponibile all’interno dell’IDE) ed in particolari le funzioni per il trattamento di stringhe di caratteri che trovi all’interno di <string.h> (es. strtok per separare le varie parti) :wink:

Guglielmo

CIAO, rieccomi qui ho provato e riesco a far entrare la stringa esattamente come la voglio, come potete vedere dall’immagine la spedisco già formattata come mi è stato detto sopra.Ora il problema sorge con rtc.Io o a disposizione una rtc ds232.Ho cercato parecchio un tutorial, mi sono scaricato le librerie ma non capisco come devo fare con la mia stringa a paragonarla all’ora della rtc.Qualcuno potrebbe aiutarmi, allego codice

#include <SoftwareSerial.h>


int ORE_START;
int MINUTI_START;
int ORE_STOP;
int MINUTI_STOP;

int ORARIOEVENTO[] = {ORE_START,MINUTI_START,ORE_STOP,MINUTI_STOP};



#define  SS_RX 10            // RX PIN to receive  data
#define  SS_TX 11            // TX PIN to transmit data

SoftwareSerial ssSerial(SS_RX, SS_TX);

void setup()
{
  delay (2000);
  //
  Serial.begin(9600);        // Initialize USB Serial port
  ssSerial.begin(9600);      // Initialize SoftwareSerial port
  //
  Serial.println("--- Ports ready ---");
 
}

void loop()
{
  if (ssSerial.available() > 0) Serial.write(ssSerial.read());
  if (Serial.available() > 0) ssSerial.write(Serial.read());
  
  
 

}

please help me... :(

Io veramente NON vedo nessuna stringa … vedo solo una dichiarazione di variabili, ma da quello ad avere la stringa bella e pronta … ce ne passa !

Prima di preoccuparti del RTC (… che è la cosa più banale) preoccupati di avere in un UNICO char array l’intera stringa perché … non è cosa così banale come credi.

Quindi … dedicati all’impostazione del programma, alla ricezione via seriale della stringa (HHstart,MMstrat,HHstop,MMstroCR) ovvero di 12 caratteri che devi memorizzare nel char array, alla separazione dei token ed alla loro conversione in 4 interi ed, a soli fini di debug, della stampa dei 4 valori … per il resto c’è tempo … :smiley:

Guglielmo

mmmm mi trovo molto in difficoltà sai....non ci arrivo proprio. :confused:

ais26: mmmm mi trovo molto in difficoltà sai....non ci arrivo proprio. :confused:

Lo supponevo ... ... difatti la parte normalmente "più difficile" per una persona che si avvicina ad Arduino è la ricezione di stringhe/caratteri/dati da seriale ;)

Direi che come prima cosa ti devi dedicare SOLO a questo, ricevere una serie di caratteri terminati da CR via seriale ... ... prova a fare delle ricerche mirate all'uso della seriale di Arduino e, al momento, lascia stare TUTTO il resto.

Ti dico che è un argomento trattato cento volte su questo forum, quindi ... forza con le ricerche e con Google :)

Guglielmo