Errore su ciclo if per attivazione uscita

Buongiorno a tutti,
Vi chiedo cortesemente se riuscite a darmi una mano sto cercando di creare un ciclo if con una variabile ricavata dalla libreria Ethernet.event questo è il link: GitHub - per1234/EtherEvent: Easy to use password authenticated Ethernet communication between Arduinos and EventGhost Network Event Sender/Receiver or TCPEvents plugins.

In pratica utilizzo la variabile EtherEvent.readEvent(event); nel ciclo if:

if (event ="1001"){

digitalWrite(led, HIGH);
}

e mi da questo errore error: incompatible types in assignment of 'const char [5]' to 'char [(((unsigned int)(((int)availableLength) + -0x000000001)) + 1)]

Come posso risolverlo?
Grazie mille in anticipo e buona giornata.

Per primo stai facendo nel IF una assegnazione "=" e non un confronto "=="
Per secondo il C non lavora direttamente con stringhe. Devi usare delle funzioni di stringhe opppure confrontare ogni elemento singolarmente.

Ciao Uwe

Di che tipo è la variabile event?

Da come l'hai comparata nell'if, essa dovrebbe essere una Stringa, forse l'errore è questo.
Se è come dico io,
è come se tu volessi comparare una variabile intera con una stringa.

e poi si usano due uguali per comparare e non uno solo

daddi5:
Buongiorno a tutti,

Ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni
e a leggere il regolamento se non lo hai già fatto: Regolamento
Qui una serie di link utili, non inerenti al tuo problema:

Il codice devi racchiuderlo nei tag code, vedi sezione 7 del regolamento, spiega bene come fare (pulsante </>).
Altrimenti parte del codice può essere visualizzata male o mancare perchè interpretato come attributo del testo stesso.

Ok grazie a tutti scusate se non mi sono presentato prima, ma ho rimediato subito.

Ho cambiato il ciclo if con due == e il mio programma viene compilato senza errori però non funziona.

la variabile che richiamo arriva dalla libreria del Link postato prima e vi inoltro il ciclo richiamato dalla mia funzione.

void EtherEventClass::readEvent(char eventBuffer[]) {
  strcpy(eventBuffer, receivedEvent);
  receivedEvent[0] = 0;  //reset the event buffer
  receivedEventLength = 0;

Come si può risolvere per ora non ho ancora molta esperienza in arduino riuscite a darmi una mano.
Grazie

Prova con

if (String(event) ="1001")
{
     ...
}

A prescindere, sempre == invece di = in questi casi.

...ed usare eventBuffer e non event.

Grazie a tutti per l'aiuto, allora oggi provo con EventBuffer, perché anche con String(event) non funziona.

Come mai Event Buffer dovrebbe funzionare sapete darmi una risposta?

Grazie mille e buona giornata :slight_smile:

ciao a tutti ma eventBuffer non funziona.

Premesso che non conosco la libreria in questione, ho dato un'occhiata agli esempi e io farei così:

if (byte availableLength = EtherEvent.availableEvent(ethernetServer)) {
    Serial.print(F("\nReceived event length="));
    Serial.println(availableLength);

    char event[availableLength];
    EtherEvent.readEvent(event);
    Serial.print(F("Received event: "));
    Serial.println(event);

    if (strcmp (event), "1001") == 0) {
      // Gestisci qua l'evento
    }
}

In questo modo hai anche un minimo di stampe che ti aiutano a debuggare quel che sta succedendo. Puoi rimuoverle (commentandole) quando tutto funziona.

Come mai Event Buffer dovrebbe funzionare sapete darmi una risposta?

Se non ho compreso male il funzionamento, la readEvent restituisce la variabile char[] eventBuffer e non event.

Grazie mille a tutti ma nemmeno l'ultimo skech dato da SukkoPera funziona...
Non riesco nemmeno a leggerla solamente con Serial.read

daddi5:
Come posso risolverlo?

