Comme je n'aime pas ce qui n'est pas démontable, je l'ai ouverte en coupant le couvercle au milieu de la soudure, j'ai fabriqué une gouttière en tôle, dans laquelle vient se loger un joint pour rendre le couvercle amovible.
Le filtre au charbon actif, permet de piéger les particules d'huiles qui s'échappent du compresseur :
On voit sur la droite les triacs BT139-800V, au démarrage ils commandent les deux inductions du moteurs puis celui du haut se coupe au bout de quelques 10èmes de secondes.
De l'autre coté du circuit se trouvent les condensateurs, le quartz 16Mhz et une alimentation à découpage de disque dur externe, 230V >> 5V 2A .
En blanc, les optotriacs MOC 3020.
Sur la gauche, le capteur de pression atmosphérique, sous sa prise se trouve un Atmega 168.
En dessous une prise ISP pour la programmation avec l'AVRIsp MKII.
En dessous en blanc deux leds qui attestent du fonctionnement de chaque circuit.
Dans le couvercle se trouve l'écran, ajusté dans un logement fraisé dans la face et le circuit comportant les interrupteurs.
Il a fallut fraiser un peu les circuit imprimés pour que cela passe avec les prises lors de la fermeture du boitier.
Les boutons servent à monter ou descendre la valeur de la dépression à atteindre (le + et - à gauche en bas) et à démarrer et stopper le compresseur ( Start et Stop en bas à droite).
Les boutons sont fait avec des corps de leds blanche qui avaient grillé:
Je leurs ai coupé les pattes, elles viennent prendre appuis directement sur les boutons en dessous. Elles ont une collerette qui les empêche de sortir.
#include <LiquidCrystal.h> // Inclusion de la librairie pour afficheur LCD
const int RS=2; //2//declaration constante de broche
const int E=19;//3 //declaration constante de broche
const int D4=18;//4 //declaration constante de broche
const int D5=17;//5 //declaration constante de broche
const int D6=16;//6 //declaration constante de broche
const int D7=15;//7 //declaration constante de broche
LiquidCrystal lcd(RS, E, D4, D5, D6, D7);// initialisation LCD en mode 4 bits
const int PRESSUREPIN = 0; // déclaration de la constante de broche // capteur de pression
const int CurrentPin=7;//4 //declaration constante de broche
const int PlusPin=8;//5 //declaration constante de broche // inter +
const int MinusPin=6;//6 //declaration constante de broche // inter -
const int StartPin=5;//7 //declaration constante de broche // inter start/stop
int plusVal=0; // variable du bouton +
int minusVal=0;// variable du bouton -
int buttonPlus=300; // variable de l'état du bouton +
int buttonMinus=300; // variable de l'état du bouton -
int startVal=0;// variable du bouton start
int etatStart=0;// variable d'état de la commande de démarrage du compresseur
long Time=0;
long oldTime=0;
long motorOldTime=0;
long oldLcdTime=0;
float pressure=0;
float RTPressure=0;
float atmoPressure=0;
int pressureVal=0;
const int motorPinDem=9;
const int motorPin=10;
int motorState=0;
float filterVal=0.9;
void setup(){
pinMode(CurrentPin,OUTPUT); // 5 volts pour interrupteurs de sélection
pinMode(PlusPin,INPUT); // interrupteur +
pinMode(MinusPin,INPUT); // interrupteur -
pinMode(StartPin,INPUT); // interrupteur start/stop
pinMode(motorPinDem,OUTPUT);
pinMode(motorPin,OUTPUT);
pinMode (PRESSUREPIN,INPUT);
pressure=analogRead(PRESSUREPIN);
atmoPressure=(((pressure/(1023/5))/5)+.04)/.004*10; // calcul de la pression avec un capteur MPX4250A
lcd.begin(16,2); // Initialise le LCD avec 20 colonnes x 4 lignes
delay(10); // pause rapide pour laisser temps initialisation
// Test du LCD
//lcd.blink() ;
lcd.print(" Conception ") ; // affiche la chaîne texte - message de test
lcd.setCursor(0,1);
lcd.print(" J-F Schmid ") ;
delay(3000); // pause de 3 secondes
lcd.clear(); // // efface écran et met le curseur en haut à gauche
delay(10); // pour laisser le temps d'effacer écran
lcd.print(" Etalonnage ") ; // affiche la chaîne texte - message de test
lcd.setCursor(0,1);
lcd.print(" de la pression ") ;
delay(3000); // pause de 3 secondes
lcd.clear(); // // efface écran et met le curseur en haut à gauche
delay(10); // pour laisser le temps d'effacer écran
}
void loop(){
digitalWrite(CurrentPin,HIGH);
plusVal=digitalRead(PlusPin);
minusVal=digitalRead(MinusPin);
startVal=digitalRead(StartPin);
pressure=analogRead(PRESSUREPIN);
RTPressure= lpfilter(float((((pressure/(1023/5))/5)+.04)/.004*10)*.9+(RTPressure*.1), filterVal , RTPressure); // filtrage et conversion en pression atmo
if (plusVal==0) {
buttonPlus=300;
}
else {
buttonPlus--;
}
if (minusVal==0) {
buttonMinus=300;
}
else{
buttonMinus--;
}
//lcd.setCursor(0, 0) ; // positionne le curseur à l'endroit voulu (colonne, ligne) (1ère=0 !)
Time=millis();
if (Time-oldLcdTime>100){
lcd.setCursor(0,0);
lcd.print(" ") ; // affiche la valeur de la variable
lcd.setCursor(6,0);
lcd.print(" ") ;
oldLcdTime=Time;
}
lcd.setCursor(0,0);
lcd.print(pressureVal) ; // affiche la valeur de la variable
lcd.setCursor(6,0);
lcd.print(int(RTPressure-atmoPressure)) ; // affiche la valeur de la variable
lcd.setCursor(12,0);
lcd.print("mBar");
lcd.setCursor(0,1);
lcd.print(" + -");
lcd.setCursor(10,1);
if (etatStart==0){
lcd.print("Start");
}
else {
lcd.print("Stop ");
}
Time=millis();
if (minusVal==1){
Minus();
}
else{
}
if (plusVal==1){
Plus();
}
else{
}
if (startVal==1){
if (Time-oldTime>500){
etatStart=!etatStart;
Time=millis();
oldTime=Time;
}
else{
}
}
else{
}
if ((etatStart==0)||((RTPressure-atmoPressure)<pressureVal)){
Stop();
}
else if ((RTPressure-atmoPressure)>pressureVal+20){
Start();
}
else{
}
}
// ----- memo LCD ---
// LiquidCrystal(rs, enable, d4, d5, d6, d7) ; // initialisation 4 bits
// lcd.begin(cols, rows); // initialisation nombre colonne/ligne
//
// lcd.clear(); // efface écran et met le curseur en haut à gauche
// lcd.home(); // repositionne le curseur en haut et à gauche SANS effacer écran
//
// lcd.setCursor(col, row) ; // positionne le curseur à l'endroit voulu (colonne, ligne) (1ère=0 !)
// lcd.print("texte") ; // affiche la chaîne texte
//
// lcd.cursor() ; // affiche la ligne de base du curseur
// lcd.noCursor() ; // cache le curseur
// lcd.blink() ; // fait clignoter le curseur
// lcd.noBlink() ;// stoppe le clignotement du curseur
// lcd.noDisplay() ; // éteint le LCD sans modifier affichage
// lcd.display() ; // rallume le LCD sans modif affichage
//
// lcd.scrollDisplayLeft(); // décale l'affichage d'une colonne vers la gauche
// lcd.scrollDisplayRight(); // décale l'affichage d'une colonne vers la droite
// lcd.autoscroll() ; // les nouveaux caractères poussent les caractères déjà affichés
// noAutoscroll(); // stoppe le mode autoscroll
void Start(){
digitalWrite(motorPin,1);
digitalWrite(motorPinDem,0);
if (motorState==0){
motorState=1;
Time=millis();
motorOldTime=Time;
}
else{
}
Time=millis();
if (motorState==1 && Time-motorOldTime<800 ){
digitalWrite(motorPinDem,1);
}
else{
}
}
void Stop(){
digitalWrite(motorPinDem,0);
digitalWrite(motorPin,0);
motorState=0;
}
void Plus(){
if (Time-oldTime>buttonPlus){
pressureVal++;
Time=millis();
oldTime=Time;
}
}
void Minus(){
if (Time-oldTime>buttonMinus){
pressureVal--;
Time=millis();
oldTime=Time;
}
}
float lpfilter(float data, float filterVal, float filteredVal){
if (filterVal > 1){
filterVal = .99;
}
else if (filterVal <= 0){
filterVal = 0;
}
filteredVal = (data * (1 - filterVal)) + (filteredVal * filterVal);
return filteredVal;
}