Forum Électro-Bidouilleur

Merci de vous connecter ou de vous inscrire.

Connexion avec identifiant, mot de passe et durée de la session
Recherche avancée  

Nouvelles:

Bienvenue au Forum de discussion Électro-Bidouilleur! Inscrivez-vous pour participer aux discussions!: 
http://forum.bidouilleur.ca/index.php?action=register Les demandes d'inscription sont révisées quotidiennement.

Voir les contributions

Cette section vous permet de consulter les contributions (messages, sujets et fichiers joints) d'un utilisateur. Vous ne pourrez voir que les contributions des zones auxquelles vous avez accès.

Messages - Manu

Pages: [1] 2
1
Merci à vous deux, j'ai enfin pu améliorer mon contrôle deréservoire grâce à cela.

Top!  ;)

http://forum.bidouilleur.ca/index.php?topic=1008.0

3
Merci Kamill,

Oui cela dépend apparemment de l’utilisation ou non de valeurs négatives. Merci d’avoir commenté. Je vais modifier le code v1.1

unsigned long --> 49,71 jours
 32 bits (4 octets) ne stockent pas de nombres négatifs, de 0 à 4 294 967 295 (2^ 32 - 1).
https://www.arduino.cc/reference/en/language/variables/data-types/unsignedlong/


const long --> 24,85 jours
32 bits (4 octets), des entiers -2 147 483 648 à 2 147 483 647.
https://www.arduino.cc/reference/en/language/variables/data-types/long/




4
Merci papyblue 8)
Pour cette réponse aussi rapide. On ne peut pas demander plus, top !

Sinon pour plus de 50jours, je suis toujours à temps de rajouter un petit rtc  ;D

C'était clairement écrit mais je ne l'avais même pas vu.
https://www.arduino.cc/reference/en/language/functions/time/millis/


5
Bonjour,

Je mets en œuvre une minuterie qui se reset tous les 2 minutes. Et tout fonctionne bien, mais mon doute est quant à "millis()". Cela peut devenir un très grand nombre apparemment.

Y a-t-il une certaine limite ?

Exemple:
Disons que si je reset la minuterie tous les 120 jours, "millis()" atteindra la valeur de 10368000000 par exemple. C’est cette valeur qui m’inquiète.

Merci  :)

modif v1.1: const long MsMin  -> unsigned long MsMin
// http://forum.bidouilleur.ca/
// TimerMillis v1.1 Manu
// ( without RTC )

float sec=0;
float min=0;
float hour=0;
float day=0;

unsigned long previousMillis = 0;             // previous time measured to compare with the next
unsigned long MsMin = 60000;               // to add 1 min  every 60000ms (60sec)
const long MinHour = 60;                      // to add 1 hour every 60   min
const long HourDay = 24;                      // to add 1 day  every 24   hours

void setup(){
  Serial.begin(9600);
}

void loop(){

unsigned long currentMillis = millis();

//switch for reset switch-----------------------------------
 if(min>=2){             // this is a switch for reset timer
   previousMillis = currentMillis;            // reset timer
   sec=0;
   min=0;
   hour=0;
   day=0;
 }else{
//Timer-----------------------------------------------------
    if(currentMillis - previousMillis >= MsMin){
      min++;                                     // add 1min
      previousMillis = currentMillis;
    }   
    sec=((currentMillis - previousMillis)/1000);  // for sec
    if(min==MinHour){
      hour++;                                   // add 1hour
      min=0;
    }
    if(hour==HourDay){
      day++;                                    // add 1 day
      hour=0;
    }
  }

//Monitor Show----------------------------------------------
  if(day<10){
    Serial.print("0");
  }
  Serial.print(day,0);
  Serial.print(" D ");
  if(hour<10){
    Serial.print("0");
  }
  Serial.print(hour,0);
  Serial.print(":");
  if(min<10){
    Serial.print("0");
  }
  Serial.print(min,0);
  Serial.print(":");
  if(sec<10){
    Serial.print("0");
  }
  Serial.println(sec,0);

//pause & loop--------------------------------------------
delay(990);
}



6
Bonjour,

Conçu pour mesurer un réservoir de 50 cm de pronfondeur et compter le temps écoulé depuis le dernier démarrage du moteur sur la dernière v2.


Sur la v1 Voici le code (modif du code d'origine du vendeur) que j'ai testé avec "ToF050F Laser Distance Sensor" pour éviter les glitchs et erreurs de lecture.
v1.0 -mesurer la distance du bluetooth
// http://forum.bidouilleur.ca/
// ToF050F Laser Sensor Distance v1.0 ManuModif

#include <MsTimer2.h>
#include <SoftwareSerial.h>
#include <Wire.h>

SoftwareSerial DT(3, 2);                    //[ToF.RX-->PIN PD2 Arduino Nano]  [ToF.TX-->PIN PD3 Arduino Nano]
                                            // HC-05 --> PIN TX RX shared of the USB Port PD1  PD0 ( to upload the code to the Arduino needs to disconnect the bluetooth HC-05 )
  long distance = 0;                        // New Distance Value hex to mm
  float A = 0;                              // New Distance Value for show display & compare B
  float B = 0;                              // Old Distance Value for compare A
  float D;                                  // for mm (A) to %
  byte Buf[6];                              // Store data hex value
  typedef unsigned char   uint8;            // for set MsTimer
  typedef unsigned long   uint32;           // for set MsTimer

// part of the source-inspired code "TOFxxx_TEST_UNO.ino" Wavgat Store
uint32 timCount = 0;                        // set  MsTimer2 - WAVGAT Official Store in Aliexpress parte of code extract
void tim_isr(void)
{
  timCount++;
  timCount++;
}
uint32 tim_get_count(void)
{
  uint32 count;;
  do{
    count = timCount;
  }while(count != timCount);
  return count;
}
uint8 tim_check_timeout(uint32 start, uint32 now, uint32 invt)
{
  if((uint32)(start + invt) >= start)
  {
    if((now >= (uint32)(start + invt)) || (now < start))
    {
      return 1;
    }
  }
  else
  {
    if((now < start) && (now >= (uint32)(start + invt)))
    {
      return 1;
    }
  }
  return 0;
}

void setup() {
  Serial.begin(9600);
  DT.begin(115200);
  MsTimer2::set(2 ,tim_isr);
  MsTimer2::start();
}

void loop() {
START:
    if(DT.read() != 0x01){            // data check
      return;
    }
    DT.readBytes(Buf, 6);             // store data
    if (Buf[2] == 0xFF){
      return;
    }
    distance = Buf[2] * 256 + Buf[3]; // hex to mm
    A = distance;                     // New Set Value A
    if (  A > 499 || A < 1){          // Filter only possible New Values A from 500mm to 1mm for TOF050
      return;
    }
    if ( A > (B+35) || A < (B-35) ){  // Compare old value B & new value A should be about 35mm top or down (to avoid wrong values glitch)
     goto DATANOK;
    }
    goto DATAOK;

DATANOK:                              // Reset old value B ( to compare with new value ) 
    if(DT.read()!= 0x01){
     goto DATANOK;
    }
    DT.readBytes(Buf, 6);
    if (Buf[2] == 0xFF){
     goto DATANOK;
    }
    distance = Buf[2] * 256 + Buf[3];
    A = distance;
    if ( A > 500 || A < 1){
     goto DATANOK;
    }
    B = A;
    goto START;                       //old value B now set back to start to compare and validate

DATAOK:                               //Set old value B for next comparison & Show info A on display
    B = A;
    D = map(A,10,500,100,0);          // A mm to xx %  ( D = map(A , mmMIN , mmMAX , %MAX , %MIN )
   
    if (D>95){
    Serial.print("[]]]]]]]]]]]]]]]]]]]]]");
    }
        else if (D>90){
    Serial.print("[]]]]]]]]]]]]]]]]]]] ]");
    }
        else if (D>85){
    Serial.print("[]]]]]]]]]]]]]]]]]]  ]");   
    }
        else if (D>80){
    Serial.print("[]]]]]]]]]]]]]]]]    ]");   
    }
        else if (D>75){
    Serial.print("[]]]]]]]]]]]]]]]     ]");   
    }
        else if (D>70){
    Serial.print("[]]]]]]]]]]]]]]      ]");   
    }
        else if (D>65){
    Serial.print("[]]]]]]]]]]]]]       ]");     
    }
        else if (D>60){
    Serial.print("[]]]]]]]]]]]]        ]"); 
    }
        else if (D>55){
    Serial.print("[]]]]]]]]]]]         ]");   
    }
        else if (D>50){
    Serial.print("[]]]]]]]]]]          ]");   
    }
        else if (D>45){
    Serial.print("[]]]]]]]]]           ]");   
    }
        else if (D>40){
    Serial.print("[]]]]]]]]            ]"); 
    }
        else if (D>35){
    Serial.print("[]]]]]]]             ]");     
    }
        else if (D>30){
    Serial.print("[]]]]]]              ]");     
    }
        else if (D>25){
    Serial.print("[]]]]]               ]");     
    }
        else if (D>20){
    Serial.print("[]]]]                ]");     
    }
        else if (D>15){
    Serial.print("[]]]                 ]");     
    }
        else if (D>10){
    Serial.print("[]]                  ]");   
    }
        else if (D>5){
    Serial.print("[]                   ]");   
    }
    else{
    Serial.print(" VACIO ");    // tank is empty   
    }
    Serial.print(" ");
    Serial.print(D,0);
    Serial.println(" %  ");    // send  Serial text "[]]]]]    ]  50%"   -> UART (USB) for Bluetooth
//delay(10);
}

Interrupteur sur le "5v" du HC05 pour le déconnecter et ainsi pouvoir télécharger le code du PC vers l'arduino.
(L'écran oled 128x32 pin A4 A5 a l'arrière de l'arduino non utilisé)





V1.1:  2021-05-26
-Réinitialiser l’arduino à partir de l’app  command "reset"
     Résumé:
     String cmd;
     String cmdRst ="reset";
     String cmd = Serial.readStringUntil('\r');  // ('\r') for HC05 & app,  ('\n') for command send from serial monitor arduino ide
        if(cmd == cmdRst ){                          // if receive reset command
// http://forum.bidouilleur.ca/
// ToF050F Laser Sensor Distance v1.1 ManuModif

#include <MsTimer2.h>
#include <SoftwareSerial.h>
#include <Wire.h>

SoftwareSerial DT(3, 2);                    //[ToF.RX-->PIN 2 Arduino Nano]  [ToF.TX-->PIN 3 Arduino Nano]

  long distance = 0;                        // New Distance Value hex to mm
  float A = 0;                              // New Distance Value for show display & compare B
  float B = 0;                              // Old Distance Value for compare A
  float D;                                  // for mm (A) to %
  byte Buf[6];                              // Store data hex value
  typedef unsigned char   uint8;            // for set MsTimer
  typedef unsigned long   uint32;           // for set MsTimer
  String cmd ="0";                          // for command rx
  String cmdRst ="reset";                   // reset command
 
uint32 timCount = 0;                        // set  MsTimer2 - WAVGAT Official Store in Aliexpress parte of code extract
void tim_isr(void)
{
  timCount++;
  timCount++;
}
uint32 tim_get_count(void)
{
  uint32 count;;
  do{
    count = timCount;
  }while(count != timCount);
  return count;
}
uint8 tim_check_timeout(uint32 start, uint32 now, uint32 invt)
{
  if((uint32)(start + invt) >= start)
  {
    if((now >= (uint32)(start + invt)) || (now < start))
    {
      return 1;
    }
  }
  else
  {
    if((now < start) && (now >= (uint32)(start + invt)))
    {
      return 1;
    }
  }
  return 0;
}

void setup() {
  Serial.begin(9600);
  DT.begin(115200);
  MsTimer2::set(2 ,tim_isr);
  MsTimer2::start();
  delay(500);
  Serial.println("");
  Serial.println("Démarrage...");
  delay(5000);
}

void(* resetFunc) (void) = 0;                 // For reset (addrees 0)

void loop() {
 
START:
if(Serial.available()){
  String cmd = Serial.readStringUntil('\r');  // ('\r') for HC05 & app,  ('\n') for command send from serial monitor arduino ide
    if(cmd == cmdRst ){                       // if receive reset command
      Serial.println("Redémarrage...");       // restart msg
      delay(5000);                            // send by 5seg
      resetFunc();                            // reset arduino
    }
}
if(DT.available()){
    if(DT.read() != 0x01){            // data check
      return;
    }
    DT.readBytes(Buf, 6);             // store data
    if (Buf[2] == 0xFF){
      return;
    }
    distance = Buf[2] * 256 + Buf[3]; // hex to mm
    A = distance;                     // New Set Value A
    if (  A > 499 || A < 1){          // Filter only possible New Values A from 500mm to 1mm for TOF050
      return;
    }
    if ( A > (B+35) || A < (B-35) ){  // Compare old value B & new value A should be about 35mm top or down (to avoid wrong values glitch)
     goto DATANOK;
    }
    goto DATAOK;
}
goto START;

DATANOK:                              // Reset old value B ( to compare with new value )
    if(DT.read()!= 0x01){
     goto DATANOK;
    }
    DT.readBytes(Buf, 6);
    if (Buf[2] == 0xFF){
     goto DATANOK;
    }
    distance = Buf[2] * 256 + Buf[3];
    A = distance;
    if ( A > 500 || A < 1){
     goto DATANOK;
    }
    B = A;
    goto START;                       //old value B now set back to start to compare and validate

DATAOK:                               //Set old value B for next comparison & Show info A on display
    B = A;
    D = map(A,10,500,100,0);          // A mm to xx %  ( D = map(A , mmMIN , mmMAX , %MAX , %MIN )
   
    if (D>95){
    Serial.print("[]]]]]]]]]]]]]]]]]]]]]");
    }
        else if (D>90){
    Serial.print("[]]]]]]]]]]]]]]]]]]] ]");
    }
        else if (D>85){
    Serial.print("[]]]]]]]]]]]]]]]]]]  ]");   
    }
        else if (D>80){
    Serial.print("[]]]]]]]]]]]]]]]]    ]");   
    }
        else if (D>75){
    Serial.print("[]]]]]]]]]]]]]]]     ]");   
    }
        else if (D>70){
    Serial.print("[]]]]]]]]]]]]]]      ]");   
    }
        else if (D>65){
    Serial.print("[]]]]]]]]]]]]]       ]");     
    }
        else if (D>60){
    Serial.print("[]]]]]]]]]]]]        ]");
    }
        else if (D>55){
    Serial.print("[]]]]]]]]]]]         ]");   
    }
        else if (D>50){
    Serial.print("[]]]]]]]]]]          ]");   
    }
        else if (D>45){
    Serial.print("[]]]]]]]]]           ]");   
    }
        else if (D>40){
    Serial.print("[]]]]]]]]            ]");
    }
        else if (D>35){
    Serial.print("[]]]]]]]             ]");     
    }
        else if (D>30){
    Serial.print("[]]]]]]              ]");     
    }
        else if (D>25){
    Serial.print("[]]]]]               ]");     
    }
        else if (D>20){
    Serial.print("[]]]]                ]");     
    }
        else if (D>15){
    Serial.print("[]]]                 ]");     
    }
        else if (D>10){
    Serial.print("[]]                  ]");   
    }
        else if (D>5){
    Serial.print("[]                   ]");   
    }
    else{
    Serial.print(" VIDE ");    // tank is empty   
    }
    Serial.print(" ");
    Serial.print(D,0);
    Serial.println(" %  ");    // send  Serial text "[]]]]]    ]  50%"   -> UART (USB) for Bluetooth
 
//delay(10);
}
Test du "reset":


 
v2.0 -2021-06-21 Ajout d'une sonde de courant pour compter le temps écoulé depuis le dernier démarrage du moteur
/*
ToF050F Laser Sensor Distance v2 ManuModif
designed to measure a 50cm tank and count the time since the engine was last started.

v1.0 -measure distance from bluetooth
v1.1 -added reset command from bluetooth
v2.0 -Added current meter to count time since the last time the engine was started

http://forum.bidouilleur.ca/
thanks:
-papyblue
-kamill

PIN:
-Current Sensor HCS-LSP 20A PIN: A0  (no need resistance)
-HC05 Bluetooth           PIN: TX-->RX & RX-->TX . shared of the USB Port PD1  PD0 (to upload the code to the Arduino needs to turn off the bluetooth HC-05)
-TOF050F                  PIN: ToF.RX-->PD2 ToF.TX-->PD3

*/

#include <MsTimer2.h>               
#include <SoftwareSerial.h>                 
#include <Wire.h>

SoftwareSerial DT(3, 2);                    //[ToF.RX-->PIN 2 Arduino Nano]  [ToF.TX-->PIN 3 Arduino Nano]

  long distance = 0;                        // New Distance Value hex to mm
  float A = 0;                              // New Distance Value for show display & compare B
  float B = 0;                              // Old Distance Value for compare A
  float D;                                  // for mm (A) to %
  byte Buf[6];                              // Store data hex value
  typedef unsigned char   uint8;            // for set MsTimer
  typedef unsigned long   uint32;           // for set MsTimer
  String cmd ="0";                          // reset for command rx
  String cmdRst ="reset";                   // reset for command reset text
  int PinCurSens = A0;                      // Current Sensor analog input A0
  int CurSens = 0;                          // current sensor value
  int CSZero = 535;                         // Current Sensor value activation for reset on timer (value depends on the sensor used)
  float sec=0;                              // Timer sec
  float min=0;                              // Timer minut
  float hour=0;                             // Timer hour
  float day=0;                              // Timer day
  unsigned long previousMillis = 0;         // Timer previous time measured to compare with the next
  unsigned long MsMin = 60000;              // Timer to add 1 min  every 60000ms (60sec)
  const long MinHour = 60;                  // Timer to add 1 hour every 60   min
  const long HourDay = 24;                  // Timer to add 1 day  every 24   hours

uint32 timCount = 0;                        // set  MsTimer2 - WAVGAT Official Store in Aliexpress parte of code extract
void tim_isr(void)
{
  timCount++;
  timCount++;
}
uint32 tim_get_count(void)
{
  uint32 count;;
  do{
    count = timCount;
  }while(count != timCount);
  return count;
}
uint8 tim_check_timeout(uint32 start, uint32 now, uint32 invt)
{
  if((uint32)(start + invt) >= start)
  {
    if((now >= (uint32)(start + invt)) || (now < start))
    {
      return 1;
    }
  }
  else
  {
    if((now < start) && (now >= (uint32)(start + invt)))
    {
      return 1;
    }
  }
  return 0;
}

void setup() {
  Serial.begin(9600);                     // Start serial port
  DT.begin(115200);                       // Start port of communication for the tof
  MsTimer2::set(2 ,tim_isr);              // Config MsTimer
  MsTimer2::start();                      // Config MsTimer
  delay(500);                             // pause 500ms
  Serial.println("");                     // write nothing and go to next line
  Serial.println("Démarrage...");         // write start message 
  delay(2000);                            // pause 2second = 2000ms
}

void(* resetFunc) (void) = 0;             // when requesting a reset this is executed (addrees 0)

void loop() {
 
//Timer-----------------------------------------------------
unsigned long currentMillis = millis();
  if(currentMillis - previousMillis >= MsMin){ // if the result is equal to or greater than 60000ms (60second)
    min++;                                     //   add 1min
    previousMillis = currentMillis;            //   set new value for next calculation of ms
  }   
  sec=((currentMillis - previousMillis)/1000); // for sec
  if(min==MinHour){                            // if the result is equal to or greater than 60min
    hour++;                                    //   add 1hour
    min=0;                                     //   start 0 minute of the hour
  }
  if(hour==HourDay){                           // if the result is equal to or greater than 24hours
    day++;                                     //   add 1 day
    hour=0;                                    //   start 0 hour of the day
  }

START:
//Command rx----------------------------------------------------------------
if(Serial.available()){
    String cmd = Serial.readStringUntil('\r');// ('\r') for HC05 & app,  ('\n') for command send from serial monitor arduino ide
    if(cmd == cmdRst ){                       // if receive reset command
      Serial.println("Redémarrage...");       // restart msg
      delay(5000);                            // send by 5seg
      resetFunc();                            // reset arduino
    }
  }

//ToF data check-----------------------------------------------------------
if(DT.available()){
    if(DT.read() != 0x01){            // data check
      return;
    }
  DT.readBytes(Buf, 6);               // store data
  if (Buf[2] == 0xFF){
    return;
  }
  distance = Buf[2] * 256 + Buf[3];   // hex to mm
  A = distance;                       // New Set Value A
    if (  A > 499 || A < 1){          // Filter only possible New Values A from 500mm to 1mm for TOF050
      return;
    }
    if ( A > (B+35) || A < (B-35) ){  // Compare old value B & new value A should be about 35mm top or down (to avoid wrong values glitch)
     goto DATANOK;
    }
    goto DATAOK;
}
goto START;

DATANOK:                              // Reset old value B ( to compare with new value ) 
    if(DT.read()!= 0x01){
     goto DATANOK;
    }
    DT.readBytes(Buf, 6);
    if (Buf[2] == 0xFF){
     goto DATANOK;
    }
    distance = Buf[2] * 256 + Buf[3];
    A = distance;
    if ( A > 500 || A < 1){
     goto DATANOK;
    }
    B = A;
    goto START;                       //old value B now set back to start to compare and validate

DATAOK:                               //Set old value B for next comparison & Show info A on display
    B = A;
    D = map(A,10,500,100,0);          // A mm to xx %  ( D = map(A , mmMIN , mmMAX , %MAX , %MIN )
   
    if (D>90){                        // is greater than 90%
    Serial.print("[]]]]]]]]]]]");     
    }
        else if (D>80){               // is greater than 80%
    Serial.print("[]]]]]]]]] ]");   
    }
        else if (D>70){               // is greater than 70%
    Serial.print("[]]]]]]]]  ]"); 
    }
        else if (D>60){               // is greater than 60%
    Serial.print("[]]]]]]]   ]");     
    }
        else if (D>50){               // is greater than 50%
    Serial.print("[]]]]]]    ]");   
    }
        else if (D>40){               // is greater than 40%
    Serial.print("[]]]]]     ]");     
    }
        else if (D>30){               // is greater than 30%
    Serial.print("[]]]]      ]");     
    }
        else if (D>20){               // is greater than 20%
    Serial.print("[]]]       ]");     
    }
        else if (D>10){               // is greater than 10%
    Serial.print("[]]        ]");   
    }
        else if (D>5){                // is greater than 50%
    Serial.print("[]         ]");   
    }
    else{
    Serial.print("[          ]");     // tank is empty   
    }


CurSens = analogRead(PinCurSens);                // read current analog pin and save value

//if activation current is detected  ----------------------------------------------------
  if (CurSens<=CSZero){                          // Compares the saved current value by the trigger value
    Serial.println("ON");                        //   show ON
    previousMillis = currentMillis;              //   reset timer previousMilllis
    sec=0;                                       //   reset timer sec
    min=0;                                       //   reset timer min
    hour=0;                                      //   reset timer hour
    day=0;                                       //   reset timer day
  }
  else if (day==0&&hour==0&&min==0&&sec==0){     // Switch for Timer no started yet
    Serial.println("ON");                        //   show ON
  }
 
//if no activation current is detected ----------------------------------------------------
  else{
  Serial.print("OFF");                       // write OFF
  Serial.print(" ");                         // write a space
    if(day<10){                              // if it is less than 10 put a zero in front
      Serial.print("0");                     //   write 0
    }
  Serial.print(day,0);                       // write day value
  Serial.print("d");                         // write d
    if(hour<10){                             // if it is less than 10 put a zero in front
      Serial.print("0");                     //   write 0
    }
  Serial.print(hour,0);                      // write hour value
  Serial.print(":");                         // write :
    if(min<10){                              // if it is less than 10 put a zero in front
      Serial.print("0");                     //   write 0
    }
  Serial.print(min,0);                       // write minut value
  Serial.print(":");                         // write :
    if(sec<10){                              // if it is less than 10 put a zero in front
      Serial.print("0");                     //   write 0
    }
  Serial.println(sec,0);                     // write second value
  }
 
//end loop------------------------------------------------------------------------------------
}





Liens vers l'app UART sur Google Play:
https://play.google.com/store/apps/details?id=de.kai_morich.serial_bluetooth_terminal



Liens code d'origine du vendeur Alix:
https://drive.google.com/file/d/1NcilRHzprBWcr5PLjt6fK2ES4uE-t7hE/view?spm=a2g0o.detail.1000023.1.16fd4bccqJ0NvX&usp=sharing
Vendeur:
https://es.aliexpress.com/store/1962508?spm=a2g0o.detail.100005.1.16fd4bccqJ0NvX

Liens EB:
EB_#232 Mini-Plaquette - Sonde de Distance aux Ultrasons HC-SR04
https://youtu.be/QgEkTRFNrEs
EB_#233 Arduino de Vincent, partie 3 - Réparation et Finalisation.
https://youtu.be/smB8AOa1hyU
EB_#231 Découverte - La Communication par Laser
https://youtu.be/wdt9-Xy4L0c

Lien dont j’ai été inspiré pour faire la commande reset:
https://arduinogetstarted.com/tutorials/arduino-serial-monitor


7
Bonjour,

Voici le générateur avec un Arduino Nano et le si5351A que j'ai testé. En suivant la méthode du créateur original (liens add) j'ai donc adapter un écran OLED 128x32 et aussi changer le RX a TX interrupteur par un boutton poussoir.




Liste des fonctions disponibles:
Freq de 10Khz  -  225Mhz Max
IF 455Khz  (Intermediate Frequency "IF" offset, adjustable sur le code Arduino )
mode VFO & L O
Step:
  1 Hz
10 Hz
1 Khz
5 Khz
10 Khz
1 Mhz

Band Preset:
GEN ( Clock Generateur )
MW
160m
80m
60m
49m
40m
31m
25m
22m
20m
19m
16m
13m
11m
10m
6m
WFM
AIR
2m
1m

Matérielles nécessaires:
Oui je sais, tous les composents sont d'excelente qualité.  ;D

-Boite chocolats pour éviter les interférences avec les ovni

-Rotary Encoder avec push button

-Arduino Nano
-Oled 128x32
-x2 push button
-si5351A


Test sur mon Siglent SDS1202X-E



Code adapter pour:
-OLED 128x32 ( manque d'espace j'ai éliminé la GraphBar du Tuner )
-Push button ( éviter les interrupteurs )

/**********************************************************************************************************
  10kHz to 225MHz VFO / RF Generator with Si5351 and Arduino Nano, with Intermediate Frequency (IF) offset
  (+ or -), RX/TX Selector for QRP Transceivers, Band Presets and Bargraph S-Meter. See the schematics for
  wiring and README.txt for details. By J. CesarSound - ver 2.0 - Feb/2021.

Mod. 2021-05-02
forum.bidouilleur.ca
-128x32 OLED
-Push Button for RX & TX mode
-GraphBar Tuner Removed
***********************************************************************************************************/

//Libraries
#include <Wire.h>                 //IDE Standard
#include <Rotary.h>               //Ben Buxton https://github.com/brianlow/Rotary
#include <si5351.h>               //Etherkit https://github.com/etherkit/Si5351Arduino
#include <Adafruit_GFX.h>         //Adafruit GFX https://github.com/adafruit/Adafruit-GFX-Library
#include <Adafruit_SSD1306.h>     //Adafruit SSD1306 https://github.com/adafruit/Adafruit_SSD1306

//User preferences
//------------------------------------------------------------------------------------------------------------
#define IF         455       //Enter your IF frequency, ex: 455 = 455kHz, 10700 = 10.7MHz, 0 = to direct convert receiver or RF generator, + will add and - will subtract IF offfset.
#define BAND_INIT  2         //Enter your initial Band (1-21) at startup, ex: 1 = Freq Generator, 2 = 800kHz (MW), 7 = 7.2MHz (40m), 11 = 14.1MHz (20m).
#define XT_CAL_F   33000     //Si5351 calibration factor, adjust to get exatcly 10MHz. Increasing this value will decreases the frequency and vice versa.
#define S_GAIN     303       //Adjust the sensitivity of Signal Meter A/D input: 101 = 500mv; 202 = 1v; 303 = 1.5v; 404 = 2v; 505 = 2.5v; 1010 = 5v (max).
#define tunestep   A0        //The pin used by tune step push button.
#define band       A1        //The pin used by band selector push button.
#define rx_tx      A2        //The pin used by RX / TX selector switch, RX = switch open, TX = switch closed to GND. When in TX, the IF value is not considered.
#define adc        A3        //The pin used by Signal Meter A/D input.
//------------------------------------------------------------------------------------------------------------

Rotary r = Rotary(2, 3);
Adafruit_SSD1306 display = Adafruit_SSD1306(128, 32, &Wire);
Si5351 si5351;

unsigned long freq, freqold, fstep;
long interfreq = IF, interfreqold = 0;
long cal = XT_CAL_F;
unsigned int smval;
byte encoder = 1;
byte stp, n = 1;
byte stpRXTX, m = 1;
byte count, x, xo;
bool sts = 0;
unsigned int period = 100;
unsigned long time_now = 0;

ISR(PCINT2_vect) {
  char result = r.process();
  if (result == DIR_CW) set_frequency(1);
  else if (result == DIR_CCW) set_frequency(-1);
}

void set_frequency(short dir) {
  if (encoder == 1) {                         //Up/Down frequency
    if (dir == 1) freq = freq + fstep;
    if (freq >= 225000000) freq = 225000000;
    if (dir == -1) freq = freq - fstep;
    if (fstep == 1000000 && freq <= 1000000) freq = 1000000;
    else if (freq < 10000) freq = 10000;
  }
  if (encoder == 1) {                       //Up/Down graph tune pointer
    if (dir == 1) n = n + 1;
    if (n > 42) n = 1;
    if (dir == -1) n = n - 1;
    if (n < 1) n = 42;
  }
}

void setup() {
  Wire.begin();
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.clearDisplay();
  display.setTextColor(WHITE);
  display.display();

  pinMode(2, INPUT_PULLUP);
  pinMode(3, INPUT_PULLUP);
  pinMode(tunestep, INPUT_PULLUP);
  pinMode(band, INPUT_PULLUP);
  pinMode(rx_tx, INPUT_PULLUP);

  //statup_text();  //If you hang on startup, comment

  si5351.init(SI5351_CRYSTAL_LOAD_8PF, 0, 0);
  si5351.set_correction(cal, SI5351_PLL_INPUT_XO);
  si5351.drive_strength(SI5351_CLK0, SI5351_DRIVE_8MA);
  si5351.output_enable(SI5351_CLK0, 1);                  //1 - Enable / 0 - Disable CLK
  si5351.output_enable(SI5351_CLK1, 0);
  si5351.output_enable(SI5351_CLK2, 0);

  PCICR |= (1 << PCIE2);
  PCMSK2 |= (1 << PCINT18) | (1 << PCINT19);
  sei();

  count = BAND_INIT;
  bandpresets();
  stp = 4;
  stpRXTX = 1;
  setstep();
}

void loop() {
  if (freqold != freq) {
    time_now = millis();
    tunegen();
    freqold = freq;
  }

  if (interfreqold != interfreq) {
    time_now = millis();
    tunegen();
    interfreqold = interfreq;
  }

  if (xo != x) {
    time_now = millis();
    xo = x;
  }

  if (digitalRead(tunestep) == LOW) {
    time_now = (millis() + 300);
    setstep();
    delay(300);
  }

  if (digitalRead(band) == LOW) {
    time_now = (millis() + 300);
    inc_preset();
    delay(300);
  }

  if (digitalRead(rx_tx) == LOW) {
    time_now = (millis() + 300);
    RXTX();
    //sts = 1;
    delay(300);
  } //else sts = 0;

  if ((time_now + period) > millis()) {
    displayfreq();
    layout();
  }
  sgnalread();
}

void tunegen() {
  si5351.set_freq((freq + (interfreq * 1000ULL)) * 100ULL, SI5351_CLK0);
}

void displayfreq() {
  unsigned int m = freq / 1000000;
  unsigned int k = (freq % 1000000) / 1000;
  unsigned int h = (freq % 1000) / 1;

  display.clearDisplay();
  display.setTextSize(2);

  char buffer[15] = "";
  if (m < 1) {
    display.setCursor(44, 1); sprintf(buffer, "%003d.%003d", k, h);
  }
  else if (m < 100) {
    display.setCursor(8, 1); sprintf(buffer, "%2d.%003d.%003d", m, k, h);
  }
  else if (m >= 100) {
    unsigned int h = (freq % 1000) / 10;
    display.setCursor(2, 1); sprintf(buffer, "%2d.%003d.%02d", m, k, h);
  }
  display.print(buffer);
}

void setstep() {
  switch (stp) {
    case 1: stp = 2; fstep = 1; break;
    case 2: stp = 3; fstep = 10; break;
    case 3: stp = 4; fstep = 1000; break;
    case 4: stp = 5; fstep = 5000; break;
    case 5: stp = 6; fstep = 10000; break;
    case 6: stp = 1; fstep = 1000000; break;
  }
}


void RXTX() {
  switch (stpRXTX) {
    case 1: stpRXTX = 2; sts = 1;; break;
    case 2: stpRXTX = 1; sts = 0; break;
  }
}

void inc_preset() {
  count++;
  if (count > 21) count = 1;
  bandpresets();
  delay(50);
}

void bandpresets() {
  switch (count)  {
    case 1: freq = 100000; tunegen(); break;
    case 2: freq = 800000; break;
    case 3: freq = 1800000; break;
    case 4: freq = 3650000; break;
    case 5: freq = 4985000; break;
    case 6: freq = 6180000; break;
    case 7: freq = 7200000; break;
    case 8: freq = 10000000; break;
    case 9: freq = 11780000; break;
    case 10: freq = 13630000; break;
    case 11: freq = 14100000; break;
    case 12: freq = 15000000; break;
    case 13: freq = 17655000; break;
    case 14: freq = 21525000; break;
    case 15: freq = 27015000; break;
    case 16: freq = 28400000; break;
    case 17: freq = 50000000; break;
    case 18: freq = 100000000; break;
    case 19: freq = 130000000; break;
    case 20: freq = 144000000; break;
    case 21: freq = 220000000; break;
  }
  si5351.pll_reset(SI5351_PLLA);
  stp = 4; setstep();
}

void layout() {
  display.setTextColor(WHITE);
;
  display.setTextSize(1);
  display.setCursor(56,17);
  if (stp == 2) display.print("  1Hz"); if (stp == 3) display.print(" 10Hz"); if (stp == 4) display.print(" 1kHz");
  if (stp == 5) display.print(" 5kHz"); if (stp == 6) display.print("10kHz"); if (stp == 1) display.print(" 1MHz");
  display.setTextSize(1);
  display.setCursor(83, 25);
  display.print(interfreq);
  display.print("k.IF");
  display.setTextSize(1);
  display.setCursor(35,17);
  if (interfreq == 0) display.print("VFO");
  if (interfreq != 0) display.print("L O");
  display.setCursor(116, 17);
  if (!sts) display.print("RX"); if (!sts) interfreq = IF;
  if (sts) display.print("TX"); if (sts) interfreq = 0;
  bandlist(); drawbargraph();
  display.display();
}

void bandlist() {
  display.setTextSize(1);
  display.setCursor(0, 17);
  if (count == 1) display.print("GEN"); if (count == 2) display.print("MW"); if (count == 3) display.print("160m"); if (count == 4) display.print("80m");
  if (count == 5) display.print("60m"); if (count == 6) display.print("49m"); if (count == 7) display.print("40m"); if (count == 8) display.print("31m");
  if (count == 9) display.print("25m"); if (count == 10) display.print("22m"); if (count == 11) display.print("20m"); if (count == 12) display.print("19m");
  if (count == 13) display.print("16m"); if (count == 14) display.print("13m"); if (count == 15) display.print("11m"); if (count == 16) display.print("10m");
  if (count == 17) display.print("6m"); if (count == 18) display.print("WFM"); if (count == 19) display.print("AIR"); if (count == 20) display.print("2m");
  if (count == 21) display.print("1m");
  if (count == 1) interfreq = 0; else if (!sts) interfreq = IF;
}

void sgnalread() {
  smval = analogRead(adc); x = map(smval, 0, S_GAIN, 1, 14); if (x > 14) x = 14;
}

void drawbargraph() {
  byte y = map(n, 1, 32, 1, 14);
  display.setTextSize(1);
  switch (y) {
  }

  //Bargraph
  display.setCursor(0, 25); display.print("SM");
  switch (x) {
    case 14: display.fillRect(80, 26, 2, 6, WHITE);
    case 13: display.fillRect(75, 26, 2, 6, WHITE);
    case 12: display.fillRect(70, 26, 2, 6, WHITE);
    case 11: display.fillRect(65, 26, 2, 6, WHITE);
    case 10: display.fillRect(60, 26, 2, 6, WHITE);
    case 9: display.fillRect(55, 26, 2, 6, WHITE);
    case 8: display.fillRect(50, 26, 2, 6, WHITE);
    case 7: display.fillRect(45, 26, 2, 6, WHITE);
    case 6: display.fillRect(40, 26, 2, 6, WHITE);
    case 5: display.fillRect(35, 26, 2, 6, WHITE);
    case 4: display.fillRect(30, 26, 2, 6, WHITE);
    case 3: display.fillRect(25, 26, 2, 6, WHITE);
    case 2: display.fillRect(20, 26, 2, 6, WHITE);
    case 1: display.fillRect(15, 26, 2, 6, WHITE);
  }
}

void statup_text() {
  display.setTextSize(1); display.setCursor(13, 9);
  display.print("Si5351 VFO/RF GEN");
  display.setCursor(6, 20);
  display.print("JCR RADIO - Ver 2.0");
  display.display(); delay(2000);
}


Liens du Créateur:
https://create.arduino.cc/projecthub/CesarSound
Schema: (remplacer l'interrupteur RX & TX par un bouton poussoir )

SI5351_VFO_RF_GEN_OLED_V2_JCR
https://create.arduino.cc/projecthub/CesarSound/10khz-to-225mhz-vfo-rf-generator-with-si5351-version-2-bfa619?ref=user&ref_id=1465945&offset=0
Youtube
https://www.youtube.com/watch?v=fsYQ3MWN5KU
Dropbox
https://www.dropbox.com/s/60s22lbj80lgfh5/SI5351_VFO_RF_GEN_OLED_V2_JCR.zip?dl=0
PCB
https://www.pcbway.com/project/shareproject/10kHZ_255MHz_SIGNAL_GENERATOR_OLED_LCD.html


Liens EB:
EB_#374 Flash - Plus de Quartz de disponible...Solution Si5351?
https://www.youtube.com/watch?v=iiufQ4UmA7A
EB_#284....Partie 1
..
EB_#313 Construction - Synthétiseur d'Horloge HF, Partie 9: Premiers essais.
https://www.youtube.com/watch?v=tDw9KD-WG50
EB_#244 Mini-Plaquette - Synthétiseur HF Si-5351A
https://www.youtube.com/watch?v=l36m98S7QYc
EB_#317 Construction - Synthétiseur d'Horloge HF, Partie 10: Le logiciel
https://www.youtube.com/watch?v=_CUuk6Xp7YQ

Liens Cyrob:
Cyrob: Le module Adafruit Si5351A
https://www.youtube.com/watch?v=RpbPqOtwAD4

8
Tuto STM32F103C8T6 par USB comme Arduino
https://www.youtube.com/watch?v=Myon8H111PQ

9
Bonjour,

Je possède une FlirOne Pro et depuis le début, j'ai toujours le même problème. La batterie hs à chaque fois que je veux l'utiliser. Il me faut la recharger pour pouvoirs l'utiliser. J'ai donc installé un interrupteur pour éviter le mode veille et l'éteindre complètement. N'oublié pas de passer sur ON l'interrupteur pour charger la batterie.

Il y a sûrement de belles fautes d'orthographe je m'en excuse d'avance, déjà plus de 20 ans que je vie en Espagne.



À la prochaine !
 ;D

Photos Bonus:



10
Bonjour à tous,

Cette fois, je souhaite partager un montage pour visualiser la Température, l'Humidité et surtout le Point de Rosée avec Arduino et un DHT22.
Allons-y !

En photo:
(Avec mesures du lieu le plus humide de mon habitat)


DHT22;
5V
GND
DATA ->PIN2

OLED;
5V
GND
SCK ->PIN A5
SDA ->PINA4

Pour la temperature en Celsius
float t = dht.readTemperature();

Pour la temperature en Fahrenheit (isFahrenheit = true)
float t = dht.readTemperature(true);

Arduino NANO + oled 128x32
// http://forum.bidouilleur.ca/
// Point de Rosée
/*
Arduino         Nano
DHT22          Data Pin PD2
Oled 128x32 SSD1306

Calcul
squareroot = sqrt(number);
cuberoot = cbrt(number);
quadroot = sqrt(sqrt(number));
pentaroot = pow(number, 0.2);
sixtroot = cbrt(sqrt(number));
par robtillaart https://forum.arduino.cc/index.php?topic=373265.0
*/

#include <U8glib.h>
#include <DHT.h>
#define DHTPIN 2
#define DHTTYPE DHT22

U8GLIB_SSD1306_128X32 u8g(U8G_I2C_OPT_NONE);
DHT dht(DHTPIN, DHTTYPE);

void setup(){
  u8g.setFont(u8g_font_helvR18);
  u8g.setRot180();
    u8g.firstPage();
      do {
      u8g.setPrintPos(0, 32);
      u8g.print("     ");
    }while( u8g.nextPage() );
  Serial.begin(9600);
  dht.begin();
delay(250);
}

void loop(){
    float h = dht.readHumidity();                                        // Humidité
    float t = dht.readTemperature();                                   // Temperature
    float r = ((sqrt (sqrt (sqrt(h/100)))) * (110+t) )-110; // Point de Rosée   (use sqrt 2 x 2 x 2 = 8 for eighth roots)

    Serial.print(t,0);
    Serial.print(" ");
    Serial.print(h,0);
    Serial.print(" ");
    Serial.println(r,0);

    u8g.firstPage();
      do {
      u8g.setFont(u8g_font_helvR24);
      u8g.setPrintPos(0, 28);
      u8g.print(t,0);
      u8g.print(char(176));
      u8g.print("");
      u8g.setFont(u8g_font_helvR24);
      u8g.setPrintPos(56, 28);
      u8g.print(h,0);
      u8g.setFont(u8g_font_helvR18);
      u8g.setPrintPos(102, 28);
      u8g.print(r,0);
    }while( u8g.nextPage() );
delay(300);
}

Arduino UNO + oled 128x64
// http://forum.bidouilleur.ca/
// Point de Rosée
/*
Arduino         UNO
DHT22          Data Pin2
Oled 128x64 SH1106

Calcul
squareroot = sqrt(number);
cuberoot = cbrt(number);
quadroot = sqrt(sqrt(number));
pentaroot = pow(number, 0.2);
sixtroot = cbrt(sqrt(number));
par robtillaart https://forum.arduino.cc/index.php?topic=373265.0
*/

#include <U8glib.h>
#include <DHT.h>
#define DHTPIN 2
#define DHTTYPE DHT22

U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NONE);
DHT dht(DHTPIN, DHTTYPE);

void setup(){
 
    u8g.firstPage();
      do {
      u8g.setPrintPos(0, 32);
      u8g.print("     ");
    }while( u8g.nextPage() );
  Serial.begin(9600);
  dht.begin();
delay(250);
}

void loop(){
 
    float h = dht.readHumidity();
    float t = dht.readTemperature();
    float r = ((sqrt (sqrt (sqrt(h/100)))) * (110+t) )-110; // Point de Rosée (use sqrt 2 x 2 x 2 = 8 for eighth roots)

    Serial.print(t,0);
    Serial.print(" ");
    Serial.print(h,0);
    Serial.print(" ");
    Serial.println(r,0);

    u8g.firstPage();
      do {
       u8g.setFont(u8g_font_fub30r);
      u8g.setPrintPos(0, 35);
      u8g.print(t,0);
      u8g.setFont(u8g_font_helvR18);
      u8g.setPrintPos(46, 23);
      u8g.print(char(176));
      u8g.setFont(u8g_font_fub30r);
      u8g.setPrintPos(66, 35);
      u8g.print(h,0);
      u8g.setFont(u8g_font_helvR18);
      u8g.setPrintPos(109, 23);
      u8g.print("%");
      u8g.setFont(u8g_font_helvR18);
      u8g.setPrintPos(37, 64);
      u8g.print(r,0);
      u8g.print(" Pr");
    }while( u8g.nextPage());
   
delay(500);
}


Info:
( www.canada.ca/fr/institut-conservation  )




( Wikipedia )


Liens utiles:

Agent de détérioration : Humidité relative inadéquate
https://www.canada.ca/fr/institut-conservation/services/agents-deterioration/humidite.html

Calcul de l'isolation thermique d'un mur
https://www.toutcalculer.com/batiment/isolation-thermique.php

Finition interieur des murs sous sol
http://publications.gc.ca/collections/collection_2016/cnrc-nrc/NR36-1-31-fra.pdf


J'ai utilisé la deuxième formule
Point de Rosée Wikipedía
https://fr.wikipedia.org/wiki/Point_de_ros%C3%A9e


https://es.wikipedia.org/wiki/Punto_de_roc%C3%ADo

 Convertion pour Arduino --> r = ((sqrt (sqrt (sqrt(h/100)))) * (110+t) )-110;

Videó:
EB_#18 Protections contre les Décharges Électrostatiques
https://www.youtube.com/watch?v=0Fcg0FMyAso

EB_#341 Construction - Mon séchoir à Filament de Plastique à Impression 3D
https://www.youtube.com/watch?v=y3b2KqOZUY8

Vidéo en accéléré d’une détérioration : parchemin et clé en fer    ( www.canada.ca/fr/institut-conservation )
https://www.canada.ca/fr/institut-conservation/services/agents-deterioration/accelere-parchemin-cle.html

Conseils:
N'oubliez pas les conseils de Bertrand. Désactiver le ioniseur des déshumidificateurs qui en disposent, car il peut dégrader certains plastiques.

Bye !  :)

11
Bonjour,
Je vous laisse un tuto, expliquant comment rajouter la charge sans fil Qi a mes écouteurs Soundpeats Truebuds.

Commentaire:
-La recharge USB C restera utilisable.
-La charge Qi chauffe un peu, peut-être une amélioration à concevoir pour éviter cela.

Sans plus tarder...



Tout conseil ou amélioration est toujours bienvenu !
Salutations  ;)

12
Ok merci, je vais voir cette méthode aussi. Pour le moment, la fonction dont j'avais besoin fonctionne. Mon problème est plutôt l'organisation du code de manière plus intelligible.

13
Salut à tous,  :)

