Souliss – Usare una "8 relay board"

Ecco un breve esempio per usare, con il framework per la domotica Souliss, una scheda con 8 relè.

Nell’immagine sotto, scheda Arduino e scheda relè:

Nell’immagine sotto Arduino, scheda Ethernet Board W5100 e scheda 8 relè.

Il collegamento della scheda è semplicissimo.

I pin 1 e 8 della scheda relè sono dedicati all’alimentazione a 5V, mentre i rimanenti, da 2 a 9, sono i pin di comando dei relé.

Io ho collegato i pin della scheda relé (2-9) ai pin di Arduino da 2 a 9, in modo da lasciare liberi, su Arduino, i pin 0-1 dedicati alla comunicazione seriale, qualora si decida di usarla per il debug, ed il pin 10, utilizzato quale pin CS (cable select) nella comunicazione SPI della scheda ethernet.

Questo è lo sketch da caricare su Arduino:


#include "Souliss.h"
#include "Typicals.h"
#include <SPI.h>

// network addresses
#define network_address_2    0x0012     // 0x0011 is equal to 17 in decimal
#define network_my_subnet    0xFF00
#define network_my_supern    0x0000

// define the shared memory map
U8 memory_map[MaCaco_MEMMAP];

// flag
U8 data_changed = 0;

#define time_base_fast        10                // Time cycle in milliseconds
#define time_base_slow        10000            // Time cycle in milliseconds
#define num_phases            255                // Number of phases

U8 phase_speedy=0, phase_fast=0, phase_slow=0;
unsigned long tmr_fast=0, tmr_slow=0;

U8 firstPIN=2; //first pin used by Arduino for relay board
U8 lastPin=9;  //last pin used by Arduino for relay board

U8 iSLOT=0;   //first slot used by Typical 11

void setup()
{
Souliss_SetAddress(network_address_2, network_my_subnet, network_my_supern);
// Load the address also in the memory_map
Souliss_SetLocalAddress(memory_map, network_address_2);

//setup 8 Typical 11
for(U8 iPin=firstPIN;iPin<=lastPin;iPin++)
{
pinMode(iPin, OUTPUT);
digitalWrite(iPin, HIGH);
Souliss_SetT11(memory_map,iSLOT++);
}

}

void loop()
{
// The Souliss methods are scheduled in phases, this allow load
// balance and proper timing.

if(abs(millis()-tmr_fast) > time_base_fast)
{
tmr_fast = millis();
phase_fast = (phase_fast + 1) % num_phases;

// Execute the code every 3 time_base_fast
if (!(phase_fast % 3))
{
// TO IMPLEMENT: SETUP PIN FOR WALL SWITCH
//Souliss_DigIn( ETC....

// Execute the logic for typicals 11
U8 iSlot;
iSLOT=0;
for(U8 iPin=firstPIN;iPin<=lastPin;iPin++)
{
Souliss_Logic_T11(memory_map, iSLOT, &data_changed);
Souliss_LowDigOut(iPin, Souliss_T1n_Coil, memory_map, iSLOT);
iSLOT++;
}
}

// Execute the code every 5 time_base_fast
if (!(phase_fast % 5))
{
// Retreive data from the communication channel
Souliss_CommunicationData(memory_map, &data_changed);
}
}
}

Attenzione, perchè funzioni è necessario che il framework Souliss sia presente e configurato per la specifica scheda Arduino in uso.

Per altre informazioni ecco alcuni link:

https://groups.google.com/forum/#!forum/souliss

http://www.souliss.net/

18 Replies to “Souliss – Usare una "8 relay board"”

  1. Salve a Tutti,

    da qualche giorno ho scoperto souliss. Sono riuscito (utilizzando il creatore di sketch automatico di souliss) a comandare già una lampadina dall’ app di Souliss. Siccome volevo comandare la lampada anche con il suo interruttore ( in modo che anche se arduino non funzionasse piu’ per qulche motivo ho sempre la possibilità di accenderlo localmente) mi trovo di fronte a questo enigma: L’app di souliss non riporta l’effettivo statao della lampada (acceso o spento) ma si limita a fare il cambimento dello stato ogni volta che premo on o off. Come posso leggere l’effetivo stato della lampada ed aggiornare quindi l’icona dell’app in base alla effettiva accensione o spegnimento? ho letto da qualche parte che potrebbe essere usato il comando DigIn , ma non ho capito come implementarlo nello sketch e quali collegamenti hardware effettuare sia lato lampadina che arduino.
    Saluti.

    • Si può usare il tipico T18. Graficamente appare il T11, ma ti da la possibilità di usare un relè passo passo ed avere un Feedback, che può essere, ad esempio, lo stato on/off, di una lampada.

      • Grazie per la tua risposta. Intendi che devo usare i relè passo passo in sostituzione degli interruttori che attualmente ho? Oppure il passo passo solo per ottenere lo stato reale della luce accesa o spenta? Quali configurazioni hardware bisogna fare? Ciao

        • scusa ma sono in altomare, potresti darmi qualche dettaglio in piu’ in merito alla mia richiesta? Io uso il configuratore automatico dei nodi souliss, quale “oggetto” devo inserire? e quali collegamenti Hardware sono da fare??
          Graziwe

        • L’interruttore rimane, ma meglio forse sarebbe usare un pulsante, e si collega non al relè ma ad Arduino. L’uscita di Arduino poi si collega ai contatti di comandoddl relè. Il secondo contatto del relè passo passo può essere usato per avere il feedback, ma esistono altro metodo, come ad esempio impacchettare unz piccola lampadina 220 v ed una fotoresistenza per rilevare la 220v
          Se cerchi T18 sul gruppo trovi delle discussioni

  2. Salve a tutti ho iniziato da poco ad usare souliss sto scrivendo uno sketch per 8 relè ma mi da errore sulla riga dove scrivo
    U8 memory_map[MaCaco_MEMMAP];
    mi aiutate a risolvere il problema

  3. Salve ho copiato questo sketch ma non funziona da errore come Francesco.
    Per favore qualcuno può aiutarmi

  4. Ciao sono Francesco, sono un neofita di Arduino, Souliss,
    sto provando ha caricare il tuo sketch ma molto probabilmente uso un framework Souliss errato, la mia configurazione è basata su un Arduino Uno + Shield ethernet. quando lancio la programmazione Arduino IDE mi restituisce questo errore:
    In file included from /Applications/Arduino.app/Contents/Java/libraries/Souliss/Souliss.h:38:0,
    from sketch_may27a.ino:1:
    /Applications/Arduino.app/Contents/Java/libraries/Souliss/GetConfig.h:63:42: error: redefinition of ‘const U16 vnet_media_en [5]’
    const U16 vnet_media_en[VNET_MEDIA_NUMBER] = {VNET_MEDIA1_ENABLE, // Media 1
    ^
    In file included from /Applications/Arduino.app/Contents/Java/libraries/Souliss/GetConfig.h:39:0,
    from /Applications/Arduino.app/Contents/Java/libraries/Souliss/Souliss.h:38,
    from sketch_may27a.ino:1:
    /Applications/Arduino.app/Contents/Java/libraries/Souliss/conf/frame/vNetCfg.h:207:12: error: ‘const U16 vnet_media_en [5]’ previously defined here
    const U16 vnet_media_en[VNET_MEDIA_NUMBER] = {VNET_MEDIA1_ENABLE, // Media 1
    ^
    sketch_may27a.ino:11:28: error: redefinition of ‘U8 memory_map [112]’
    In file included from /Applications/Arduino.app/Contents/Java/libraries/Souliss/Souliss.h:162:0,
    from sketch_may27a.ino:1:
    /Applications/Arduino.app/Contents/Java/libraries/Souliss/base/SpeakEasy.h:30:4: error: ‘U8 memory_map [112]’ previously declared here
    U8 memory_map[MaCaco_MEMMAP]; // define the shared memory map
    ^
    sketch_may27a.ino:14:4: error: redefinition of ‘U8 data_changed’
    In file included from /Applications/Arduino.app/Contents/Java/libraries/Souliss/Souliss.h:162:0,
    from sketch_may27a.ino:1:
    /Applications/Arduino.app/Contents/Java/libraries/Souliss/base/SpeakEasy.h:31:4: error: ‘U8 data_changed’ previously defined here
    U8 data_changed = 1; // flag
    ^
    sketch_may27a.ino:20:4: error: conflicting declaration ‘U8 phase_speedy’
    In file included from /Applications/Arduino.app/Contents/Java/libraries/Souliss/Souliss.h:162:0,
    from sketch_may27a.ino:1:
    /Applications/Arduino.app/Contents/Java/libraries/Souliss/base/SpeakEasy.h:38:5: error: ‘phase_speedy’ has a previous declaration as ‘U16 phase_speedy’
    U16 phase_speedy=0, phase_fast=0, phase_slow=0;
    ^
    sketch_may27a.ino:20:20: error: conflicting declaration ‘U8 phase_fast’
    In file included from /Applications/Arduino.app/Contents/Java/libraries/Souliss/Souliss.h:162:0,
    from sketch_may27a.ino:1:
    /Applications/Arduino.app/Contents/Java/libraries/Souliss/base/SpeakEasy.h:38:21: error: ‘phase_fast’ has a previous declaration as ‘U16 phase_fast’
    U16 phase_speedy=0, phase_fast=0, phase_slow=0;
    ^
    sketch_may27a.ino:20:34: error: conflicting declaration ‘U8 phase_slow’
    In file included from /Applications/Arduino.app/Contents/Java/libraries/Souliss/Souliss.h:162:0,
    from sketch_may27a.ino:1:
    /Applications/Arduino.app/Contents/Java/libraries/Souliss/base/SpeakEasy.h:38:35: error: ‘phase_slow’ has a previous declaration as ‘U16 phase_slow’
    U16 phase_speedy=0, phase_fast=0, phase_slow=0;
    ^
    sketch_may27a.ino:21:15: error: redefinition of ‘long unsigned int tmr_fast’
    In file included from /Applications/Arduino.app/Contents/Java/libraries/Souliss/Souliss.h:162:0,
    from sketch_may27a.ino:1:
    /Applications/Arduino.app/Contents/Java/libraries/Souliss/base/SpeakEasy.h:39:15: error: ‘long unsigned int tmr_fast’ previously defined here
    unsigned long tmr_fast=0, tmr_slow=0;
    ^
    sketch_may27a.ino:21:27: error: redefinition of ‘long unsigned int tmr_slow’
    In file included from /Applications/Arduino.app/Contents/Java/libraries/Souliss/Souliss.h:162:0,
    from sketch_may27a.ino:1:
    /Applications/Arduino.app/Contents/Java/libraries/Souliss/base/SpeakEasy.h:39:27: error: ‘long unsigned int tmr_slow’ previously defined here
    unsigned long tmr_fast=0, tmr_slow=0;
    ^
    Errore durante la compilazione

  5. Tonino, ho copiato questo sketch, tutto bene.
    Ora vorrei chiedere, dovendo azionare delle tapparelle, per cui si rende necessario avere due pulsanti che comandano due relè, es. tipico 21 0 22,
    apri/chiudi, come devo modificare lo sketch.
    Ti ringrazio

  6. Buongiorno! Intanto ottima guida, la sto prendendo come spunto per iniziare son Souliss. Non è molto che ho conosciuto questo framework però l’ Arduino l’ ho sempre utilizzato e stavo proprio aspettando un sistema per la domotica. Da progettista di impianti elettrici quale sono, osservando la “posizione” di questo sistema mi sono posto questo problema: ma se il sistema va in palla, io non controllo più niente. Oltretutto ammesso che io per controllare una lampada utilizzi un relé passo-passo, in parallelo al pulsante classico da muro ci collego Souliss e quindi posso accenderla anche tramite App. Ma se qualcuno accende la luce in maniera tradizionale, come si aggiorna lo stato del pulsante sull’ App? (che tra l’ altro, in questo caso non è un interruttore bensì un pulsante). Secondo me bisognerebbe utilizzare gli ingressi dell’ Arduino non per attuare bensì per rilevare l’ effettivo cambiamento di stato in modo da aggiornare i flag per l’ App. Così è possibile rendere Souliss indipendente senza che incida sull’ intero impianto facilitando anche l’ integrazione sull’ esistente.
    Grazie,
    Simone

    • Ciao Simone,
      benvenuto sul pianeta Souliss. Vedrai che ti divertirai. 🙂
      Ho visto che hai scritto sul forum https://groups.google.com/forum/#!forum/souliss
      quindi hai già la risposta.
      Il sistema, sia Souliss che SoulissApp, è assolutamente stabile, ma di certo non è possibile prevedere eventuali errori hardware.
      In tal caso, in caso di crash, non potrai controllare i devices attivi sul nodo in panne.

      Come hai potuto leggere tra le risposte sul forum di Souliss la risposta alla tua domanda è il Tipico18, che consente di fare funzionare Souliss in abbinamento ad un relè passo-passo.
      Usando quel Tipico l’impianto di casa rimane separato dal sistema Souliss.

      Io ho fatto qualche test con il Tipico18 ed ho visto che il nodo “soffre” dei disturbi elettromagnetici creati dal relè passo-passo in fase di commutazione (Arduino si piantava dopo qualche commutazione).
      Un filtro RC potrebbe essere sufficiente.
      Rendici partecipi di eventuali tuoi test.

      • Grazie per la risposta! Si, mi sono iscritto al forum ufficiale ma era più giusto prima esporre il mio problema qui, su questo sito, da momento che proprio leggendo questo articolo mi è partita l’idea. In ogni caso documenterò gli esperimenti in corso sul thread da me aperto. Il problema del disturbo elettrico non è assolutamente da sottovalutare, farò anche li dei test.PS: mi sto già divertendo! 🙂

  7. Salve sono elettricista, ma come passione c’è l’elettronica, infatti da quando ho scoperto arduino e nel tempo libero dedico ore a vari progetti,e navigando per esperienze,e progetti in rete son venuto a conoscenza di souliss home automation, e quindi arrivando all’articolo( Souliss – Usare una “8 relay board) di cui trovo molto interessante non nego dopo aver visionato lo sketch ho subito copiato ed incollato nella libreria arduino ovviamente anche caricato e provato la funzionalità quindi complimenti.Anche se ho riscontrato un problema nel caricare lo sketch nell’ arduino uno duemilaenove con ethernet shield w5100, tutti i pin dal 2 al 9 sono gia High dove ho collegato un led per ogni pin, invece sull app souliss del samsung s3 nel nodo erano in off poi pulsando su on si spengono, non son riuscito a capire dove il perche ho fatti vari tentativi ma niente, sarei molto felice di qualche aiuto ripeto è molto interressante per qualche progetto grazie.

    • Ciao, mi fa piacere che l’articolo interessi.
      Sul forum (qui: https://groups.google.com/forum/#!forum/souliss) potrai trovare una comunità Souliss in crescita, puntuale supporto ai problemi e tante idee.

      Per quanto riguarda lo sketch, hai ragione, il livello di uscita è invertito rispetto alla posizione visualizzata in SoulissApp.
      L’uso della scheda relé che vedi in foto, che alimenta il relé in presenza di un livello HIGH, mi ha costretto a scrivere lo sketch in questo modo.

      Fai così:
      nel setup inizializza a LOW invece che HIGH

      //setup 8 Typical 11
      for(U8 iPin=firstPIN;iPin< =lastPin;iPin++) { pinMode(iPin, OUTPUT); digitalWrite(iPin, LOW); ...etc... e più in basso invece della funzione Souliss_LowDigOut usa Souliss_DigOut, con gli stessi parametri.

      Fammi sapere.
      Tonino

      • Allora tutto ok Toni grazie per la correzione ora lo stato è Low dopo aver caricato, purtroppo sono alle prime armi ciao Giuseppe

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

wp-puzzle.com logo