Advertisement
Experimentboy

Bluetooth DS18B20 - ExperimentBoy

Jul 30th, 2018
13,892
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.23 KB | None | 0 0
  1. /*
  2.  * Alimentation du module via 5V
  3.  * PINs EN et STATE inutiles
  4.  * PIN RX sur TX1 arduino (Mega)
  5.  * PIN TX sur RX1 Arduino (Mega)
  6.  * Pour utiliser avec un NANO, suivre le tuto dans la vidéo bonus: https://youtu.be/iC564i0wf0k
  7.  */
  8.  
  9.  /*
  10.   * Pour entrer en configuration du module, il faut l'alimenter en même temps qu'on appuie sur le bouton OU qu'on envoie 5V dans EN, même chose
  11.   * Liste des commandes: https://www.teachmemicro.com/hc-05-bluetooth-command-list/
  12.   * On envoie un code vide dans l'Arduino, et on relie le RX du HC au RX0 (celui du port usb) de l'arduino, TX même chose
  13.   * Dans le moniteur série: 38400 baudrate, et Les deux, NL et RC
  14.   * Envoyer "AT" signifie début de commande. On envoie AT jusqu'à ce qu'il renvoie "OK"
  15.   * AT+NAME=<paramètre> change le nom visible du module (sans les <>)
  16.   * AT+NAME=? affiche le nom
  17.   * AT+PSWD=<code> Change le code pin de connexion
  18.   * AT+PSWD? Affiche le code
  19.   * AT+ROLE=<0,1>, 0= esclave, 1= master
  20.   * AT+UART? Affiche le baudrate, le Stop bit, la Parité (défaut= 9600,0,0)
  21.   * AT=UART=<param1>,<param2>,<param3> Configure ces variables, surtout pour changer le baudrate
  22.   * AT+PAIR=<Param1>,<Param2>  Param1:Device Address Param2:Time out
  23.   * AT+LINK=<Param> param = addresse, pour connecter à un appareil par son addresse
  24.   */
  25.  
  26.   /*
  27.    * Pour la sonde à température DS18B20:
  28.    * Connecter le Rouge au +3.3 ou +5V, le noir au GND, le jaune sur un pin Data
  29.    * IMPORTANT: Connecter une résistance de 4.7K entre le jaune et le rouge.
  30.    */
  31.  
  32. #include <OneWire.h>
  33. #include <DallasTemperature.h>
  34. #include <SoftwareSerial.h>
  35.  
  36. SoftwareSerial SerialB(10, 11); // RX | TX Création d'un port série virtuel pour communiquer avec le module (OBLIGATOIRE sur arduino NANO quand on veut faire les commandes AT !!! On ne peut pas utiliser les pins RX et TX, sur Uno et Mega c'est ok)
  37.  
  38.  
  39. #define pin_ds 2//Pin jaune de la sonde
  40. #define pin_relay 5
  41. #define pin_button 7
  42.  
  43. #define temp_hysteresis 2 //degrés d'écart pour l'hystérésis du déclenchement de la pompe par température
  44.  
  45. //Création d'une instance oneWire pour communiquer avec la sonde
  46. OneWire oneWire(pin_ds);
  47.  
  48. //On passe cette instance dans Daaaaaaallaaaaaaaas♪♫
  49. DallasTemperature sensor(&oneWire);
  50.  
  51. float temp_water = 0.0, temp_water_up = 0.0, temp_water_down = 0.0;
  52.  
  53. const char mode_on = 'M', mode_off = 'm', mode_prog = 'P', mode_temp = 'T';
  54. char mode = mode_off;
  55.  
  56. unsigned long t_start, t_measure = 0, measure_interval = 5000, prog_duration;
  57.  
  58.  
  59. void setup() {
  60.   SerialB.begin(38400);
  61.   sensor.begin();
  62.  
  63.   pinMode(pin_relay,OUTPUT);
  64.   pinMode(pin_button,INPUT_PULLUP);
  65.  
  66.   digitalWrite(pin_relay, 0);
  67.  
  68. }
  69.  
  70. void loop() {
  71.   if(SerialB.available())
  72.   {
  73.     char mode_char = SerialB.read();
  74.     switch (mode_char)
  75.     {
  76.         case mode_on:
  77.         {
  78.             mode = mode_on;
  79.             break;
  80.         }
  81.         case mode_off:
  82.         {
  83.             mode = mode_off;
  84.             break;
  85.         }
  86.         case mode_prog:
  87.         {
  88.             mode = mode_prog;
  89.             t_start = millis();
  90.             char buffer[SerialB.available()];
  91.             String data="";
  92.             while(SerialB.available())
  93.                 {
  94.                     delay(1); // Pour ne pas lire plus vite que ce que les caractères arrivent
  95.                     data+= char(SerialB.read()); //On récupère tous les catactères qui suivent le paramètre mode_prog, qui sera le nombre de minutes à activer la pompe
  96.                 }
  97.             prog_duration = data.toInt() * 60000;
  98.             break;
  99.         }
  100.        
  101.         case mode_temp:
  102.         {
  103.             mode = mode_temp;
  104.             char buffer[SerialB.available()];
  105.             String data="";
  106.             while(SerialB.available())
  107.                 {
  108.                     delay(1);
  109.                     data+= char(SerialB.read()); //On récupère tous les catactères qui suivent le paramètre mode_temp, qui sera la température seuil
  110.                 }
  111.             temp_water_up = data.toInt();
  112.             temp_water_down = temp_water_up - temp_hysteresis;
  113.             break;
  114.         }
  115.     }
  116.   }
  117.    
  118.     if(!digitalRead(pin_button))
  119.     {
  120.         //Si on appuie sur le bouton, on change l'état de la pompe et on force le passage au mode on ou off, on arrête le mode de programmation ou le mode température
  121.         if(digitalRead(pin_relay)) mode = mode_off;
  122.        
  123.         else mode = mode_on;
  124.        
  125.         //digitalWrite(pin_relay,(!digitalRead(pin_relay)));
  126.        
  127.         while(!digitalRead(pin_button)){} //anti-rebond
  128.         delay(50);
  129.     }
  130.    
  131.     if (mode == mode_prog)
  132.     {
  133.         //Dans le cas où l'on vient de lancer une programmation pour x minutes, on lance la pompe et on vérifie
  134.         if(millis()>t_start+prog_duration)
  135.         {
  136.             mode = mode_off;
  137.             digitalWrite(pin_relay,0);
  138.         }
  139.         else
  140.         digitalWrite(pin_relay,1);
  141.     }
  142.    
  143.    
  144.     else if (mode == mode_off) digitalWrite(pin_relay,0);
  145.    
  146.     else if(mode == mode_on) digitalWrite(pin_relay,1);
  147.    
  148.     if(millis() > t_measure + measure_interval)
  149.     {
  150.         //On lance un appel à lire la température tous les measure_interval, pour éviter l'envoi permanent étant donné que la lecture de la temp prend du temp -> cela retarderait la réactivité des autres fonctions
  151.         t_measure = millis();
  152.         sensor.requestTemperatures();
  153.         temp_water = sensor.getTempCByIndex(0); //Ici, on lit à l'index 0 de sensor la valeur de la température (l'index change si on utilise plusieurs capteurs, mais alors là démerdez-vous, je sais pas faire, j'ai fait copier coller)
  154.        
  155.         String temp_water_message = "*t";
  156.         temp_water_message += String(temp_water);
  157.        
  158.         SerialB.print(temp_water_message);  
  159.            
  160.         if(mode==mode_temp)
  161.         {
  162.             if(temp_water >= temp_water_up)
  163.             {
  164.                 //On attend de descendre sous le seuil temp_water_down pour la couper. Cela crée une hystérésie, et évite qu'elle s'allume, éteigne, allume, éteigne...
  165.                 digitalWrite(pin_relay,1);
  166.             }
  167.             else if(temp_water <= temp_water_down)
  168.                 digitalWrite(pin_relay,0);
  169.         }
  170.     }
  171. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement