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!: 
https://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.

Sujets - Manu

Pages: [1] 2
1
J'aimerais partager ce nouveau projet avec vous.  :)

Il s'agit d'un écran ili9341 & ESP32 qui permet de surveiller l'état d'un système d'énergie solaire, grâce au protocole VE. Direct disponible sur les appareils Victron Energy. Ajoutez également un capteur de courant pour le chargeur dépourvu de VE. Direct et une sortie est également incluse pour activer un relais.


Le code & Schéma et les détails sont disponibles sur mon github:
https://github.com/ManuUniverso/Solar-Monitor

Dans ce cas, je repousse les limites de ce que je suis capable de faire en programmation, donc si quelqu'un a des idées pour améliorer le code, welcome.




J'en profite pour vous laisser quelques images supplémentaires bonus pour les bidouilleurs !  8)



les entrailles de la machine

LDR







N'hésitez pas à laisser un commentaire si vous pensez pouvoir apporter quelque chose d'intéressant au projet ou si vous avez des questions.
Chao !!! ;D



VE Direct Protocol
https://www.victronenergy.com/upload/documents/VE.Direct-HEX-Protocol-Phoenix-Inverter.pdf
https://community.victronenergy.com/storage/attachments/20859-mppt-hex-protocol.pdf
https://www.victronenergy.com/upload/documents/VE.Direct-Protocol-3.33.pdf

Display ili9341
https://www.youtube.com/watch?v=hcMU5H6vzxI
ESP32
https://www.youtube.com/watch?v=2NgkTLpHAKk




2
Bonjour à  tous,

Voici une petite astuce qui consiste à  activer une prise connectée (en l'occurrence un modèle Meross MSS310) avec un arduino ou esp32 par exemple, sans perdre son usage normal et ses fonctions d'origine.

On distingue deux gros circuits à  l'intérieur de la prise. Un avec alimentation et commande de relais, un autre plus petit qui traite la connexion réseau (vertical sur la photo).


Ce que j'ai réussi à  localiser. Le plus intéressant bien sûr, est la ligne qui active le relais lorsqu'il est à  un niveau haut de 3.3v.Ici je suppose RX pour la fonction qui mesure la consommation dispo sur l'app mais je ne l'ai pas vérifié.

Désolé, sur cette photo, le violet est le supposé RX mais dans l'assemblage ESP32 sur les photos suivante, j'utilise cette couleur pour GND.

Il faut couper la piste. Connectez ensuite la sortie de la carte d'origine et celle de l'esp32 à  cette piste. J'ai ajouté une diode 1N5711 pour chacun pour éviter que si l'ESP32 est à  un niveau haut, cela n'endommage pas la petite plaque d'origine de la prise a niveau bas, par exemple.




Exemple avec un ESP32, deux diodes 1N5711 et 5 fils.

Violet   GND
Rouge  3.3v
verte sortie ESP32 pour activer le relais (avec diode)
verte sortie Prise   pour activer le relais (avec diode)
bleu sortie finale qui regroupe les deux précédentes

VertESP32 + VertePrise   = Bleu
       0       +       0          = 0
       0       +       1          = 1
       1       +       0          = 1
       1       +       1          = 1

Code simple pour activer le relais par intermittence juste pour vérifier le fonctionnement. Je ne suis pas programmeur, il existe des moyens plus élégants de le faire sans doute, mais cela fonctionne.
//TEST RELAY HIGH=ON en ESP32
//Relay---------------------------------------------------
#define RelayPin 32                                                      // Pin D32 GPIO32
#define RelayLevelON HIGH                                                 // Relay activated in high
#define RelayLevelOFF LOW                                               // Relay disable in low
#define msPinSet 500
#define msON 3000
#define msOFF 3000
#define msLoop 50

void RelayPinSet(){
  pinMode(RelayPin, OUTPUT);                                             // configure pin in output mode to activate relay
  delay(msPinSet);
  digitalWrite(RelayPin, RelayLevelOFF);                                 // Turno OFF relay
  delay(msPinSet);
  Serial.println("RelaySetPin");   
}

void RelayON(){
  digitalWrite(RelayPin, RelayLevelON);                                  // Turno ON relay go to "#define RelayLevelON" to change HIGH or LOW for your relay activated
  delay(msON);                                                           // minimum turn ON time check the relay initial start
  Serial.println("Relay ON");   
}

void RelayOFF(){
  digitalWrite(RelayPin, RelayLevelOFF);                                 // Turno OFF relay go to "#define RelayLevelOFF" to change HIGH or LOW for your relay disabled
  delay(msOFF);     
  Serial.println("Relay OFF");   
}


void setup() {
  Serial.println("Setup START");   
  RelayPinSet();                                                        // Set output & HIGH
  Serial.println("Setup END");   
}

void loop(){
  RelayON();                                                            // Relay ON
  RelayOFF();                                                           // Relay OFF
  delay(msLoop);
}


Bien sûr, si vous utilisez un arduino nano por exemple, il faut tenir compte du fait que le niveau logique ici est de 3.3v, pas de 5v, et il faut rajouter un "converter" pour plus d'infos, voir cette vidéo.

 EB_#264 Mini-Plaquette - Conversion de niveaux logiques de bus
https://www.youtube.com/watch?v=7N1shxJ8k7I


3
Bonjour,

Je me promenais dans le magasin Lidl et j'ai trouvé ce multimètre Parkside pour un peu moins de 12 €. Je voulais avoir un multimètre "martyr" pour les pratiques contraires à  "l'éthique", alors j'ai décidé de l'acheter.

Mais quand vous rentrez chez vous, insérez la batterie et tournez la roue et ...bip!, hold et... bip!
Bref, à  chaque fois que l'on touche un bouton ou que l'on change la molette de sélection, un son strident et trop puissant me dérangeait les oreilles.

J'ai donc décidé de voir ce que je pouvais faire pour y remédier et voici ma solution.







  ::) Comme vous pouvez le voir, j'ai finalement mis un potentiomètre en série avec le buzzer.

Avec une résistance de700ohm = son moyen
                                    1Kohm = son faible
                                  18Kohm = son très faible à  peine audible.

Logiquement il n'est pas nécessaire d'y mettre un si petit potentiomètre. Choisir une résistance à  votre goût sera le mieux je pense.

Bonus track:  ;)

4
Trucs et Astuces d'Électronique / Filtres Passe-Bas & Haut < 1Mhz
« le: août 24, 2022, 03:08:23 pm »
Bonjour,
Je voulais juste partager ce tableau que j'ai trouvé sur un vieux livre Radio Handbook

Filtre passe-bas & un filtre passe-haut  < 1Mhz

0  - C1 C3 C5 valeurs communes
x  - C1 C3 valeurs communes  C5 valeurs moins communes
â–² - C1 C5 valeurs moins communes C3 valeurs communes




5
Bonjour,
Je voulais partager cette nouvelle qui apporte une approche différente de l'apprentissage de l'électronique.

Pour ceux d'entre vous qui ont le Game Pass Xbox, il inclut désormais ce jeu pour apprendre a coder, entre autres.
(Pour le moment uniquement sur PC & pas encore traduit en français ).

https://www.xbox.com/fr-fr/games/store/shenzhen-i-o/9p1jhj127hr4
Description

CRÉEZ DES CIRCUITS. ÉCRIVEZ DU CODE. RTFM.
●   Créez des circuits en utilisant divers composants provenant de divers fabricants, tels que des microcontrôleurs, des portes logiques de mémoire et des écrans LCD.
●   Écrivez du code dans un langage assembleur puissant et compact où toutes les instructions peuvent être correctement exécutées.
●   Lisez le manuel inclus, qui comprend plus de 30 pages de dé références et de diagrammes techniques.
●   Apprenez à  connaître les différents personnages hauts en couleur de votre nouvel employeur, 深圳龙腾科技有限公司 (Shenzhen Longteng Electronics Co., Ltd.), situé dans la capitale électronique du monde.
●   Devenez créatif ! Concevez et créez vos propres jeux et appareils dans la sandbox.
●   L'ingénierie n'est pas si facile ! Prenez une pause et jouez à  une toute nouvelle variante du solitaire.




Équipe Dev:
https://www.zachtronics.com/


6
Bonjour,
Je voulais partager cette méthode, pour réaliser des liens direct pour écouter la radio.
(Par exemple depuis un esp32+vs1053)

Tout d'abord chercher la station radio sur ce site depuis Firefox:
https://onlineradiobox.com/
Exemple RTL France



faites un clic droit et sélectionnez "inspecter"



choisissez l'onglet "réseau"



appuyez maintenant sur le bouton de "play" et le lien ci-dessous apparaîtra double clic dessus et voilà  !




Cette astuce je l'ai trouvé ici:
https://www.youtube.com/watch?v=1q_RzSqv410




Bonus Tracks:

Radio Vinci Autoroutes Ouest Centre
https://str0.creacast.com/radio_vinci_autoroutes_1

Radio Vinci Autoroutes Côte d'Azur
https://str0.creacast.com/radio_vinci_autoroutes_7

Radio Vinci Autoroutes Alpes Provence
https://str0.creacast.com/radio_vinci_autoroutes_6

Radio Vinci Autoroutes Languedoc
https://str0.creacast.com/radio_vinci_autoroutes_4

Radio Vinci Autoroutes Auvergne
https://str0.creacast.com/radio_vinci_autoroutes_5

Radio Vinci Autoroutes Grand Ouest
https://str0.creacast.com/radio_vinci_autoroutes_2

Radio Vinci Autoroutes A355
https://ice.creacast.com/radio_vinci_autoroutes_a355

Radio Vinci Autoroutes Sud-Ouest
https://str0.creacast.com/radio_vinci_autoroutes_3

Radio Vinci Autoroutes Perche - Pays de la Loire
https://ice.creacast.com/radio_vinci_autoroutes_cofiroute_r2

Radio Vinci Autoroutes Version Pop-Rock
https://listen.radioking.com/radio/424771/stream/478231

Radio Vinci Autoroutes Version Classique
https://listen.radioking.com/radio/461024/stream/516290

Radio Vinci Autoroutes Française
https://listen.radioking.com/radio/394513/stream/448327

Chérie FM
https://scdn.nrjaudio.fm/fr/30201/mp3_128.mp3?origine=radiobox&cdn_path=adswizz_lbs12&access_token=b2a70296661745ed8b0ba6f76174c9af

Europe1
http://ais-live.cloud-services.paris:8000/europe1.mp3?

Jazz & Soul Radio
https://jazzradio.ice.infomaniak.ch/jazzradio-high.aac

Vibration
https://vibrationenfrancais.ice.infomaniak.ch/vibrationenfrancais-128.mp3

Alouette
https://alouette.ice.infomaniak.ch:80/alouette-high.mp3

Funk
https://gene-wr05.ice.infomaniak.ch/gene-wr05.aac

Virgin Radio
https://ais-live.cloud-services.paris:8443/virgin.aac

skyrock
https://icecast.skyrock.net/s/natio_aac_64k

france inter
https://icecast.radiofrance.fr/franceinter-midfi.mp3

rtl
https://streamer-02.rtl.fr/rtl-1-44-128

Choi Radio X Quebec
http://icecast-choi.rncm.ca/choi.aac

france bleu
https://icecast.radiofrance.fr/fb1071-midfi.mp3

france culture
https://icecast.radiofrance.fr/franceculture-midfi.mp3

france info
https://icecast.radiofrance.fr/franceinfo-midfi.mp3

fun radio
https://streamer-03.rtl.fr/fun-1-44-128

rire et chanson
https://scdn.nrjaudio.fm/fr/57970/mp3_128.mp3?origine=radiobox&aw_0_1st.station=Rire-Chansons-ROCK-AND-RIRE&cdn_path=adswizz_lbs7&adws_out_a2&access_token=36090ade1a5847d4a8137c648505e05d

7
Dépannage d'Électronique et d'Informatique / Décoder UART (Siglent)
« le: juillet 23, 2022, 04:15:12 pm »
Bonjour à  tous,
J'essaie de lire un signal que je suppose UART. Mais pourquoi deux signaux différents renvoient la même valeur (0x75) de decodage ?   :o
Mon objectif est de copier ces signaux et de les simuler avec un arduino.

(J'ai essayé tous les réglages, il n'est qu'à  115200, il affiche 3 trames de lectures pour chaque signal)





Merci

8
Bonjour !

Énergie Solaire chez soi: Charger USB
L'éclairage de ma maison fonctionnant à  100% uniquement avec de l'énergie solaire, je constate un surplus de capacité de batterie. Ce n'était pas prévu à  l'origine mais je vais ajouter quelques bricolles pour profiter de cette énergie. Dans ce cas un triple chargeur USB à  charge lente.


Voici le schéma qui m'a pris plusieurs jours à  concevoir. Des logiciels avancés tres complex tels que Paint ont été nécessaires.
Entre l'interrupteur et la batterie il faut placer un fusible qui manque sur le schéma.


Liste des composants :
-Comme boîtier une horloge
-Un régulateur de tension de vbat a 14v
-trois  régulateur de tension de 14v à  5v  500mA
-un interrupteur
-portefusible & fusible 2A
-Cable
-Deux connecteurs XT60 h & m
-Des filtres de ferrite
-Trois Connecteurs USB
-PCB Board à  couper

Pour le câble princiapl batterie->horloge je n'ai pas de photos. Mais placez simplement le porte-fusible (un fusible 2A suffit) du câble le plus près possible de la batterie (dans mon cas LiFePo4 26v)avec le xt60H côte horloge. Ensuite, le connecteur xt60 M sur le câble de l'horloge.

Placer l'interrupteur dans le boitier avec ses câbles dejapret pour faciliter le montage. (pas de photo, mais voire les vis noire nylon)

Souder le bec XL7015 qui sert de premier étage (vbat a 14v) préalablement réglé sur 14v et du ruban kapton pour l'isoler.
Bec buck stepdown regulateur de tension ....

J'ai changé le potentiomètre par une résistance.

Mettez les connecteurs USB dans la boîte.
J'ai également mis des filtres en ferrite sur chaque câble positif.


Ajustez la sortie des trois modules XL4015 à  5v 500mA max et dessoudez la résistance qui alimente les 3 leds pour éviter une consommation inutile.Un peu de kapton  :o


Maintenant, la partie la plus difficile et l'erreur que j'ai commise. La boîte trop
 petite était très difficile pour emboîter les trois modules à  l'intérieur. Très élégant  ???


Maintenant, remettez le ruban qui relie le capot arrière aux boutons de l'horloge et alimenter l'horloge avec le +- du 5v


Ferméz le tout avec beucoup de style.... :o

Un peu de colle chaude noire et ni vu ni connu...

Les principales erreurs pour ceux qui veulent faire quelque chose de similaire :
-boîte trop petite
-Le bec de la premier étape Xl7015 chauffe un peu ( 32ºC sur le boitier ) mais c'est raisonnable on peut s'en servir sans problème.
Seulement quand les trois USB sont en pleine charge.

Et voilà  ! Chat marche ;D




Bye

Pour la petite histoire pendant que j'écrivais tout ça, j'ai eu le droit à  une coupure du courant general et il m'aura fallu tout réécrire. Je vais devoir connecter ce pc d'une manière ou d'une autre au solaire   ??? ::)  ..et le routeur ...et le moniteur ...



9
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


10
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

11
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);
}



12
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


13
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

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



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

Pages: [1] 2