[Résolu] Pistes pour Sonnette connectée ?

Forum dédié au Rfxcom et consorts utilisant les fréquences 433 et 866 MHz.
Pour les questions concernant les RFLINK, merci d'utiliser le forum spécifique en dessous.
RaspOlivier
Messages : 129
Inscription : 10 déc. 2016, 09:40
Localisation : 44 - NANTES

[Résolu] Pistes pour Sonnette connectée ?

Message par RaspOlivier »

Bonjour,

je voudrais réaliser un BP de sonnette qui m'envoi un mail ou actionne une sortie de Rpi.

Je n'arrive pas à trouver de tuto sur internet qui correspondrait à mon besoin qui pourtant me parait simple.

L'idée serait d'utiliser pour l’émetteur :
  • un ATtiny85
    un FS1000A
    une CR2032
et pour le récepteur :
  • un RFXCOM
Je ne veux pas utiliser d'emetteur tout fait du genre CHACON 84210 car je voudrais multiplier ce genre de télécommande dans la maison et cela va revenir bien plus cher.

Les tutos que j'ai vu on souvent un récepteur appairé ce qui ne m'interresse pas (comme https://www.instructables.com/id/ATtiny ... e-Control/) ou (http://bateaux.trucs.free.fr/telecommande_4_voies.html).

J'ai pensé me servir de https://domotique.web2diz.net/capteur-n ... l-pour-5e/ pour faire une télécommande 4 canaux au lieu d'avoir 4 sondes mais la source .ino fournie https://github.com/Sirus10/Arduino/blob ... _power.ino me parait buggée (erreur de compilation et d'après les commentaires, je ne suis pas le seul mais en même temps ça m'étonne et comme je débute avec arduino et le langage C, il y a peut-être quelque-chose que je fait mal).

Avez-vous déjà étudié de tels systèmes ?
Dernière modification par RaspOlivier le 14 août 2020, 18:14, modifié 3 fois.
RaspOlivier
Messages : 129
Inscription : 10 déc. 2016, 09:40
Localisation : 44 - NANTES

Re : Pistes pour Sonnette connectée ?

Message par RaspOlivier »

Bonjour,
Pour ceux que ça peut intéresser, voici un code qui fonctionne et fait ce que je veux ... sur un nano !
Maintenant, il faut que ça fonctionne sur un ATtiny85 et le fonctionnement que j'obtient semble ralenti ! j'ai bien une réaction à l'appui du BP mais au lieu de 0.5 seconde, j'ai aux alentours de 4 secondes, comme si le tiny allait 8 x moins vite que l'Arduino :?: .

.

Code : Tout sélectionner

/*  Sonnette sans fil pour DOMOTICZ
    Dernière mise à jour le 09/08/2020

    A utiliser avec un Arduino ou un ATtiny85
*/

#include <NewRemoteTransmitter.h>

// Inititalisation matérielle

int bouton = 2;               // Port 2 (broche 7 de l'ATtiny85 ou broche 5 sur un Arduino nano) sur lequel est raccordé le BP (avec un pull-down de 22K (rouge-rouge-orange))
int pinTx = 3;                // Port 3 (broche 2 de l'ATtiny85 ou broche 6 sur un Arduino nano) sur lequel est raccordé l'emetteur type FS1000A
int led = 4;                  // Port 4 (broche 3 de l'ATtiny85 ou broche 7 sur un Arduino nano) sur lequel est raccordée une led sur la sonnette (optionnelle, s'allume 0,5 secondes quand l'emetteur envoi un signal)

// Initialisation logicielle

int adresse = 2;              // Adresse de la sonnette, mettre 3 par exemple pour utiliser le même montage ailleurs dans la maison pour un contact de porte, boite à lettre, ...
int periode = 260;            
int nbRepetitionCode = 1;     
boolean etatBouton = 0;       

NewRemoteTransmitter transmitter(adresse, pinTx, periode, nbRepetitionCode);

void setup()
{
  pinMode(bouton, INPUT);
  pinMode(led, OUTPUT);
}

void loop()
{
  etatBouton = digitalRead(bouton);               // Surveillance d'un appui sur le BP
  if (etatBouton==1)                              // Détection de l'appui
    {
    transmitter.sendUnit(1, true);                // Envoi du signal ON pour Domoticz (door bell ou virtual switch ...)
    
    digitalWrite(led, HIGH);                      // Allumage et extinction de la led témoin d'envoi du signal
    delay(500);
    digitalWrite(led, LOW);
    
    transmitter.sendUnit(1, false);                // Envoi du signal OFF pour Domoticz
    }
}
Dernière modification par RaspOlivier le 14 août 2020, 18:16, modifié 2 fois.
Sokoa
Messages : 4
Inscription : 11 août 2020, 19:29

Re: [Presque résolu] Pistes pour Sonnette connectée ?

Message par Sokoa »

J’ai du mal a identifier ta demande ? Tu cherches a faire plusieurs ”sonnettes” un peu partout dans ta maison, et qu’il aient une reception ( quelque soit le protocole ) sur domoticz ? Pour par exemple t’envoyer un mail, une simple notification, ou allumer une lumière ?
C’est bien ça ?


Sent from my iPad using Tapatalk
RaspOlivier
Messages : 129
Inscription : 10 déc. 2016, 09:40
Localisation : 44 - NANTES

Re: [Presque résolu] Pistes pour Sonnette connectée ?

Message par RaspOlivier »

Salut Sokoa et merci de intéresser au sujet,

je n'ai besoin que d'une sonnette :D, ce que je veux réaliser c'est un module émetteur tout ou rien qui est reconnu par Domoticz pour pouvoir faire des capteurs sans fils pour diverses utilisations (dont 1 sonnette).

Du coup, j'ai laissé tomber le code de mon post précédent car je ne sais pas le faire fonctionner sur un tiny85 (pb de fréquence je suppose, je verrais peut-être cela plus tard, quand je serais meilleur ... ou pas!).

J'ai réussi à faire ce que je voulais avec le code suivant issu de https://www.instructables.com/id/ATtiny ... e-Control/, ça fonctionne sur le nano et le tiny85 :

Code : Tout sélectionner

//NOTE: The ATtiny85 must be set to use the default 1-MHz internal clock

// ATtiny85 RF Transmitter
// Transmits commands to an Etekcity RF outlet
// Must know the specific codes being transmitted
// 0 bit: 188us
// 1 bit: 3x zero bit length
// Sync (start) time: 30x zero bit
// Message length: 24 data bits, 1 stop bit
// Written by Boomer48: September 2019

#include <avr/sleep.h>

#define Serial_RF 0
#define Button1 1
#define Button2 2
#define Button3 3
#define Button4 4
#define DelayShort 188
#define DelayLong 564
#define DelaySync 5640
#define num_msgs 5 // number of messages to transmit

byte temp;

void setup ()
{
  pinMode(Serial_RF, OUTPUT);
  digitalWrite(Serial_RF, 0);
  digitalWrite (Button1, HIGH);  // enable pull-up
  digitalWrite (Button2, HIGH);  // enable pull-up
  digitalWrite (Button3, HIGH);  // enable pull-up
  digitalWrite (Button4, HIGH);  // enable pull-up

  // Set interrupt-on-change registers for buttons
  bitClear(GIMSK, INT0); // disable INT0 external interrupt
  bitSet(GIMSK, PCIE); // enable interrupt-on-change
  bitSet(PCMSK, Button1);
  bitSet(PCMSK, Button2);
  bitSet(PCMSK, Button3);
  bitSet(PCMSK, Button4);

  bitClear(ADCSRA, ADEN); // disable ADC for low power mode
  set_sleep_mode (SLEEP_MODE_PWR_DOWN);

}  // end of setup

void loop ()
{
  sleep_enable();

  // Do not interrupt before we go to sleep, or the
  // ISR will detach interrupts and we won't wake.
  noInterrupts();

  // We are guaranteed that the sleep_cpu call will be done
  // as the processor executes the next instruction after
  // interrupts are turned on.
  interrupts();  // one cycle
  sleep_cpu();   // one cycle
} // end of loop

void Transmit1 ()
{
  temp = num_msgs;

  while (temp > 0) {
    Write_RF(0x44);
    Write_RF(0x15);
    Write_RF(0x33); // turn on outlet 1
    Stop_Bit();
    delayMicroseconds(DelaySync);
    temp--;
  }
}

void Transmit2 ()
{
  temp = num_msgs;

  while (temp > 0) {
    Write_RF(0x44);
    Write_RF(0x15);
    Write_RF(0x3C); // turn off outlet 1
    Stop_Bit();
    delayMicroseconds(DelaySync);
    temp--;
  }
}

void Transmit3 ()
{
  temp = num_msgs;

  while (temp > 0) {
    Write_RF(0x44);
    Write_RF(0x15);
    Write_RF(0xC3); // turn on outlet 2
    Stop_Bit();
    delayMicroseconds(DelaySync);
    temp--;
  }
}

void Transmit4 ()
{
  temp = num_msgs;

  while (temp > 0) {
    Write_RF(0x44);
    Write_RF(0x15);
    Write_RF(0xCC); // turn off outlet 2
    Stop_Bit();
    delayMicroseconds(DelaySync);
    temp--;
  }
}

void Write_RF (byte Data_Byte)
{
  byte i = 8; // send MSB first

  while (i > 0)
  {
    i--;
    digitalWrite(Serial_RF, 1);

    if (bitRead(Data_Byte, i) == 0)
    {
      delayMicroseconds(DelayShort);
      digitalWrite(Serial_RF, 0);
      delayMicroseconds(DelayLong);
    }
    else
    {
      delayMicroseconds(DelayLong);
      digitalWrite(Serial_RF, 0);
      delayMicroseconds(DelayShort);
    }
  }
}

void Stop_Bit ()
{
  digitalWrite(Serial_RF, 1);
  delayMicroseconds(DelayShort);
  digitalWrite(Serial_RF, 0);
  delayMicroseconds(DelayLong);
}

// Interrupt-on-change handler
ISR (PCINT0_vect)
{
  delayMicroseconds(16000); // debounce switch
  delayMicroseconds(16000); // debounce switch
  delayMicroseconds(16000); // debounce switch

  if (digitalRead(Button1) == LOW)
    Transmit1();
  else if (digitalRead(Button2) == LOW)
    Transmit2();
  else if (digitalRead(Button3) == LOW)
    Transmit3();
  else if (digitalRead(Button4) == LOW)
    Transmit4();
}
J'ai compris le fonctionnement de la majeure partie de ce code et du principe de codage des signaux donc je le garde pour mes futurs projets.

Un des passages que je ne comprends pas est la ligne suivante, on est dans le chapitre setup et on écrit 1 sur un des pin pour faire un pull-up :

Code : Tout sélectionner

digitalWrite (Button1, HIGH);  // enable pull-up
Je m'attendais plus à quelque-chose comme :

Code : Tout sélectionner

pinMode(Button1, INPUT_PULLUP);
Là aussi, je reviendrais plus tard sur ce code pour le comprendre à 100%.
Répondre