Conversione tipi

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

...
    send_this = String(t) + "," + String(h);

    Serial.println(send_this);
    BT.println(send_this);
...

stò provando ad usare il char ma senza successo

...
    i++;
    masterMessage[0] = '1';
    masterMessage[1] = ',';    
    masterMessage[2] = i;
...

a cercare sto andando in tilt :grinning:

grazie

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. :wink:

Guglielmo

Puoi fare tre Serial.print()...

1 Like

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.

... ti avevo scritto:

... 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.

Guglielmo

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.

Ciao, Ale.

1 Like

Ma sul Bluetooth non si può scrivere una cosa per volta in sequenza, come sulla seriale e sul display LCD?...

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

ciao
Lato app il programma che ho modificato si aspetta una lista/vettore CSV con una certa dimensione
Non ho provato a mandare singolarmente

ciao
Sono riuscito ad ottenere la stringa che volevo
Grazie per il supporto
Ma ora incontro questo problema

#include <SoftwareSerial.h>
SoftwareSerial BT(4, 5);

const unsigned long interval = 3000;
unsigned long previousMillis;
unsigned long currentMillis;

char send_this[7];

byte s;
byte h;
byte d;

byte k;

void setup()
{
  BT.begin(9600);
  Serial.begin(9600);

  send_this[7] = {0};

  s = 11;
  h = 0;
  d = 21;
  
 previousMillis = 0;
 currentMillis = 0;  
}

void loop()
{
  currentMillis = millis();
  if (currentMillis - previousMillis >= interval)
  {
    previousMillis = millis();
    
    h++; Serial.println(h);

    sprintf(send_this, "%d,%d,%d", s, h, d);
    Serial.println(send_this);
    
    
    if ( s == 11)
    {
      s = 10; //Serial.println('s');
    }
    else
    {
      s = 11; //Serial.println('S');
    }

    if ( d == 21)
    {
      d = 20; //Serial.println('d');
    }
    else
    {
      d = 21; //Serial.println('D');
    }     
    
      if ( h == 10)
    {
      h = 0;
    }    
  } 
}

questo l output

11,1,21
11,2,20
11,3,21
11,4,20
11,5,21
11,6,20
11,7,21
11,8,20
11,9,21

la variabile s non cambia come dovrebbe mentre la variabile d si
Chi me lo spiega?

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.

ciao
il +1 nell array l ho capito e applicato in altro progetto
sono riuscito pure ad applicare sprintf :open_mouth:
il mio problema e' che il valore 11 non viene cambiato in 10 ad ogni inrtervallo come invece succede al valore 21

grazie per i link

Va' che Maurotec lo ha spiegato...

Se poi non lo hai capito...

Te lo posso spiegare io:

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 :laughing:
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:

Lo vedi quel 7, deve essere 8.

(1) quella riga rimuovila.

Poi a me stampa questo:

1
11,1,21
2
10,2,20
3
11,3,21
4
10,4,20
5
11,5,21
6
10,6,20

Io noto che: 10 + 10 = 20 e 11 + 10 = 21, quindi:
d = s + 10.

Ciao @standardoil

Ciao.

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