Advertisement
DuboisP

Nano_Ventirad4_Potard_Display

Nov 8th, 2024 (edited)
205
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.10 KB | Source Code | 0 0
  1. /* REQUIRES the following Arduino libraries:
  2.    - Adafruit GFX graphics core lib: https://github.com/adafruit/Adafruit-GFX-Library
  3.    - Adafruit OLED mono displays lib: libray https://github.com/adafruit/Adafruit_SSD1306
  4.  
  5.    tutos et références
  6.    https://www.carnetdumaker.net/articles/faire-un-tachymetre-avec-une-carte-arduino-genuino-pour-lire-la-vitesse-de-rotation-dun-ventilateur-de-pc/
  7.    
  8.    brochage Ventirad4 : GND, VCC, Tachymeter, PWM
  9.    PWM on : 3 5 6 9 10 11  https://docs.arduino.cc/tutorials/generic/secrets-of-arduino-pwm/
  10.                            https://passionelectronique.fr/pwm-arduino/
  11.                            PWM 976.56 Hz D5 D6
  12.                            PWM 490.20 Hz D3 D9 D10 D11
  13.  
  14.    Arduino Nano
  15.    display SSD1306 128*32
  16.    potentiomètre 10kOhm
  17.    résistance 10kOhm
  18.    diode 1N4007 ou 1N4148 peut être nécessaire sur l'entrée D2, selon le type de ventilateur
  19.    régulateur de tension LM2596D peut être nécessaire, selon le type d'alimentation de l'arduino nano
  20.    VentiRAD 4 fils (CPU cooler) : FOXCONN PUA080G12Q 900-4600 RPM
  21.       données à ajuster selon le VentiRAD
  22.       une régulation interne le fait tourner au ralenti quand PWM est remis à 0. On pourrait ajouter un relais.
  23. */
  24.  
  25. #include "time.h"
  26. #include <Adafruit_GFX.h>
  27. #include <Adafruit_SSD1306.h>
  28. #include <Wire.h>
  29.  
  30. // Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
  31. // The pins for I2C are defined by the Wire-library.
  32. // On an arduino UNO or Nano:       A4(SDA), A5(SCL)
  33. #define SCREEN_WIDTH 128                        // OLED display width, in pixels
  34. #define SCREEN_HEIGHT 32                        // OLED display height, in pixels
  35. #define OLED_RESET    -1                        // Reset pin # (or -1 if sharing Arduino reset pin)
  36. #define SCREEN_ADDRESS 0x3C                     //< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
  37. Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
  38.  
  39. #define Tach_detection_pin 2                    // digital inp
  40. #define analogInPin     A0                      // Analog input pin that the potentiometer is attached to
  41. #define PWMOutputPin    5
  42. #define HDD_MAXRPM      4600                    // à modifier selon le ventilateur
  43. #define baudrateSerial  115200                  // vitesse communication Arduino - PC  
  44.  
  45. volatile float Tach_time;
  46. volatile float Tach_last_time = 0;
  47. unsigned long start_time4min, start_time4sec;
  48. unsigned int plannedRPM, sentRPM;
  49. unsigned long realRPM;
  50. bool bDisplay = false;
  51.  
  52. // déclarations anticipées de fonctions
  53. // void(* resetFunc) (void) = 0;                   // déclaration de la fonction interne Reset de l'arduino
  54. bool SSD_init(void);
  55. void SSD_display(void);
  56.  
  57.  
  58. void setup() {
  59.    // initialize Tach pins
  60.    pinMode(Tach_detection_pin, INPUT_PULLUP);
  61.    attachInterrupt(digitalPinToInterrupt(Tach_detection_pin), onTach_Event, FALLING);  // RISING FALLING
  62.    
  63.    analogReference(DEFAULT);           //(EXTERNAL);
  64.    pinMode(analogInPin,INPUT);
  65.  
  66.    // analogWriteResolution();
  67.    pinMode(PWMOutputPin, OUTPUT);
  68.    
  69.    bDisplay = SSD_init();
  70.    //Serial.begin(baudrateSerial);
  71. }
  72.  
  73. void onTach_Event() {
  74.    unsigned long _Time = micros();
  75.    Tach_time = _Time - Tach_last_time;
  76.    Tach_last_time = _Time;
  77. }
  78.  
  79. void loop(){
  80.    unsigned int sensorValue = 0;
  81.    
  82.    for (int i = 0; i < 16; i++){
  83.     // Read light sensor data.
  84.     sensorValue = sensorValue + analogRead(analogInPin);
  85.     // 1ms pause adds more stability between reads.
  86.     delay(5);
  87.    }
  88.    // Take an average of all the readings.
  89.    sensorValue = sensorValue / 16;
  90.    plannedRPM = map(sensorValue, 0, 1023, 0, HDD_MAXRPM * 1.005);    // 1.005 car tolérance dans le nombre de RPM :-)
  91.    sentRPM = map(sensorValue, 0, 1023, 0, 255);
  92.    analogWrite(PWMOutputPin, sentRPM);
  93.      
  94.    if (Tach_time > 0){
  95.       realRPM = 60 * 1000000.0 / Tach_time / 2 ;            // diviseur à modifier selon le ventilateur
  96.    }
  97.    if (bDisplay) SSD_display();
  98.    delay(200);
  99. }
  100.  
  101. bool SSD_init(void){
  102.    // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
  103.    if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3C for 128x32
  104.       Serial.println(F("SSD1306 allocation failed"));
  105.       for(;;); // Don't proceed, loop forever
  106.    }
  107.    // Show initial display buffer contents on the screen --
  108.    // the library initializes this with an Adafruit splash screen.
  109.    display.display();
  110.    display.cp437(true);                         // Use full 256 char 'Code Page 437' font
  111.    display.setTextColor(SSD1306_WHITE);         // Draw white text
  112.    delay(1000);
  113.    return true;
  114. }
  115.  
  116. void SSD_display(){
  117.    static char buffer[18];
  118.    
  119.    display.setTextSize(1);                      // Normal 1:1 pixel scale
  120.    display.clearDisplay();                      // Clear the buffer
  121.  
  122.    sprintf(buffer,"Set RPM : %4d", plannedRPM);
  123.    display.setCursor(0,0);                      // Start at left-top corner
  124.    display.print(buffer);  
  125.  
  126.    sprintf(buffer,"real RPM: %4d", realRPM);
  127.    display.setCursor(0,20);                    
  128.    display.print(buffer);
  129.      
  130.    display.display();
  131. }
  132.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement