Bonjour tout le monde !!!
Voila il y'a quelque année je me suis lancée dans ce formidable monde de la programmation. j'ai commencé par apprendre le python et puis l'arduino. J'ai pu ainsi acquérir de l'expérience et aboutir à un projet final que je tient à vous présenter.
Mon but était de contrôler un ventilateur d'ordinateur selon des température relevée devant le cpu, à la sortie d'air et enfin à l'entrée d'air ou avec un potentiomètre. Ainsi que d'allumer/eteindre mon serveur par un push button (je vous direz plus tard pourquoi je n'est pas mis de momentary push button)
Tout d'abord le premier problème qui ce pose c'est l'alimentation de l'arduino en effet si le serveur est éteint l'alim du pc ne délivre plus de 5v ou de 12v. j'ai donc opté pour une alimentation externe de 12v que j'abaisse à 5v via un pont diviseur. Ainsi je prend aussi cette alimentation 12v extérieur pour alimenter mon ventilateur.
Ensuite pour éviter des bourdes et d'éteindre le serveur alors que l'on ne voulait pas je vérifie que les tension du 5v et 12v de l'alimentation du serveur ne sont pas à 0 (cf: problème d'alimentation). pour cela j'ai trouvé ce site qui explique comment faire: http://www.electroschematics.com/9351/arduino-digital-voltmeter/
C'est ici que l'on voit l'intérêt d'un push button. En effet on ne peut éteindre le serveur que par ce bouton car si l'arduino détecte que le bouton est sur la position "on" alors que les deux voltage de l'alimentation sont à 0 il activera le relais jusqu'à ce que l'ordinateur s'allume.
De plus on peut dés lors anticiper l'arrêt de l'ordinateur et envoyer un mail aux utilisateurs du serveur.
Enfin un des problèmes qui ma donné beaucoup de fil a retordre à était le contrôle du ventilateur par une sortie PWM. En effet si je ne me trompe pas l'arduino produit un signal PWM à une fréquence d'environ 490KHz alors que le ventilateur néssescite un signal pwm à 25KHz. Et malgré mon expérience je ne me sentais pas capable de manipuler les registres des timer de l'arduino. Au terme des recherches que j'ai effectuée grâce à notre amis Google je suis finalement tombé sur cette publication :PWM frequency library - Libraries - Arduino Forum
Je l'avoue, ca m'a bien aidé pour contrôler le ventilateur.
voici le schémas du montage:
Bon je ne vais pas le décrire, Vous pourrez toujours me posez des question si vous en avez.
Ensuite voici le code arduino qui permet d'animer la bête ^^
# include <PWM.h>
#include <dht.h>
#define pin_cpu A4
#define pin_in A5
#define pin_out A2
#define R1 100000.0 // resistance of R1 (100K) -see text
#define R2 10000.0 // resistance of R2 (10K) - see text!
#define pin_12_ext A6
#define pin_12_pc A0
#define pin_5 A1
#define pin_vent 9
#define pin_pot A3
#define pin_relais 11
#define pin_1_interupt 7
#define pin_2_interupt 8
#define interupt_g 10
String inString = "";
dht dht_cpu;
dht dht_in;
dht dht_out;
int temp_cpu;
int temp_in;
int temp_out;
int hum_cpu;
int hum_in;
int hum_out;
float vout = 0.0; //valeur pour le voltmetre arduino
float vin = 0.0;
int value = 0;
float alim_5 = 0.0;
float alim_12 = 0.0;
float alim_ext = 0.0;
boolean state = true; //variable pour l'état du pc true=allumé false=éteint
boolean _verbose = true; //verbose du programme (pour avoir l'humidité ou non
boolean manual; //variable pour définir si l'on utilise le potenciométre ou non pour regler la vitesse du ventilateur
int fan_speed = 0;
int32_t frequency = 25000; //frequency (in Hz)
void setup() {
// put your setup code here, to run once:
pinMode(11, OUTPUT);
digitalWrite(11, HIGH);
pinMode(10, INPUT);
pinMode(A1, INPUT);
pinMode(A0, INPUT);
pinMode(A3, INPUT);
pinMode(A6, INPUT);
Serial.begin(9600);
delay(100);
//initialize all timers except for 0, to save time keeping functions
InitTimersSafe();
//sets the frequency for the specified pin
bool success = SetPinFrequency(pin_vent, frequency);
//if the pin frequency was set successfully, turn pin 13 on
}
void loop() {
// on récupére les tension de l'alimentation du pc (12V et 5V) ainsi que l'alimentation exterieur.
alim_ext = get_V(pin_12_ext);
alim_12 = get_V(pin_12_pc);
alim_5 = get_V(pin_5);
if (alim_12 == 0 && alim_5 == 0) {
// on vérifie l'état du serveur
state = false;
pwmWrite(pin_vent, 10); //la valeur 10 correspond à l'arret du ventilateur
}
else {
state = true;
}
if (digitalRead(interupt_g) == HIGH) {
/*c'est ce bout de programme qui permet à moins de mettre le push button sur off de rallumer le server
* En effet lorsque l'on verifie l'état du serveur si il est éteint la variable passera a false
* or ici si le push button est sur on et que state=false le relais démarre l'ordinateur
*/
if (state == false) {
//allumage du serveur via relais 5v bas niveau
state = true;
power(true);
digitalWrite(pin_relais, LOW);
delay(250);
digitalWrite(pin_relais, HIGH);
delay(120000); //corespond a 2 minutes le temps que le serveur démarre;
}
}
else {
if (digitalRead(interupt_g) == LOW) {
if (state == true) {
power(false);
//extinction de l'ordinateur via commande executé grace à l'interface python
//cf code python fonction shutdown()
state = false;
Serial.println("0");
}
}
}
if (state == true) {
//ma routine de controle des temperature et d'ajustement de la vitesse du ventilateur
read_dht(_verbose);
send_data(_verbose);
if (digitalRead(pin_1_interupt) == HIGH) {
manual = true;
}
else {
if (digitalRead(pin_2_interupt == HIGH)) {
manual = false;
}
}
if (manual == true) {
//ici on régle la vitesse du ventilateur grace au potenciometre
fan_speed = get_pot(pin_pot) / 4;
if (fan_speed < 10) {
fan_speed = 10;
}
}
else {
if (Serial.available() > 0) {
//ce qui suit n'est pas de moi mais à était trouvé sur le site d'arduino: https://www.arduino.cc/en/Tutorial/StringToIntExample
while (Serial.available() > 0) {
int inChar = Serial.read();
if (isDigit(inChar)) {
//convert the incoming byte to a char and add it to the string:
inString += (char)inChar;
}
//if you get a newline, print the string, then the string's value:
}
fan_speed = inString.toInt();
//clear the string for new input:
inString = "";
}
//fan_speed=x.toInt();
if (fan_speed == 0) {
fan_speed = 10; //10 est la valeur d'arret du ventilateur
}
}
pwmWrite(pin_vent, fan_speed);
}
delay(1000);
}
void read_dht(boolean read_plus) {
//dans cette fonction on releve les temperature des dht11
dht_cpu.read11(pin_cpu);
dht_in.read11(pin_in);
dht_out.read11(pin_out);
temp_cpu = dht_cpu.temperature ;
temp_in = dht_in.temperature;
temp_out = dht_out.temperature;
if (read_plus) {
//et si on en veut plus on peut écrire l'humidités relevé par les dht11
hum_cpu = dht_cpu.humidity;
hum_in = dht_in.humidity;
hum_out = dht_out.humidity;
}
}
int get_pot(int pin) {
//fonction relevant la valeur du potentiometre
int an_pot = analogRead(pin);
return an_pot;
}
float get_V(int pin) {
//prend les mesure des tension sur le pin passé en argument
value = analogRead(pin);
vout = (value * 4.88) / 1024.0; // see text
vin = vout / (R2 / (R1 + R2));
if (vin < 0.09) {
vin = 0.0; //statement to quash undesired reading !
}
return vin;
}
void send_data(bool _verbose) {
//"protocole" d'envoie des données pour interfacer avec le programme python
if (_verbose) {
Serial.print(temp_cpu);
Serial.print("_");
Serial.print(temp_out);
Serial.print("_");
Serial.print(temp_in);
Serial.print("|");
Serial.print(hum_in);
Serial.print("_");
Serial.print(hum_out);
Serial.print("_");
Serial.print(hum_cpu);
Serial.print("|");
Serial.print(alim_5);
Serial.print("_");
Serial.print(alim_12);
Serial.print("_");
Serial.print(alim_ext);
}
else {
Serial.print(temp_cpu);
Serial.print("_");
Serial.print(temp_out);
Serial.print("_");
Serial.print(temp_in);
Serial.print("|");
Serial.print("no_hum");
Serial.print("_");
Serial.print("no_hum");
Serial.print("_");
Serial.print("no_hum");
Serial.print("|");
Serial.print(alim_5);
Serial.print("_");
Serial.print(alim_12);
Serial.print("_");
Serial.print(alim_ext);
}
Serial.println();
}