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:

Le Forum est maintenant chiffré (préambule https). Bien sûr, des liens externes insérés dans les sujets vont demeurer inchangés. Mais la composition des pages du Forum est désormais sécurisée. Si des problèmes d'affichage surviennent, veillez à vider votre cache pour ce site.

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] 3
16
Salut !

Je vous apporte une astuce assez rare. Le système d'éclairage Dali Bus n'est pas monnaie courante dans les maisons mais dans les musées et les grands entrepôts oui.
Mais, comment utiliser Dali BUS Power Supply 230va sur un batterie ? ( de panneaux solaires par ejemple )

MODEL: Dali BUS Power Supply MIBOXER DL_POW1




Ici la procédure

Composants à  supprimer ces deux là¡:

Dali BUS Power Supply MIBOXER DL POW1

Vue de dessous du circuit, composants retirés (voir broches dessoudées)
Tension de la batterie cable rouge et noire allant à  l'entrée bec (en utilisant les deux broches non utilisées à  l'origine)
Sortie bec ( cabel rouge et noire ) à  16V 700mA retournant au circuit pour alimenter le bus dali.



Régulateur de tension BEC StepDown à  ajouter
Sur le LM317 vous pouvez voir une patte mal soudée du module. J'ai dû revoir toutes les soudures.

Chercher XL4015 sur Alixp est facile à  trouver
régler la tension à  environ 16v et 700 ou 800mA max.

Il faut découper la plaque sur les côtés avec une pince coupante fine pour la loger dans la boite

ici vous pouvez voir les résistances 152 et 221 qui sont les réglages de tension et d'ampère en enlevant les potentiomètres

Pour les tensions de batterie supérieures à  24v, il faudra :
désactiver les deux leds et retire la resistence "102" voire sur la photo côté "out".

Bien que peu utilisent ce système, j'espère qu'il pourra au moins aider quelqu'un d'autre qui, comme moi, a besoin de le faire. Je n'ai rien trouvé sur Gogol à  ce sujet.
salutations


17
Il y a aussi cette app que j'utilise sur Android pour concevoir les fitres.

https://play.google.com/store/apps/details?id=gdvprj.passivefilters&gl=US





18
Bonjour à  tous !
Je voudrais partager avec vous ce "Centre de contrôle des panneaux solaires" fait avec un arduino et recyclage d'un vieil ampli RF de CB.

Solar Control Center v1.0 (Arduino NANO)


Sur la photo:
-2 VUmètre, l'un indiquait les watts d'entrée et l'autre la sortie (non ajusté à  l'échelle, de 0 à  400w linéaires tous les deux).
-2 leds rouges qui indiquent si un fusible a sauté ou si la batterie est débranchée.
-Un écran oled qui indique le pourcentage approximatif de la batterie (basé sur Vmin et Vmax), les volts du premier panneau solaire, les volts du deuxième panneau solaire (celui-ci a son propre câble pour ne pas être affecté par la chute de tension générale de la ligne), Watts de charge et watts de sortie. Un message apparaîtra également si un fusible tombe en panne ou si la batterie a une tension en dehors des plages normales.
-Trois interrupteurs Un qui éteint tout le système arduino, un pour éteindre le VUmètre et un autre pour éteindre l'écran oled (pour réactiver l'écran oled après avoir coupé sa tension, il faut éteindre et rallumer l'arduino).


Deux petits régulateurs BEC stepDown, un premier pour passer de 30v à  7 et l'autre pour ajuster le 5v final.


J'ai dû ajouter une résistance parallèle de 220k pour que le VU soit au maximum correctement.

---et 3kg d'étain plus tard...


Vue d'en-haut. On peut voir deux grandes plaques de cuivre une pour le négatif à  gauche et une pour le positif à  droite. Le fusible noir 40A avec les pattes dorées. Le 20A Disj pour alimenter les lumières de la maison (le système Dali basé sur du 24v , onduleur 230va n'est pas nécessaire). Les deux capteurs de courant en bleu, un pour l'entrée et un pour la sortie. Les deux régulateurs de tension bleu et vert. L'arduino avec ses résistances qui font office de pont diviseur de tension.



Le code:
Après des test en situation réelle, il faut prendre en compte que le pourcentage de batterie affiché sauter par étapes de 66, 77 et 88%.... et je n'ai pas encore pu corriger cela.Peut-être à  cause de l'adc basse résolution, du diviseur de tension mal choisi, ou le code.
J'essaierai de mettre à  jour tout ça plus tard.

/*
 * Solar Central Control V1.0
 * by Manu
 *
 * OLED 128x64 pin 5V GND  SCK A5 & SDA A4
 * CURRENT SENSOR HCS LSP 25A & 50A Pin 4V GND A0 & A1 ( supply voltage affects the analog output value, must be stable )
 * Voltage Meter Analog Read A2, A3, A7, A6
 * LED fuse failure D3 & D5
 * VU meter Watt D6 & D9
*/


//OLED-----------------------------------
#include <U8g2lib.h>                     // Pin I2C A4 A5
#define OledContrast 160                 // Contraste display
#define Font1 u8g2_font_haxrcorp4089_tr  // text size small
#define Font2 u8g2_font_logisoso16_tf    //           19x23
#define Font3 u8g2_font_logisoso42_tf    //           50x62
#define Font4 u8g2_font_logisoso30_tf    //           36x45
U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
//PIN------------------------------------
#define PinCS1 A0                        // Current Sensor Analog input A0 Output 25A
#define PinCS2 A1                        // Current Sensor Analog input A1 InPut 50A
#define PinV40A A2                       // Volt Sensor Analog A2 40Amp Fuse
#define PinV20A A3                       // Volt Sensor Analog A3 20Amp Fuse
#define PinVpvA A7                       // Volt Sensor Analog A7 PVa ( Photovoltaic Panel )
#define PinVpvB A6                       // Volt Sensor Analog A6 PVb ( Photovoltaic Panel )
//LED------------------------------------
#define PinLED1 3                        // led indicating a fuse failure output 20Amp D3
#define PinLED2 5                        // led indicating a fuse failure input 40Amp o failure input D5
#define LEDBrgs 1                        // led brightness
//VU meter ( Watt )----------------------
#define PinWout 6                        // Watt meter VU output D6
#define PinWin 9                         // Watt meter VU input D9
//Delay----------------------------------
#define msLoop 1000                      // Loop Delay ms
#define msLowBat 1000                    // Flashing speed of the led that indicates the alarm
#define msHighBat 500                    // Flashing speed of the led that indicates the alarm
//Current--------------------------------
#define CS1Zero 514                      // Current Sensor value for 0Amp
#define CS1PerUnit 17.49                 // Current Sensor value step 1Amp 50A sensor
#define CS2Zero 511                      // Current Sensor value for 0Amp
#define CS2PerUnit 8.74                  // Current Sensor value step 1Amp 25A sensor
//Voltage--------------------------------
#define V40ACst 33.6                     // Input voltage From 40A Fuse  220k + 10k  & 47k-GND  30vmax to 5vmax      & is the checkpoint that goes to the analog input pin   
#define V20ACst 33.4                     // Input voltage From 20A Fuse  220k + 10k  & 47k-GND
#define VpvACst 19.7                     // Input voltage From PVa       100k + 100k & 22k-GND  50vmax to 5vmax
#define VpvBCst 20.1                     // Input voltage From PVb       100k + 100k & 22k-GND
#define VbatMax 29.2                     // Voltage battery maximum 29.2v
#define VbatMaxAlert 29.5                // Alarm voltage battery is high  trigger the alarm above    = 29.2vmax + 0.3v margin of error of the analog input
#define VbatMin 20                       // Alarm voltage battery is low   trigger the alarm below
#define Vfuse   7                        // Alarm voltage fuse fail                trigger the alarm below
#define WminMeter 0                      // Watts value measured to display the Minimum on the meter 0W
#define WmaxMeter 400                    // Watts value measured to display the Maximum on the meter 400W
#define WVUMin 0                         // Analog value of the output to mark the Minimum watts on the meter pwm0 = aproxi 0v
#define WVUMax 255                       // Analog value of the output to mark the Maximum watts on the meter pwm255 = aproxi 5v o 3.3v
#define BatPrMin 0                       // Maximum value of % of the battery showing on the oled display
#define BatPrMax 100                     // Minimum value of % of the battery showing on the oled display
#define ZeroDflt 0.01                    // Saved value for reading values of 0 or less, avoid negative values or error multicast by 0
#define Diod40A 0.504                    // Voltage drop of the diode in the voltage divider bridge of the analog inputs.
#define Diod20A 0.488                   
#define DiodpvA 0.505                   
#define DiodpvB 0.509
//Test----------------------------------
#define StepTst 7                        // Steps to get count to 255 and back to 0   255/7 = 36 steps
#define StepLed 5                        // Steps to get led light value max and min  Led Max Value= StepLed*StepTst
#define SetOled 2.55                     // Sets the maximum number that the screen will show and will roll back to 0   255max value / 2.55 = 100   Display show 0->100 100->0


float CS1Raw=0;                          // Analog Value Current Sensor 25A
float CS2Raw=0;                          // "            Current Sensor 50A
float V40ARaw=0;                         // "            Resistive voltage divider 
float V20ARaw=0;                         // "            Resistive voltage divider 
float VpvARaw=0;                         // "            Resistive voltage divider 
float VpvBRaw=0;                         // "            Resistive voltage divider 
float CS1=0;                             // Save value conversion to current output
float CS2=0;                             // Save value conversion to current input
float V40A=0;                            // Save value conversion to voltage 40A Fuse input charge battery
float V20A=0;                            // Save value conversion to voltage 20A Fuse output discharge battery
float VpvA=0;                            // Save value Voltage probe from the A twin photovoltaic panels
float VpvB=0;                            // Save value Voltage probe from the B twin photovoltaic panels
float WattOut=0;                         // Save the output watt calculation
float WattIn=0;                          // Save the input watt calculation
float WattVUout=0;                       // Save input value to move the wattmeter needle
float WattVUin=0;                        // Save output value to move the wattmeter needle
float BatPor=0;                          // Save % battery

//Test
short i=0;                               // inicial value for i testmode inicial

void InitSetup(){
  u8g2.begin();                          // Start oled
  u8g2.setContrast(OledContrast);
  pinMode(PinWin, OUTPUT);
  pinMode(PinWout, OUTPUT);
  pinMode(PinLED1, OUTPUT);
  pinMode(PinLED2, OUTPUT);
  pinMode(PinV40A,INPUT);
  pinMode(PinV20A,INPUT);
  pinMode(PinVpvA,INPUT);
  pinMode(PinVpvB,INPUT);
  pinMode(PinCS1,INPUT);
  pinMode(PinCS2,INPUT);
}

void InitTest(){
    analogWrite(PinWout, i);
    analogWrite(PinWin, i);
    analogWrite(PinLED1, (i/StepLed));
    analogWrite(PinLED2, (i/StepLed));       
    u8g2.clearBuffer();
    u8g2.setFont(Font3);
    u8g2.setCursor(40,62);             
    u8g2.print((i/SetOled),0);              // divid 2.55   0->255 to 0->100
    u8g2.sendBuffer();   
}

void setup() {
  InitSetup();
  for(i=0;i<WVUMax;i=(i+StepTst)){
    InitTest();
  }
  for(i=WVUMax;i>0;i=(i-StepTst)){
    InitTest();
  }
  analogWrite(PinWout, 0);
  analogWrite(PinWin, 0);
  analogWrite(PinLED1, 0);
  analogWrite(PinLED2, 0); 
}

void loop() {
//RAW Value---------------------------------------
CS1Raw=(analogRead(PinCS1)-CS1Zero);     // Current Sensor Analog input A0 Output 25A
CS2Raw=(analogRead(PinCS2)-CS2Zero);     // Current Sensor Analog input A1 InPut 50A
V40ARaw=analogRead(PinV40A);             // Volt Sensor Analog A2 40Amp Fuse
V20ARaw=analogRead(PinV20A);             // Volt Sensor Analog A3 20Amp Fuse
VpvARaw=analogRead(PinVpvA);             // Volt Sensor Analog A7 PVa ( Photovoltaic Panel )
VpvBRaw=analogRead(PinVpvB);             // Volt Sensor Analog A6 PVb ( Photovoltaic Panel )
//RAW to CONVERSION-------------------------------
CS1=CS1Raw/CS1PerUnit;
if(CS1<0){                               // for negative value save 0
  CS1=ZeroDflt;
}             
CS2=CS2Raw/CS2PerUnit;
if(CS2<0){                                       
  CS2=ZeroDflt;

V40A=(V40ARaw/V40ACst)-Diod40A;            // -0.504v diod voltage drop
if(V40A<0){
  V40A=ZeroDflt;
}
V20A=(V20ARaw/V20ACst)-Diod20A;                     
if(V20A<0){
  V20A=ZeroDflt;
}
VpvA=(VpvARaw/VpvACst)-DiodpvA;
if(VpvA<0){
  VpvA=ZeroDflt;
}
VpvB=(VpvBRaw/VpvBCst)-DiodpvB;
if(VpvB<0){
  VpvB=ZeroDflt;
}
WattOut=V20A*CS1;
if(WattOut<10){
  WattOut=ZeroDflt;
}
WattIn=V40A*CS2;
if(WattIn<10){
  WattIn=ZeroDflt;
}
BatPor = map(V40A,VbatMin,VbatMax,BatPrMin,BatPrMax);  // erreur possible, en attente de vérification !
if(BatPor<0){
  BatPor=ZeroDflt;
}
//CHECK VOLTAGE AND FUSES------------------------
  if(V40A < Vfuse){                          // fuse 40A input alarm     
    analogWrite(PinLED2,LEDBrgs); 
    u8g2.clearBuffer();
      u8g2.setFont(Font2);
      u8g2.setCursor(0,23);
      u8g2.print("   BATERIA");
      u8g2.setCursor(0,43);
      u8g2.print("DESCONECTADA");
      u8g2.setCursor(0,64);
      u8g2.print("  O FUSIBLE");
    u8g2.sendBuffer();
    goto NEXT;
  }
  else if(V40A < VbatMin){                    // low battery alarm   20V minimum
    analogWrite(PinLED1,LEDBrgs);   
    delay(msLowBat);
    analogWrite(PinLED1, 0);
    analogWrite(PinLED2, 0);
    delay(msLowBat);
    u8g2.clearBuffer();
      u8g2.setFont(Font2);
      u8g2.setCursor(0,45);
      u8g2.print("BATERIA BAJA");
    u8g2.sendBuffer();   
    goto NEXT;
  }
  else if(V40A > VbatMaxAlert){                  // high over battery alarm 
    analogWrite(PinLED1,LEDBrgs);   
    delay(msHighBat);
    analogWrite(PinLED1, LEDBrgs);
    analogWrite(PinLED2, LEDBrgs);
    delay(msHighBat);
    u8g2.clearBuffer();
      u8g2.setFont(Font2);
      u8g2.setCursor(0,45);
      u8g2.print("VOLTAGE ALTO");
    u8g2.sendBuffer();   
    goto NEXT;
  }
  else if(V20A < Vfuse){                     // fuse 20A output alarm   
    analogWrite(PinLED1,LEDBrgs);
    u8g2.clearBuffer();
      u8g2.setFont(Font2);
      u8g2.setCursor(0,23);
      u8g2.print("  SALTO LA");
      u8g2.setCursor(4,43);
      u8g2.print(" PROTECCION");
      u8g2.setCursor(0,64);
      u8g2.print("   REARMAR");
    u8g2.sendBuffer();   
    goto NEXT;
  }

  else{
    analogWrite(PinLED1, 0);
    analogWrite(PinLED2, 0);
  }
//SHOW DATA---------------------------------------
u8g2.clearBuffer();
  u8g2.setFont(Font2);
  u8g2.setCursor(19,21);
  u8g2.print(VpvA,0);
  u8g2.print("v   ");
  u8g2.print(VpvB,0);
  u8g2.print("v ");
  u8g2.setCursor(69,43);
  u8g2.print("<"); 
  if(WattIn<100){
    u8g2.print(" ");
  }
  if(WattIn<10){
    u8g2.print("  ");
  }
  u8g2.print(WattIn,0);
  u8g2.print("W");
  u8g2.setCursor(69,64);
  u8g2.print(">");
  if(WattOut<100){
    u8g2.print(" ");
   }
  if(WattOut<10){
     u8g2.print("  ");
  }
  u8g2.print(WattOut,0);
  u8g2.print("W");
  u8g2.setCursor(0,64);
  if(BatPor<100){
     u8g2.setFont(Font2);
     u8g2.print(" ");
  }
  if(BatPor<10){
     u8g2.setFont(Font2);
     u8g2.print("  ");
  }
  u8g2.setFont(Font4);
  u8g2.print(BatPor,0);
  u8g2.print("%");
 u8g2.sendBuffer();
 
NEXT:

//VU METER----------------------------------------
WattVUout=map(WattOut,WminMeter,WmaxMeter,WVUMin,WVUMax);      //from 0 to 400 watts the needle moves from 0 to maximum
WattVUin=map(WattIn,WminMeter,WmaxMeter,WVUMin,WVUMax);
analogWrite(PinWout, WattVUout);
analogWrite(PinWin, WattVUin);

delay(msLoop);
}
Le code est très mal optimisé certes, mais fonctionnel. Toute bonne idée pour minimiser la consommation de ressources de l'arduino est la bienvenue.
J´ai Essayé de changer le "float" en "int" "uint16" et autres. Mais je n'ai pas pu obtenir les décimales nécessaires pour avoir un calcul exact des watts entre autres
N'oubliez pas de configurer le message d'alerte à  votre convenance, car ils sont en espagnol  :o



Dans l'ordre sur les photos:
-En haut le détecteur d'incendie blanc
-2 gros fils noirs du "Solaire Control center" pour alimenter l'éclairage domestique.
-Juste en dessous venant du contrôleur mppt entre et qui charge la batterie.
-Connecteur 7 broches provenant de l'extérieur pour mesurer la tension des panneaux.
-Câble rouge & noir positif de la batterie le même pour charger que pour décharger
-En vert connecté au châssis du boitier, la batterie et mppt tous au même point de masse. (pas le negatif de la batterie)
-Le mppt blue. Celui-ci présente deux entrées + - des panneaux solaires et sorties + - pour charger la batterie.
(Dans le manuel, il est clairement indiqué qu'il est obligatoire de connecter d'abord la batterie et ensuite seulement les panneaux)


Comme je l'ai déjà  dit, les aiguilles ne sont qu'indicatives et ne sont pas sur l'échelle marquée du VU. Réglez à  environ 400 W pour les valeur maxi.

Enfin, je tiens à  dire qu'il y a trop d'énergie pour alimenter uniquement les lumières de la maison et je vais ajouter bientôt des bricolles pour en profiter.
A plus  ;D

19
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

21
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/




22
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/


23
Bonjour,

Je mets en oeuvre 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);
}



24
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


25
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

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

27
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:



28
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 !  :)

29
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  ;)

30
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.

Pages: 1 [2] 3