Ciao
Per un progetto che voglio aggiornare, sto lavorando con mitapp inventor, dove lostato dei sensori H/L viene spedita al telefono via BT insieme a una stringa di numeri che mi servono solo per capire se il modulo BT è ancora collegato
Ho trovato uno sketch e la sua app, ma usa le stringhe, lo sketch e app che ho scritto funzionano ma vorrei sostituire le string con i char
Prova a guardare le funzioni che si trovano in string.h (libreria standard sempre inclusa) che sono fatte proprio per la gestione delle stringhe classiche del 'C' (char array) ... trovi funzioni per riempire, copiare, comparare, muovere, ecc. ecc.
ciao
grazie
Devo spedire la stringa via BT e farla leggere alla app creata
Ho trovato una app che modificata fa quello che mi serve, ma lo sketch associato utilizza le string
...
send_this = String(t) + "," + String(h);
Serial.println(send_this);
BT.println(send_this);
...
Da precedenti progetti avevo capito che le string ma sono considerate fuorilegge
Non sono "fuorilegge" ma "altamente sconsigliate" in quanto la loro gestione della memoria non è ottimizzata quindi in una piccola MCU come Arduino potrebbero portare a malfunzionamenti o blocchi.
Nel tuo caso quindi invece di "send_this = String(t) + "," + String(h);" ti basta definire quella variabile come char array ed usare le funzioni dedicate che Guglielmo ti ha già suggerito, ad esempio (anche se non so quale sia il tipo di variabile di "t" e "h", suppongo interi):
char send_this[30]; // Stringa da max 29 caratteri utili
...
sprintf(send_this, "%d,%d", t, h);
Serial.println(send_this);
BT.println(send_this);
Concordo con quello che dici "fuorilegge era ironico", nei progetti precedenti con fatica ho sostituito string con vettori char e devo dire che controlli meglio tutto
Si t e h sono interi
provo ad applicare
#include <SoftwareSerial.h>
SoftwareSerial BT(4, 5);
const unsigned long interval = 3000;
unsigned long previousMillis;
unsigned long currentMillis;
//String send_this;
char send_this[3];
byte t;
byte h;
void setup()
{
BT.begin(9600);
Serial.begin(9600);
send_this[3] = {0};
t = 1;
h = 0;
}
void loop()
{
currentMillis = millis();
if (currentMillis - previousMillis >= interval)
{
previousMillis = millis();
// float t = random(0,10000) / 100.0;
// float h = random(0,10000) / 100.0;
h++;
// send_this = String(t,2) + "," + String(h,2);
// send_this = String(t) + "," + String(h);
sprintf(send_this, "%d,%d", t, h);
Serial.println(send_this);
BT.println(send_this);
}
if ( t == 1)
{
t = 0;
}
else
{
t = 1;
}
if ( h == 100)
{
h = 2;
}
}
Non hai bisogno di questa inizializzazione, ed in ogni caso se vuoi resettare una stringa basta inserire un carattere '\0' come prima posizione ossia in send_this[0]: send_this[0] = '\0';
EDIT: In ogni caso ti consiglio comunque di leggere un po' come funzionano le "stringhe C" come questa, ad esempio iniziando da QUI o QUI.
Avevo gia' visto il secondo link
Scusate ma certe cose mi sto accorgendo di perderle forse ho bisogno di un radicale cambiamento
dove trovo string.h?
intanto ho trovato questi link
Questo inizio e' per studiare la possibilita' di aggiungere un BT (BLE) ai progetti fatti o prossimi, in modo che avvicinandomi all applicazione e lanciando la app specifica creata posso vedere su telefono lo stato
In C la gestione delle stringhe (ossia char array) è totalmente diversa da quella delle stringhe dei linguaggi di alto livello, quindi ti tocca fare un po' di pratica. Ma se hai già visto il secondo link dovresti aver appreso almeno le basi... Ma vedi anche il primo.
Fa parte delle librerie di base AVR incluse in Arduino, le trovi nella cartella "hardware\tools\avr\avr\include" all'interno di quella dove hai installato o copiato l'IDE.
... quindi NON devi trovare nulla, c'è già. Invece, per vedere le funzini che contiene e la loro sintassi, ad esempio nella versione per AVR (ma va bene per qualsiasi piattaforma), puoi guardare QUI.
Attenzione che quello che hai scritto contiene un grave errore:
send_this[3] non esiste, l'indice parte da 0 e arriva a 2. Scrivendo sull'indice 3 stai scrivendo in un area non assegnata alla variabile send_this, andando probabilmente a scombinare qualcosaltro.
Inoltre a te servono 3 caratteri (ammesso che i numeri siano sempre di una sola cifra), 2 cifre ed una virgola : l'array deve essere un carattero più lungo, perchè deve contenere il terminatore '\0', quindi ti serve un array di 4 char, non di 3.
Non ho provato
Lato app inventor non sono molto bravo, mi stò appoggiando ad un programma APK che ho modificato leggermente
Ad ogni loop() mando lo stato dei sensori e un contatore per dare la possibilità all'operatore di capire se il BT è ancora collegato
Qui sotto il programma a cui stò lavorando:
/*
per verificare il flusso di semi
il sensore è L in presenza di flusso semi davanti al sensore
il sensore è H in assenza di flusso semi davanti al sensore
distingue tra dx e sx
*/
#include <SoftwareSerial.h>//per la comunizazione con modulo BT
#define LED_PIN 13
#define HC05RxPin 4 // "RXD" Pin on HC05
#define HC05TxPin 5 // "TXD" Pin on HC05
//const byte HC12SetPin = 6; // "SET" Pin on HC05
SoftwareSerial BTSerial(HC05RxPin, HC05TxPin); //Rx, Tx
int ritardo;
//sezione controllo tensione batteria
int sensorPin = A0; // select the input pin for the potentiometer
int sensorValue = 0; // variable to store the value coming from the sensor
byte statosensoreDX, statosensoreSX;
byte statoDX, i, STATOSX;
unsigned long tempoDX [2] = {0};
unsigned long tempoSX [2] = {0};
unsigned long tempo_X = 0;
int deltatempoDX, deltatempoSX;
void setup()
{
// lcd.begin(16,4); // set up the LCD's number of columns and rows:
Serial.begin(9600);
BTSerial.begin(9600);
attachInterrupt(0, sensoreDX, FALLING); //sensore collegato al pin 2
attachInterrupt(1, sensoreSX, FALLING); //sensore collegato al pin 3
statosensoreDX = HIGH; //stato iniziale del sensore DX
statosensoreSX = HIGH; //stato iniziale del sensore SX
statoDX = 10;
statoSX = 20;
pinMode(2, INPUT_PULLUP);
// digitalWrite(2, HIGH);
pinMode(3, INPUT_PULLUP);
// digitalWrite(3, HIGH);
pinMode(7, OUTPUT);
digitalWrite(7, LOW);
pinMode(8, OUTPUT);
digitalWrite(8, LOW);
deltatempoDX = 0;
deltatempoSX = 0;
tempoDX[0] = millis(); //stesso valore di millis in due variabili
tempoSX[0] = tempoDX[0];//stesso valore di millis in due variabili
ritardo = 2000;
i = 0;
delay(1000);
}
void loop()
{
tempo_X = millis();
/* sensorValue = analogRead(sensorPin); // read the value from the sensor
if (sensorValue <= 1023)
{
digitalWrite(6, HIGH);
BTSerial.print('battery low');
}
*/
//------------------------sensore 1
if (statosensoreDX == LOW) //presenza di semi
{
tempoDX[0] = tempoDX[1];
statosensoreDX = HIGH;
digitalWrite(8, HIGH);//spegne led rosso
statoDX = 11;
//BTSerial.print('1');//trasmette questo codice per indicare presenza seme
Serial.println("SIseme");
}
deltatempoDX = tempo_X - tempoDX[0];
if (abs(deltatempoDX) >= ritardo)//mancanza flusso semi
{
digitalWrite(8, LOW);//accende led rosso
statoDX = 10;
//BTSerial.print('0');//trasmette questo codice per indicare assenza seme
Serial.println("NO");
}
//------------------------sensore 2
if (statosensoreSX == LOW) //presenza di semi
{
tempoSX[0] = tempo_X;
statosensoreSX = HIGH;
digitalWrite(7, HIGH);//spegne led rosso
statoSX = 21;
//BTSerial.print('1');//trasmette questo codice per indicare presenza seme
Serial.println("SIseme");
}
deltatempoSX = tempo_X - tempoSX[0];
if (abs(deltatempoSX) >= ritardo)//mancanza flusso semi
{
digitalWrite(7, LOW);//accende led rosso
statoSX = 20;
//BTSerial.print('0');//trasmette questo codice per indicare assenza seme
Serial.println("NO");
}
//preparare vettore per BT
i++;
// record =
//BTserial(record);
}
//interrupt sensore DX
void sensoreDX() //pin 2 a cui attaccare il sensore IR
{
statosensoreDX = LOW;
tempoDX[1] = millis();
}
//interrupt sensore SX
void sensoreSX() //pin 2 a cui attaccare il sensore IR
{
statosensoreSX = LOW;
tempoSX[1] = millis();
}
la stringa che alla fine devo spedire è questa:
record = STATODX, i, STATOSX
Io non me lo spiego. Figurati se lo posso spiegare a te.
Conto sulle dita, io ne ho 10. Se inizio a contare dal dito [0] l'ultimo dito sarà [9].
11,1,21
Per me ci sono 7 byte che devo conservare in un array che deve essere grande 7 + 1. Il byte aggiuntivo mi serve per indicare la fine dell'array c string. Chi scansionerà la mia c string si ferma quando incontra il byte 0 contenuto all'indice 7. Da 0 a 7 ci sono 8 elementi.
Io li metto i link alle risorse, ma sarebbe piacevole sapere che ti hanno aiutato.
send_this[8] = {0}; // contenitore di 7 elementi più uno per il terminatore '\0'
ciao
il +1 nell array l ho capito e applicato in altro progetto
sono riuscito pure ad applicare sprintf
il mio problema e' che il valore 11 non viene cambiato in 10 ad ogni inrtervallo come invece succede al valore 21
Siccome non hai ancora capito che un array di 7 elementi NON ha l'elemento [7] tu vai a scrivere in un'area di memoria usata da altre variabili, disturbandole...
Quindi il tuo programma ha un comportamento "strano ed erratico"
Comportamento che comunque è perfettamente prevedibile
Infatti il tuo programma si comporta esattamente come previsto
Invece o meglio viceversa
Analizzando il comportamento del programma si capisce alla perfezione l'errore
Per essere uno che smanetta con arduino dal 2011 mi sembra che la tua "curva di apprendimento" sia piuttosto demoralizzante...
Tu non ci hai capito una mazza
Tu adesso fai per gentilezza questo ragionamento:
Può essere che è come dicono @ilguargua e gli altri intervenuti e io @stefa24 non ci ho capito una mazza.
Quindi ora gli do il beneficio del dubbio e faccio come dicono:
grazie
Riconosco assolutamente che fatico a comprendere e mi scuso profondamente se torno spesso sugli stessi argomenti e vi comprendo benissimo se siete stanchi di aiutare i soliti sui soliti problemi
ho compreso il discorso del +1 nel vettore e del suop comportamento anomalo se cerco di scrivere fuori
Sto usando un simulatore della scheda e questa mi dava sempre un output strano con qualunque valore provato [7] [8] [9] [10]
Riprovo stasera con la scheda fisica
Veramente grazie
Stefano