Salve, io sono nuovo nel mondo Arduino e vorrei imparare a conoscerlo, volevo per cominciare come primo progetto a costruire una lampada a levitazione

Non capisco ...
... fare copia/incolla del codice e marcarlo come CODE è troppo faticoso ??? :open_mouth:

Guglielmo

1 Like

Bravo, fa così va.

Ci vuole molto meno che a caricare due foto!

1 Like

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

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 :wink: quindi posta qui il "nuovo" codice ripulito, così ti diciamo

Grazie mille :grin:

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:

  1. Non è stato indentato correttamente, non hai usato Ctrl-T
  2. Non hai descritto se funziona o meno (e probabilmente non va)
  3. Non ho capito bene cosa vorresti fare...

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