Triac 220V Arduino via raspberry

Bonjour à tous,

Je suis en train d’automatiser ma serre afin de pouvoir contrôler la température, l’humidité, la lumière la ventilation, …
Je gère tout ca via un raspeberry ansi que qu’une carte 8 relais et 2 relais SSR et un logiciel domotique (Jeedom)

Tout cela fonctionne tres bien, le seul hic est que je ne peux pas controller la vitesse de rotation de mes ventilateurs, c’est ON ou OFF.

J’ai donc placer des dimmers de ce type pour me dépanner temporairement.

J’ai acheter un Arduino UNO ainsi qu’un dimmer de cette sorte : dimmer.

L’idée est de connecter l’arduino en usb sur le raspberry et de programmer 6 vitesses.

0 => OFF
1 => Min (100 Volt, c’est la tension que me donne le multimètre en sortie de mon dimmer manuel)
5 => Max (230 Volt, c’est la tension que me donne le multimètre en sortie de mon dimmer manuel)

Je me pose plusieurs questions qui me bloque dans l’avancement de mon projet et je n’y connais rien en arduino. (lol) Mais qui ne tente rien n’a rien … :sunglasses:

L’ideé est de stocker sur l’arduino 1 sketch avec deux variables (vitesse canal 1 et vitesse canal 2) et de changer la variable depuis mon raspberry.

Le soucis, c’est que je suis tout a fais incapable de pondre le sketch.

Je sollicite donc votre aide afin de m’aider dans la création d’un “template” de sketch.

Voici le sketch que j’ai téléchargé sur la page ebay du vendeur. J’arrive plus ou moins a le decriptrer mais je ne comprends pas tout.
Je voudrais pouvoir modifier le sketch recus afin de l’adapter à mon besoin.
Je vois que dans le sript on parle de 50Hz/60Hz, J’habite en Belgique et c’est du 50 Hz 220V

unsigned char channel_1 = 7;    // Output to Opto Triac pin, channel 1
unsigned char channel_2 = 6;    // Output to Opto Triac pin, channel 2
unsigned char dimming = 3;      // Dimming level (0-100)
unsigned char i;
unsigned char flag=0;


void setup() {
  // put your setup code here, to run once:
  pinMode(channel_1, OUTPUT);// Set AC Load pin as output
  pinMode(channel_2, OUTPUT);// Set AC Load pin as output
  attachInterrupt(1, zero_crosss_int, RISING);

  // Serial.begin(9600);

}

void zero_crosss_int()  // function to be fired at the zero crossing to dim the light
{
  // Firing angle calculation : 1 full 50Hz wave =1/50=20ms 
  // Every zerocrossing : (50Hz)-> 10ms (1/2 Cycle) For 60Hz (1/2 Cycle) => 8.33ms 
  // 10ms=10000us
  
  int dimtime = (100*dimming);    // For 60Hz =>83   
  delayMicroseconds(dimtime);    // Off cycle
  
  if (flag==0xFF)
   {
    digitalWrite(channel_1, HIGH);   // triac firing
    delayMicroseconds(10);         // triac On propogation delay (for 60Hz use 8.33)
    digitalWrite(channel_1, LOW);    // triac Off
   }
  
  else
   {
    digitalWrite(channel_2, HIGH);   // triac firing
    delayMicroseconds(10);         // triac On propogation delay (for 60Hz use 8.33)
    digitalWrite(channel_2, LOW);    // triac Off
   }
  
}



void loop() {
    
       
           
          // Serial.println(pulseIn(8, HIGH));
          
         
        
          for (i=85;i>5;i--)
          {
            dimming=i;
            delay(20);
          }
          
           for (i=5;i<85;i++)
          {
            dimming=i;
            delay(20);
          }
          
          flag=~flag;   
          
           

}

Merci d’avance pour vos pistes et infos

Bonjour,

qu'est-ce que vous ne comprenez pas dans le sketch?

Pour résumer ce qui se passe, voici quelques indications:

unsigned char dimming = 3;      // Dimming level (0-100)

C'est le rapport cyclique que l'on applique sur une période: Les sorties PWM. -> eskimon tuto les sorties analogiques enfin presque

attachInterrupt(1, zero_crosss_int, RISING);

Initialisation de l'interruption 1 sur un front montant, dans le cas présent c'est ce que l'on appel la détection du passage à zéro (zero-crossing). Chaque passage de la tension secteur à 0 Volt génère une brève impulsion au moyen d'un opto-coupleur. La durée d'une période étant de 20ms, il y a deux passages par période.

Chaque fois qu'il y aura une interruption, la fonction zero_cross_int() est appelée.

Le principe est d'ouvrir le triac à la détection du point zéro Volt. En gros, afin d'éviter du bruit dans le réseau secteur, on ouvre le triac lorsque la tension est au plus bas. Si un relais s'ouvre au moment ou la tension est au plus haut, il y a création d'un arc. Si la tension est au plus bas, ce phénomène est nul.

Avec ce principe, les triac s'ouvriront au passage de la tension à zéro, mais la fermeture ce fera à n'importe quel instant de la période et il y aura donc du bruit dans le secteur.

Dans votre cas, il ne s'agit pas d'avoir une régulation "pile-poil" mais bien d'avoir 6 vitesses possibles.
Alors une solution consiste à utiliser un découpage par période. Par exemple vous prenez 6 périodes, pour la vitesse max, (vitesse 6)on ouvre la sortie à toutes les périodes.
A la vitesse 5, on ouvre les 5 premières.
A la vitesse 4, on ouvre les 1,2,4,5.
A la vitesse 3, on ouvre les 1,3,5.
A la vitesse 2, on ouvre les 1, et 4.
A la vitesse 1, on ouvre la 1.
Bien sûre il faut refermer les triacs au point zéro à chaque fois que c'est nécessaire.

Voilà pour le moment.