+ Rispondi
Pagina 1 di 2 1 2 UltimaUltima
Risultati da 1 a 10 su 17

Discussione: codice arducoso

  1. #1
    TecnicoERMETICO riciclato
    Iscritto dal
    03/12/2011
    Località
    Monopoli
    Messaggi
    6,736

    codice arducoso

    Buonasera
    Stavo giocando con un po di arduino nano che ho a casa.
    Cerco di migliorarmi la vita in campagna.
    Oltre ad un ottimo orologio astronomico che mi risolve il problema degli orologi e crepuscolari, stavo mettendo insieme un affare che mi facesse usare i vari radiocomandi che ho in laboratorio, spesso privi del loro ricevitore.
    codice:
    Received 168848213 / 28bit Protocol: 6
    Received 168848229 / 28bit Protocol: 6
    Received 3537208 / 24bit Protocol: 1
    Received 3537204 / 24bit Protocol: 1
    Received 3537202 / 24bit Protocol: 1
    Received 3537202 / 24bit Protocol: 1
    Received 3537201 / 24bit Protocol: 1
    Received 3537202 / 24bit Protocol: 1
    Received 11171169 / 24bit Protocol: 1
    Received 11171170 / 24bit Protocol: 1
    Received 11171172 / 24bit Protocol: 1
    Received 11171172 / 24bit Protocol: 1
    Received 11171176 / 24bit Protocol: 1
    Received 32767 / 15bit Protocol: 5
    Il risultato dei codici ricevuti al momento, con questo sketch
    codice:
    /*  Simple example for receiving
      
      https://github.com/sui77/rc-switch/
    */
    
    
    #include <RCSwitch.h>
    
    
    RCSwitch mySwitch = RCSwitch();
    
    
    void setup() {
      Serial.begin(9600);
      mySwitch.enableReceive(0);  // Receiver on interrupt 0 => that is pin #2
    }
    
    
    void loop() {
      if (mySwitch.available()) {
        
        int value = mySwitch.getReceivedValue();
        
        if (value == 0) {
          Serial.print("Unknown encoding");
        } else {
          Serial.print("Received ");
          Serial.print( mySwitch.getReceivedValue() );
          Serial.print(" / ");
          Serial.print( mySwitch.getReceivedBitlength() );
          Serial.print("bit ");
          Serial.print("Protocol: ");
          Serial.println( mySwitch.getReceivedProtocol() );
        }
    
    
        mySwitch.resetAvailable();
      }
    }
    Codice esempio del programma arduino.
    La cosa che non trovo in rete, ne italia ne estero è un qualcosa che mi faccia attivare un relè in corrispondenza di una stringa.
    Trovo clonatori, ripetitori e minchiate di ogni tipo, ma un semplice ricevitore no.
    O forse sono io l'imbranato.
    Qualcuno sa un semplice if da inserire senza errori per alzare un uscita?
    Dovrebbe essere semplice ma io so modificare un codice funzionante che si avvicini alla mia bisogna.
    Schiaccio bottone accende relè, lascio bottone stacca relè....
    Ultima modifica: 05-05-2019 alle 18:45, di Ciskopa
    How much is a life worth? By law,a bank guard can carry a gun to protect his employer's money.
    But a parent here can't be legally armed to protect her children outside of home. [cit]


  2. #2

    Iscritto dal
    13/12/2011
    Località
    Salento!
    Messaggi
    6,839
    è abbastanza banale.
    Hai già trovato una corrispondenza tra codice ricevuto e emettitore?

    se si ti basta scriverti da parte una "mappa" dei codici per esempio:

    codice:
    int emettitore01 = 168848213;
    int emettitore02 = 3537208;
    poi setti i gpio che ti servono come output (a memoria non ricordo comando ma è facile).
    1 gpio, 1 relè.

    poi
    codice:
    switch(mySwitch.getReceivedValue())
    {
    case emettitore01:
       digitalWrite(pinRele01,ON); // o qualcosa del genere, non ricordo 
    break;
    }
    ovviamente immagino tu debba riportarlo ad off dopo un tot tempo.
    per esempio, ad ogni ciclo verifichi se è stesso codice, se cambiato lo metti ad off.

  3. #3
    TecnicoERMETICO riciclato
    Iscritto dal
    03/12/2011
    Località
    Monopoli
    Messaggi
    6,736
    Grazie della risposta, stavo provando un codice ma avevo qualche problema.
    Ho un gruppo di codici che confronto con quello ricevuto, di un solo radiocomando.
    Problema 1 banalmente non ho il follow vero e proprio, ma il sistema attiva il relè ad una pressione e lo disattiva alla successiva.
    Problema 2 più tosto.... io vorrei che un determinato relè o uscita venga attivato da più codici diversi, cosa che comunque posso risolvere via hardware.
    Problema 3 è che se devo compilare al primo errore del compilatore vado nel pallone, le correzioni che tento portano altri errori ecc ecc.
    How much is a life worth? By law,a bank guard can carry a gun to protect his employer's money.
    But a parent here can't be legally armed to protect her children outside of home. [cit]


  4. #4

    Iscritto dal
    13/12/2011
    Località
    Salento!
    Messaggi
    6,839
    Se ricordo bene, ora arduino ha piattaforma online con codice condivisibile. Fai il codice poi condividilo, te lo correggo

    Inviato dal mio gatto utilizzando Tapatalk

  5. #5
    TecnicoERMETICO riciclato
    Iscritto dal
    03/12/2011
    Località
    Monopoli
    Messaggi
    6,736
    Ho provato a cercare come condividere il codice, non ho trovato, o non ne sono capace.
    Questo è il pasticcio che ho messo su, accozzando vari sketch, ovvio se lo chiami porcata non mi offendo.

    codice:
    /* Utilizza la libreria  
     http://code.google.com/p/rc-switch/
      www.sciamannalucio.it
    */
    
    
    #include <RCSwitch.h> 
    RCSwitch mySwitch = RCSwitch();
    char *codice0 = "101010100111010101100001"; // codice 24 bit A
    char *codice1 = "101010100111010101100010"; // codice 24 bit B 
    char *codice2 = "101010100111010101100100"; // codice 24 bit C
    char *codice3 = "101010100111010101101000"; // codice 24 bit D
    
    
    
    
    int RX_Interrupt = 0; // DIGITAL Pin 2 da collegare al pin DATA della ricevente radio
    int TXbutton = 3; // Pulsante per l'insegnamento del codice al telecomando
    int led = 5; // led che indica che si sta insegnando al telecomando
    int relay0 = 6; // relè di uscita 1 
    int relay1 = 7; // relè di uscita 2
    int relay2 = 8; // relè di uscita 3 
    int relay3 = 9; // relè di uscita 4
    unsigned int value = 0; // conterrà il codice ricevuto
    
    
    int readBinaryString(char *s) {
      int result = 0;
      while(*s) {
        result <<= 1;
        if(*s++ == '1') result |= 1;
      }
      return result;
    }
    
    
    void setup() {
      mySwitch.enableTransmit(4); //Digital PIN 4 TX
      Serial.begin(115200); // imposta il baud del monitor seriale a 115200
     // Il ricevitore radio è connesso al DIGITAL Pin #2
      mySwitch.enableReceive(RX_Interrupt); // collega il Pin con funzione interrupt
      mySwitch.setRepeatTransmit(4);
      pinMode(TXbutton, INPUT_PULLUP);
      pinMode(led, OUTPUT);
      pinMode(relay0, OUTPUT); 
      pinMode(relay1, OUTPUT);
      pinMode(relay2, OUTPUT);
      pinMode(relay3, OUTPUT);
    }
    
    
    void loop() {
      while (digitalRead(TXbutton)==LOW) {
        digitalWrite(led, HIGH);
        mySwitch.send(codice0);
      }
      digitalWrite(led, LOW);
      // Se è arrivato un dato
      if (mySwitch.available()) { // controlla se è stato ricevuto un codice
        // memorizza il dato
        int value = mySwitch.getReceivedValue();
        // Se il dato vale zero
        if (value == 0) {
          Serial.print("Unknown encoding");
          // altrimenti
        } else {
          Serial.print(" Received ");
          Serial.print( mySwitch.getReceivedValue() ); // stampa il dato ricevuto
          if (readBinaryString(codice0)==value) { // controlla se il valore ricevuto è uguale al codice memorizzato
            digitalWrite(relay0, !digitalRead(relay0));
            Serial.println(" OK!");
            delay(1000);  // pausa di 1 secondo per evitare l'attivazione/disattivazione veloce
          } else {
           mySwitch.resetAvailable();  
          Serial.print(" Received ");
          Serial.print( mySwitch.getReceivedValue() ); // stampa il dato ricevuto
          if (readBinaryString(codice1)==value) { // controlla se il valore ricevuto è uguale al codice memorizzato
            digitalWrite(relay1, !digitalRead(relay1));
            Serial.println(" OK!");
            delay(1000);  // pausa di 1 secondo per evitare l'attivazione/disattivazione veloce
            } else {
               mySwitch.resetAvailable();
          Serial.print(" Received ");
          Serial.print( mySwitch.getReceivedValue() ); // stampa il dato ricevuto
          if (readBinaryString(codice2)==value) { // controlla se il valore ricevuto è uguale al codice memorizzato
            digitalWrite(relay2, !digitalRead(relay2));
            Serial.println(" OK!");
            delay(1000);  // pausa di 1 secondo per evitare l'attivazione/disattivazione veloce
            } else {
               mySwitch.resetAvailable();
          Serial.print(" Received ");
          Serial.print( mySwitch.getReceivedValue() ); // stampa il dato ricevuto
          if (readBinaryString(codice3)==value) { // controlla se il valore ricevuto è uguale al codice memorizzato
            digitalWrite(relay3, !digitalRead(relay3));
            Serial.println(" OK!");
            delay(1000);  // pausa di 1 secondo per evitare l'attivazione/disattivazione veloce
            Serial.println(" NO!");
             } else {
          }
        }
        // ri-arma la ricezione dei dati
        mySwitch.resetAvailable();
      }
    }
    }
    
    
    }
    }
    Lo sketch era stato realizzato per duplicare un radiocomando.
    Io ho sostituito al valore acquisito il valore fisso per attivare poi ho copincollato più volte il comando per attivare un uscita, solo che a monitor seriale è una gran vaccata.
    Quindi confido in un vostro aiuto per un codice almeno più "umano"
    How much is a life worth? By law,a bank guard can carry a gun to protect his employer's money.
    But a parent here can't be legally armed to protect her children outside of home. [cit]


  6. #6

    Iscritto dal
    13/12/2011
    Località
    Salento!
    Messaggi
    6,839


    appena ho un secondo te lo correggo

  7. #7

    Iscritto dal
    13/12/2011
    Località
    Salento!
    Messaggi
    6,839
    codice:
    /* Utilizza la libreria  
     http://code.google.com/p/rc-switch/
      www.sciamannalucio.it
    */
    
    
    #include <RCSwitch.h> 
    RCSwitch mySwitch = RCSwitch();
    #define codice0 0x00AA7561
    #define codice1 0x00AA7562
    #define codice2 0x00AA7563
    #define codice3 0x00AA7564
    
    #define DELTA_MILLIS 1000
    
    
    int RX_Interrupt = 0; // DIGITAL Pin 2 da collegare al pin DATA della ricevente radio
    int TXbutton = 3; // Pulsante per l'insegnamento del codice al telecomando
    int led = 5; // led che indica che si sta insegnando al telecomando
    int relay0 = 6; // relè di uscita 1 
    int relay1 = 7; // relè di uscita 2
    int relay2 = 8; // relè di uscita 3 
    int relay3 = 9; // relè di uscita 4
    unsigned int value = 0; // conterrà il codice ricevuto
    unsigned long t_recv = 0;
    unsigned long t_codice0 = 0,t_codice1 = 0,t_codice2 = 0,t_codice3 = 0;
    
    void setup() {
      mySwitch.enableTransmit(4); //Digital PIN 4 TX
      Serial.begin(115200); // imposta il baud del monitor seriale a 115200
     // Il ricevitore radio è connesso al DIGITAL Pin #2
      mySwitch.enableReceive(RX_Interrupt); // collega il Pin con funzione interrupt
      mySwitch.setRepeatTransmit(4);
      pinMode(TXbutton, INPUT_PULLUP);
      pinMode(led, OUTPUT);
      pinMode(relay0, OUTPUT); 
      pinMode(relay1, OUTPUT);
      pinMode(relay2, OUTPUT);
      pinMode(relay3, OUTPUT);
      t_codice0 = t_codice1 = t_codice2 = t_codice3 = millis(); /// inizializzo il tempo come se avessi premuto tutti i tasti
    }
    
    
    void loop() {
      while (digitalRead(TXbutton)==LOW) {
        digitalWrite(led, HIGH);
        mySwitch.send(codice0);
      }
      digitalWrite(led, LOW);
      // Se è arrivato un dato
      if (mySwitch.available()) { // controlla se è stato ricevuto un codice
        // memorizza il dato
        int value = mySwitch.getReceivedValue();
        t_recv = millis();
        // Se il dato vale zero
        Serial.print(" Received %4x", mySwitch.getReceivedValue());
    
        switch(value)
        {
          case 0: //UNKNOW ENCODING
             Serial.print("Unknown encoding");
          break;
          case codice0:
            if((t_recv - t_codice0) >= DELTA_MILLIS ) ///se e' passato almeno un secondo, gestisco evento
            {
               digitalWrite(relay0, !digitalRead(relay0));
               Serial.println(" OK!");
               t_codice0 = millis();
            }  
          break;
          case codice1:
            if((t_recv - t_codice1) >= DELTA_MILLIS ) ///se e' passato almeno un secondo, gestisco evento
            {
               digitalWrite(relay1, !digitalRead(relay1));
               Serial.println(" OK!");
               t_codice1 = millis();
            }  
          break;
          case codice2:
            if((t_recv - t_codice2) >= DELTA_MILLIS ) ///se e' passato almeno un secondo, gestisco evento
            {
               digitalWrite(relay2, !digitalRead(relay2));
               Serial.println(" OK!");
               t_codice2 = millis();
            }  
          break;
          case codice3:
            if((t_recv - t_codice3) >= DELTA_MILLIS ) ///se e' passato almeno un secondo, gestisco evento
            {
               digitalWrite(relay3, !digitalRead(relay3));
               Serial.println(" OK!");
               t_codice3 = millis();
            }  
          break;
     default:
            Serial.println("Unknow code: %4x",value);
          break;
    
    
        } 
        mySwitch.resetAvailable();  
    
     }  
    }

    Potevo farlo "piu' meglio " ma poi non credo che tu sia in grado di interpretarlo.
    Allora.
    A differenza de tuo:
    NON ci sono sleep, questo ti permette di premere due emettitori in vicinanza.
    i codici sono numerici, gestire le stringhe e' lento, lentissimo!

    Il concetto e' questo:
    chiedo se ho un dato, se 0 stampo unknow encoding.
    Se e' un valore conosciuto, se sono passati almeno 1000ms (l idefinisci con DELTA_MILLIS ) gestisco pressione e salvo tempo dell'ultima pressione (di quel tasto).
    Io eliminerei i serial print durante la ricezione ma, prova tu.

  8. #8
    TecnicoERMETICO riciclato
    Iscritto dal
    03/12/2011
    Località
    Monopoli
    Messaggi
    6,736
    Grazie del tuo tempo.
    Ho provato a caricare , mi da errore a questa riga.
    codice:
     Serial.print(" Received %4x", mySwitch.getReceivedValue());
    Penso sia %4x che lo fa incavolare, nessun problema ho messo due // e scavalco, sia quella che l'altra riga.
    Il codice è stato compilato correttamente, tra n po provo a fare due prove.
    Li serial print lo uso spesso per verificare se il tutto funziona, poi se la cosa mi da segni di affidabilità elimino i comandi
    How much is a life worth? By law,a bank guard can carry a gun to protect his employer's money.
    But a parent here can't be legally armed to protect her children outside of home. [cit]


  9. #9

    Iscritto dal
    13/12/2011
    Località
    Salento!
    Messaggi
    6,839
    ah non ha i marcatori... non ricordavo più sorry.
    Il resto dovrebbe compilare correttamente

  10. #10

    Iscritto dal
    13/12/2011
    Località
    Salento!
    Messaggi
    6,839


 

Autorizzazioni

  • Non puoi iniziare nuove discussioni
  • Non puoi rispondere alle discussioni
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
Powered by vBulletin™ Version 4.1.5
Copyright © 2019 vBulletin Solutions, Inc. All rights reserved
SEO by vBSEO ©2011, Crawlability, Inc.
Fuso orario: UTC +1, sono le 01:59.