Non capisco ...
... fare copia/incolla del codice e marcarlo come CODE è troppo faticoso ??? ![]()
Guglielmo
Non capisco ...
... fare copia/incolla del codice e marcarlo come CODE è troppo faticoso ??? ![]()
Guglielmo
Bravo, fa così va.
Ci vuole molto meno che a caricare due foto!
...a parte che:
https://www.google.com/search?&q=magnetic+levitation+lamp+diy
#include <VirtualWire.h>
#define TX_pin 12 // il trasmettitore viene collegato al pin 12
#define LED_pin 13 // il led viene collegato al pin 13
#define PB_pin 3 // l'interruttore viene collegato al pin 3
/* ----------------------------------------------------------
Riceve un comando per accendere il led sul pin 13
----------------------------------------------------------- */
#include <VirtualWire.h>
#define LED_pin 13
#define RX_pin 11
int prec_Stato=-1;
const char *msg_ON = "LED_ON";
const char *msg_OFF = "LED_OFF";
void setup()
{
Serial.begin(9600);
pinMode(LED_pin,OUTPUT);
pinMode(PB_pin,INPUT);
digitalWrite(LED_pin, LOW);
vw_set_tx_pin(TX_pin); // Imposto il pin per la trasmissione
vw_setup(3000); // Bits per sec
pinMode(LED_pin, OUTPUT);
digitalWrite(LED_pin, LOW);
vw_setup(3000); // bit per sec
vw_rx_start();//inizio il processo di ricezione
Serial.begin(9600); // solo per debug
Serial.println("ricevitore attivo:");
}
void loop()
{
int buttonState = digitalRead(PB_pin);
{if (buttonState!=prec_Stato)
if (buttonState==HIGH)
vw_send((uint8_t *)msg_ON, strlen(msg_ON));
else
vw_send((uint8_t *)msg_OFF, strlen(msg_OFF));
vw_wait_tx(); // Aspetta che il processo in background di spedizione sia completo
Serial.println("Stato: "+String(buttonState) + " - Prec. Stato: "+String(prec_Stato));
digitalWrite(LED_pin, buttonState);
prec_Stato=buttonState;
{
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
if (vw_get_message(buf, &buflen)) // Non-blocking
buf[buflen]='\0'; // Metto il terminatore di stringa
if (strncmp((char *)buf,"LED_ON",buflen)==0)
digitalWrite(LED_pin, HIGH); // Accendo il LED
else if (strncmp((char *)buf,"LED_OFF",buflen)==0)
digitalWrite(LED_pin,LOW); // Spengo il LED
Serial.print("Comando Ricevuto (" +String(buflen)+" car.): ");
Serial.println((char *)buf+String("//"));
}
}
}
Questo che ho scritto, non rimane accesso quando lascio l'interruttore.
dovrebbe funzionare che quando premo l'interruttore, tramite un trasmettitore ed un ricevitore si accende e quando lo premo una seconda volta si spegne.
ciao 1693lm
tralasciando l'uso e non uso delle graffe, a mio avviso ci sono dove non dovrebbero esserci e non ci sono dove dovrebbero, poi... due vw_setup(3000), due pinMode(LED_pin), due Serial.begin(9600), due #define LED_pin, due #include <VirtualWire.h>, l'uso della classe String che generalmente su Arduino è sconsigliata...un problema è che in due posti diversi del programma fai esattamente la stessa cosa e cioè imposti lo stato dei pin di uscita; dal mio punto di vista in un solo ed unico punto (penso preferibilmente dopo tutte le verifiche necessarie) imposti lo stato di uscita di un pin.
Un consiglio che posso darti è quello di tener sempre presente che un programma, se compila, fa esattamente quello che gli dici di fare...non si inventa nulla.
ciao
Scusa eh, se permetti è la prima volta che programmo, ho chiesto solo un consiglio, non mi servono delle prediche.
... guarda che nessuno ti ha fatto "delle prediche", ma ti sono stati dati "dei consigli e indicati degli errori" relativamente a quanto hai messo che è, evidentemente, frutto di una serie di copia/incolla senza capire bene cosa si copia e si incolla e senza aver ben chiaro come si programma.
Se non ti stanno bene i consigli che ti si danno e come ti si danno, e reagisci in questo modo, nessuno te ne darà altri ... ![]()
Guglielmo
P.S.: il punto 16.1 del REGOLAMENTO contiene, tra l'altro, l'indicazione di alcuni pdf e di un ottimo libro ... io, fossi in te, prima di voler realizzare certe cose, comincerei a studiare le BASI proprio da quelli.
Anche se il mondo di Arduino è impostato per farlo sembrare un giocattolo per tutte le età, in realtà stiamo programmando un microcontrollore, cosa tutt'altro che banale!
Per le linee duplicate puoi notarlo anche tu stesso ad occhio, ad esempio la #include e #define LED_pin. In questo caso, cancella tutte le righe che trovi duplicate.
D'altronde se non lo fai, il codice non ti compila quindi come fai a dire se funziona o no??? Tu devi sempre postare qui codice che almeno ti compila, poi si può analizzare codice e comportamento!
Per la libreria VirtualWire, confermi di averla installata?
Per il discorso delle graffe, nell'IDE premi i tasti Ctrl-T: serve per far indentare correttamente il codice, e già così dovresti iniziare a vedere ad esempio che la graffa aperta non va messa davanti all'if() ma dopo, ossia non "{if (buttonState!=prec_Stato)" ma:
...
int buttonState = digitalRead(PB_pin);
if (buttonState!=prec_Stato)
{
if (buttonState==HIGH)
vw_send((uint8_t *)msg_ON, strlen(msg_ON));
else
...
Quando avrai fatto almeno queste correzioni verifica se il codice ti compila, e se funziona come vorresti. Ma credo che troverai altro
quindi posta qui il "nuovo" codice ripulito, così ti diciamo
Grazie mille ![]()
Si lo scaricata
#include <VirtualWire.h>
#define TX_pin 12 // il trasmettitore viene collegato al pin 12
#define LED_pin 13 // il led viene collegato al pin 13
#define PB_pin 3 // l'interruttore viene collegato al pin 3
#define RX_pin 11 // il ricevitore viene collegato al pin 11
int prec_Stato=-1;
const char *msg_ON = "LED_ON";
const char *msg_OFF = "LED_OFF";
void setup()
{
Serial.begin(9600);
pinMode(LED_pin,OUTPUT);
pinMode(PB_pin,INPUT);
digitalWrite(LED_pin, LOW);
vw_set_tx_pin(TX_pin); // Imposto il pin per la trasmissione
vw_setup(3000); // Bits per sec
vw_rx_start();//inizio il processo di ricezione
Serial.println("ricevitore attivo:");
}
void loop()
{
int buttonState = digitalRead(PB_pin);
if (buttonState!=prec_Stato)
{
if (buttonState==HIGH)
vw_send((uint8_t *)msg_ON, strlen(msg_ON));
else
vw_send((uint8_t *)msg_OFF, strlen(msg_OFF));
vw_wait_tx(); // Aspetta che il processo in background di spedizione sia completo
Serial.println("Stato: "+String(buttonState) + " - Prec. Stato: "+String(prec_Stato));
digitalWrite(LED_pin, buttonState);
prec_Stato=buttonState;
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
if (vw_get_message(buf, &buflen)) // Non-blocking
buf[buflen]='\0'; // Metto il terminatore di stringa
if (strncmp((char *)buf,"LED_ON",buflen)==0)
digitalWrite(LED_pin, HIGH); // Accendo il LED
else if (strncmp((char *)buf,"LED_OFF",buflen)==0)
digitalWrite(LED_pin,LOW); // Spengo il LED
Serial.print("Comando Ricevuto (" +String(buflen)+" car.): ");
Serial.println((char *)buf+String("//"));
}
}
Ma questo è il codice del trasmettitore o del ricevitore?
Mi sembra una cosa confusa...
In teoria volevo provarlo se funzionava solo su una scheda con entrambi
Ok ma:
Con quel codice apparentemente quando premi il pulsante (lasciamo stare per ora se resta premuto o meno) mandi il messaggio "msg_OFF" (a chi? per fare che?) quindi aspetti che arrivi un messaggio (da chi?) che poi confronti con le stringhe "LED_ON" e "LED_OFF" (perché non usi un semplice byte o carattere, che so, '0' per OFF e '1' per ON?) e con questo accendi/spegni il LED. Ma mi sfugge lo scopo.
Rivedi il codice, indentalo bene, e poi spiega meglio il progetto che a me, che sono duro di comprendonio, non è proprio chiaro.
Mi sono dimenticato scusa il progetto è una lampada a levitazione magnetica con un interruttore touch, utilizzando un trasmettitore ed un ricevitore, e no non funziona non rimane acceso. Dopo provo a modificarlo
ciao,
come ti dicevo hai due punti nel programma in cui imposti l'uscita...uno per il controllo dello stato del pin ed uno per verifica dato ricevuto da "seriale"...provane uno alla volta.
per l'identazione...forse mi sbaglio ma come fai tu sembra tanto python like...anche qui in arduino l'identazione è importante per la comprensione del programma...ma non ha la stessa funzione...quindi ...per come hai scritto il programma viene eseguito la sola prima riga dopo gli IF e ELSE IF e non tutto quello che si trova sulla stessa colonna...poi se mi sbaglio pardon.
Non è che mi potresti fare un esempio ![]()