Je faisais un thermostat qui était très simple en principe, mais finalement qui m'a bien caser la tête pour obtenir quelque chose comme un effet d'hystérésis. Je ne connais que les bases de code sur Arduino, donc toute contribution, simplification, nettoyage etc.. du code sera la bienvenue  ;D

Thermostat qui active un ventilateur à partir d'une température. Une fois activé, il devra descendre de deux degrés pour se désactiver.





T= 19ºC sur la photo   Température Réelle
A= 24ºC sur la photo   Temp Activation
B= pasa sur el display   Temp Activation avec "hystérésis" à partir de 2eme tour du "for".

for (T >= A ; T>= B ; T=T) {
      digitalWrite(Pin_Relay, LOW);
      B = (A-2);                           
}


// http://forum.bidouilleur.ca/
// v1.0 Thermostat STM32
/*
STM32F103C8T6
Relay 5v mod 3.3V
OLED SH1106
DHT22

PA5 input analog voltmeter
PB0 input analo pot for activation adjust
PB6 SCK OLED SH1106
PB7 SDA OLED SH1106
PB8 DHT22
 */

#include <Arduino.h>
#include <U8g2lib.h>
#include <Wire.h>
#include <DHT.h>
#define DHTPIN PB8
#define DHTTYPE DHT22