Postando TUTTO il codice. La variabile event NON è dichiarata nella libreria.
Viene scritta dalla funzione EtherEvent.readEvent(event) ma la event TU l'hai dichiarata da qualche parte ma se non posti il codice che ne sappiamo ? Palla di vetro ? infatti @francesco_b ti ha chiesto di che tipo è event, ma tu rispondi altro.

La funzione richiede un array di char che TU devi aver dichiarato (potevi chiamarlo anche pippo) e quindi si parla di classiche stringhe C ovvero array che non puoi confrontare con un semplice ==

char event[50];  // dimensione di quanto ?? boh ??
...
EtherEvent.readEvent(event);  // scrive dentro a event
if( strcmp(event,"1001")==0 ) // uguali se ritorna 0
{ // entro per valore 1001

http://www.cplusplus.com/reference/cstring/strcmp/

In pratica quello che @sukkopera ha postato.
Ora facci vedere come hai integrato quel codice di @sukko con il tuo, dire che non ti funziona è un pò poco, non credi ?

cyberhs:
Se non ho compreso male il funzionamento, la readEvent restituisce la variabile char[] eventBuffer e non event.

Non proprio. La funzione richiede un array di char, su cui andrà a scrivere. Si può usare quella forma ma sarebbe stato meglio mettere un bel char * e forse sarebbe stato più chiaro.
Passare poi il nome di un array è come passare un pointer.

void funz( char buf[])
void funz( char *buf)   // identica a quella sopra

char str[10];
funz(str);  // parametro per puntatore

Ciao a Tutti scusate per il disguido vi inoltro totalmente il codice che sto utilizzando per esser più chiaro possibile.

#include <SPI.h>
#include <Ethernet.h>
#include "MD5.h"
#include "EtherEvent.h"



#define DHCP false  
byte MACaddress[] = {0x90, 0xA2, 0xDA, 0x0D, 0x0E, 0x27};  
#if DHCP == false
const IPAddress deviceIP = IPAddress(192,168,1,3);  
#endif
const char password[] = "password";  
const unsigned int port = 1024;  /
const unsigned int queueEventInterval = 4000; 
const IPAddress targetIP = IPAddress(192,168,1,2); 
const unsigned int targetPort = 1024;  


EthernetServer ethernetServer(port); 
EthernetClient ethernetClient;  
unsigned long sendTimeStamp;  


void setup() {
  Serial.begin(9600);  
#if DHCP == true
  Ethernet.begin(MACaddress); 
#else
  Ethernet.begin(MACaddress, deviceIP);  
#endif
  ethernetServer.begin();  
  if (EtherEvent.begin() == false || EtherEvent.setPassword(password) == false) {  
    Serial.println(F("ERROR: Buffer size exceeds available memory, use smaller values."));
    while (true);  
  }
}


void loop() {
  if (byte availableLength = EtherEvent.availableEvent(ethernetServer)) { 
    Serial.print(F("\nReceived event length="));
    Serial.println(availableLength);
    char event[availableLength];  
    EtherEvent.readEvent(event);  
    Serial.print(F("Received event: "));
    Serial.println(event);  
    availableLength = EtherEvent.availablePayload();  
    Serial.print(F("Received payload length="));
    Serial.println(availableLength);
    char payload[availableLength];
    EtherEvent.readPayload(payload);
    Serial.print(F("Received payload: "));
    Serial.println(payload);
  }

  if (millis() - sendTimeStamp > queueEventInterval) {  
    sendTimeStamp = millis();  
    Serial.println(F("\nAttempting event send"));
    if (EtherEvent.send(ethernetClient, targetIP, targetPort, "test", "test payload")) {  
      Serial.println(F("Event send successful"));
    }
    else {
      Serial.println(F("Event send failed"));
    }
  }
}

Il richiamo della Variabile Event che serve è questo che ho trovato dentro la libreria.

void EtherEventClass::readEvent(char eventBuffer[]) {
  strcpy(eventBuffer, receivedEvent);
  receivedEvent[0] = 0;  //reset the event buffer
  receivedEventLength = 0;

Ma mezzo tentativo di seguire il codice l'hai fatto? :o