DHT dht(DHTPIN, DHTTYPE);
U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
int Pin_Relay = PA0;
int Pin_VSalida = PA5;
int Pin_Activ = PB0;

void setup(void) {
  Serial.begin(9600);
  u8g2.begin();
  dht.begin();
  pinMode(Pin_Relay, OUTPUT);
  pinMode(Pin_VSalida, INPUT);
  pinMode(Pin_Activ, INPUT);
  digitalWrite(Pin_Relay, HIGH);
  delay(500);
}

void loop(void) {
 
 float T = dht.readTemperature();                   // Temperature ªC (for ºF -> dht.Temperature(True))
 float H = dht.readHumidity();                      // Humidity
 float V = (analogRead(Pin_VSalida)/71.236);        // AnalogRead to Volts (the formula changes according to the voltage divider bridge used)
 float A = ((analogRead(Pin_Activ)*1.01)-1001);     // AnalogRead to Temp activation (the formula changes according to the potentiometer value and voltage divider bridge used)
 float B = A;                                       // Over Temperature ºC = Activation Relay to apply later hysterersis

// Relay ON necessary conditions
for (T >= A ; T>= B ; T=T) {                        // Step1 Temp > A , Step2 Temp > B , Step3 not necessary but fill Temp = Temp 
  //Relay ON
  u8g2.clearBuffer();
  digitalWrite(Pin_Relay, LOW);
  u8g2.setFont (u8g2_font_courB12_tf);
  u8g2.setCursor(0,18);
  u8g2.print("ON");
  u8g2.setCursor(52,18);
  u8g2.print(V,0);
  u8g2.print("V");
  u8g2.setFont (u8g2_font_courB12_tf);
  u8g2.setCursor(86,18);
  u8g2.print(A,0);
  u8g2.print((char)176);
  u8g2.print("C"); 
  u8g2.setFont(u8g2_font_logisoso16_tr);
  u8g2.setCursor(0,40);
  u8g2.print("Temp");
  u8g2.setCursor(64,40);
  u8g2.print(dht.readTemperature(),0);
  u8g2.print((char)167);
  u8g2.print(" C");
  u8g2.setFont(u8g2_font_logisoso16_tr);
  u8g2.setCursor(0,63);
  u8g2.print("Hum");
  u8g2.setCursor(64,63);
  u8g2.print(dht.readHumidity(),0);
  u8g2.print(" ");
  u8g2.print((char)37);
  u8g2.sendBuffer();
  delay(300);
  T = dht.readTemperature();
  H = dht.readHumidity();                   
  V = (analogRead(Pin_VSalida)/71.236);       
  A = ((analogRead(Pin_Activ)*1.01)-1001); 
  B = (A-2);                                   // for Step2 Temp > B add "Hysteresis"
}
// Relay OFF
  u8g2.clearBuffer();
  digitalWrite(Pin_Relay, HIGH);
  u8g2.setFont (u8g2_font_courB12_tf);
  u8g2.setCursor(0,18);
  u8g2.print("OFF");
  u8g2.setCursor(52,18);
  u8g2.print(V,0);
  u8g2.print("V");
  u8g2.setFont (u8g2_font_courB12_tf);
  u8g2.setCursor(86,18);
  u8g2.print(A,0);
  u8g2.print((char)176);
  u8g2.print("C"); 
  u8g2.setFont(u8g2_font_logisoso16_tr);
  u8g2.setCursor(0,40);
  u8g2.print("Temp");
  u8g2.setCursor(64,40);
  u8g2.print(dht.readTemperature(),0);
  u8g2.print((char)167);
  u8g2.print(" C");
  u8g2.setFont(u8g2_font_logisoso16_tr);
  u8g2.setCursor(0,63);
  u8g2.print("Hum");
  u8g2.setCursor(64,63);
  u8g2.print(dht.readHumidity(),0);
  u8g2.print(" ");
  u8g2.print((char)37);
  u8g2.sendBuffer();
  delay(300);
}

Liens:

Relais 5v -> 3.3v modif
http://forum.bidouilleur.ca/index.php?topic=907.0

EB_#148 Banc d'Essai: Contrôleur de Température W1209 (Thermostat)
https://youtu.be/j6blCrNm-5s

14
Trucs et Astuces d'Électronique / Relais Arduino 5V pour 3.3V STM32
« le: novembre 21, 2020, 09:05:25 pm »
Bonjour  :)

Pour la petite histoire, je voulais faire fonctionner un relais arduino 5v sur une sortie 3.3v du STM32F103C8T6. Après avoir trouvé plusieurs problèmes, la solution était finalement plutôt simple. Je suppose que cette astuce est connue de beaucoup, mais je n'ai rien trouvé dans le forum à ce sujet.

Let´s Go

Vous devrez retirer, la résistance (102) donc de 1K et la remplacer par une 6.8K + 2.2K comme sur cette image.

   

Quelques lignes de code pour peut être vous donnez des idéeas

int RELAY_PIN = PA0;

void setup(void) {
  Serial.begin(9600);
  pinMode(RELAY_PIN, OUTPUT);
  digitalWrite(RELAY_PIN, HIGH);
}

void loop(void) {
    digitalWrite(RELAY_PIN, LOW);
    delay(2000);
    digitalWrite(RELAY_PIN, HIGH);
    delay(2000);
}

Les Pins compatible Output I/O  sur STM32F103C8T6  :o
de PA0   -> PA15
de PB0   -> PB15
de PC13 -> PC15 ( PC13 led verte)

Inspiré de

EB_#250 Mini-Plaquette - Relais (x4) contrôlés par logique
https://www.youtube.com/watch?v=sbJhaDjLHcY

https://www.hackster.io/Gyro1/5v-relay-module-mod-to-work-with-raspberry-pi-65b475

15
Je rajoute le mode dimming grâce à la LDR  :)

V1.2 Affichages des valeurs analog + Alerte des limites établies + Dimming Oled  10-10-2020
        Résumé:   if (analogRead(PinLDR) < LimitInfLDR){
                            u8g2.setContrast(0);
                            u8g2.setContrast(255);

Pages: [1] 2