Εμφάνιση αποτελεσμάτων : 1 έως 5 από 5

Θέμα: ΕΡΩΤΗΣΗ ΓΙΑ ΚΩΔΙΚΑ RPM PC FAN

  1. #1
    Νέο Μέλος
    Όνομα
    Ιορδάνης
    Εγγραφή
    Feb 2022
    Περιοχή
    αθήνα
    Μηνύματα
    3

    Προεπιλογή ΕΡΩΤΗΣΗ ΓΙΑ ΚΩΔΙΚΑ RPM PC FAN

    καλησπέρα και απο εμένα..
    με αφορμή αυτό το βίντεο προσπαθώ να φτιάξω ένα απλό κύκλωμα με 2 κουμπια και μία οθόνη που να setαρει με το upbutton ανα 51 rpm μέχρι το 255 και να φένεται η ταχύτητα του ανεμιστήρα.

    Dashboard | Tinkercad

    setarisma pc fan.jpg
    Κώδικας:
    #include <LiquidCrystal.h>
    
    
    // initialize the library with the numbers of the interface pins
    LiquidCrystal lcd(12, 11, 5, 4, 3, 8);
    
    
    //gia count
    const byte upButtonPin = 7;
    const byte downButtonPin = 6;
    int buttonPushCounter = 0;
    byte upButtonState = HIGH;
    byte downButtonState = HIGH;
    byte prevUpButtonState = HIGH;
    byte prevDownButtonState = HIGH;
    //gia pwm
    const int fan_control_pin = 9; // blue wire
    int count = 0;
    unsigned long start_time;
    int rpm;
    int pwm = 0;
    
    
    
    
    void setup() {
     //lcd.init();                      // initialize the lcd 
      Serial.begin(9600);
      pinMode(upButtonPin, INPUT_PULLUP);
      pinMode(downButtonPin, INPUT_PULLUP);
      pinMode(fan_control_pin, OUTPUT);
      analogWrite(fan_control_pin, 0);
      attachInterrupt(digitalPinToInterrupt(2), counter, RISING);
    }
    
    
    void loop() {
     
      upButtonState = digitalRead(upButtonPin);
      if ((upButtonState != prevUpButtonState) && (pwm <255))
      {
        if (upButtonState == LOW)
        {
          pwm+=51;
          Serial.println(pwm);
        }
        delay(50);
        
        analogWrite(fan_control_pin, pwm);  
      delay(100);
        
          start_time = millis();
        count = 0;
       while((millis() - start_time) < 1000){
       }
        rpm = count * 30 / 2;
      
     
       Serial.print("PWM = ");
       Serial.print(map(pwm, 0, 255, 0, 100));
       Serial.print("%, speed =");
        Serial.print(rpm);
        Serial.println(" rpm");
             lcd.begin(16,2);
             // Print a message to the LCD.
              lcd.clear();
              lcd.setCursor(0,0);
              lcd.print("pwm= ");
              lcd.print(map(pwm, 0, 255, 0, 100));
              lcd.print("%");
              lcd.setCursor(0,1);
              lcd.print("Speed = ");
              lcd.print(rpm);
      }
      prevUpButtonState = upButtonState;
      
      downButtonState = digitalRead(downButtonPin);
      if (downButtonState != prevDownButtonState && (pwm<=255) && (pwm>0))
      {
        if (downButtonState == LOW)
        {
          pwm-=51;
          Serial.println(pwm);
        }
        prevDownButtonState = downButtonState;
        delay(50);
    
    
      analogWrite(fan_control_pin, pwm);  
      delay(100);
       
        start_time = millis();
        count = 0;
       while((millis() - start_time) < 1000){
       }
        rpm = count * 30 / 2;
      
       Serial.print("PWM = ");
       Serial.print(map(pwm, 0, 255, 0, 100));
       Serial.print("%, speed=");
        Serial.print(rpm);
        Serial.println(" rpm");
       ;
             lcd.begin(16,2);
             // Print a message to the LCD.
              lcd.clear();
              lcd.setCursor(0,0);
              lcd.print("pwm= ");
              lcd.print(map(pwm, 0, 255, 0, 100));
              lcd.print("%");
              lcd.setCursor(0,1);
              lcd.print("Speed = ");
              lcd.print(rpm);
              
      }
    }
      void counter() {
       count++;
          
    }
    μπωρείτε να ρίξετε καμιά διόρθωση ?

    0 Not allowed! Not allowed!
    Τελευταία επεξεργασία από το χρήστη iordanhsp : 09-02-22 στις 10:15

  2. #2
    Μέλος
    Όνομα
    Νίκος
    Εγγραφή
    Feb 2014
    Περιοχή
    Μοσχάτο
    Μηνύματα
    607

    Προεπιλογή

    Καλημέρα και σε εσένα!

    Τι συφερτός είναι αυτός!!!
    Τι να πρωτοπιάσεις...

    Απο πανω προς τα κάτω:
    - Βάζεις interrupt αλλά δεν υπάρχει ρουτίνα να το εξυπηρετεί... Επίσεις δεν φαίνετε τίποτα συνδεμένο στο pin του interrupt, αλλά ούτε και αρχικοποιείτε...
    - Βάζεις delay και μετά κάνεις και ένα while που δεν κάνει τίποτα (άρα και άλλο delay).
    - To rpm θα δείχνει πάντα 0. Το count δεν αλλάζει ποτέ (υποθέτω ότι ο δημιουργός του κώδικα το άλλασε μέσα στην ISR)
    - η αλλαγή του upbuttonstate πρέπει να γίνει μέσα στον if και όχι έξω απο αυτό...

    Αυτα με μια πρόχειρη ματιά...

    0 Not allowed! Not allowed!
    Mastroxalastis / Μαστροχαλαστής
    https://www.youtube.com/channel/UCOWjSR-OOc-ZBCT61EX_lJg

  3. #3
    Νέο Μέλος
    Όνομα
    Ιορδάνης
    Εγγραφή
    Feb 2022
    Περιοχή
    αθήνα
    Μηνύματα
    3

    Προεπιλογή

    Καλημέρα και ευχαριστώ για την γρήγορη απάντηση. είμαι αρκετά αρχαριος και τώρα αρχιζω να μαθαίνω,
    ξέρω τα βασικα σχετικα με το προγραμματισμο απο την τρίτη λυκείου.

    στο pin 2 θα συνδέσω το κίτρινο καλώδιο και στο pin 9 το μπλε καλώδιο του ανεμιστήρα.

    ο κώδικας είναι μια τροποποίηση του κώδικα του βίντεο Arduino Fan Control using High Frequency 25kHz PWM // 4-Wire CPU Fans - YouTube.
    ο κώδικα είναι ίδιος με το βίντεο απλα έβαλα τα 2 κουμπια που θα πανε +51 και -51 μεχρι 255 και 0 αντιστοιχα το pwm.
    εχεις δίκιο για το delay και while rpm.

    Λοιπόν σε σχέση με τον κώδικα του βίντεο μπορείς να μου πείς τι έκανα λάθος στην προσθήκη ?

    0 Not allowed! Not allowed!
    Τελευταία επεξεργασία από το χρήστη iordanhsp : 10-02-22 στις 11:49

  4. #4
    Μέλος
    Όνομα
    Νίκος
    Εγγραφή
    Feb 2014
    Περιοχή
    Μοσχάτο
    Μηνύματα
    607

    Προεπιλογή

    Αυτό ήταν στον κώδικα απο την αρχή?
    Κώδικας:
      void counter() {
       count++;
          
    }
    Αν ήταν, τότε συγνώμη δεν το είχα δει. Ετσι θα μετράει τις στροφές. Θα αυξάνει το count κάθε φορά που θα περιστρέφετε ο ανεμιστήρας.

    Τώρα πλέον και το while χρειάζετε να είναι εκεί, χωρίς να κάνει τίποτα. Στον χρόνο που περιμένει το while θα εκτελέιτε η ISR (δηλαδή η ρουτίνα counter) και θα αυξάνει το count ώστε να μπορεί να υπολογίσει τον αριθμό στροφών.


    Ενα πρόβλημα που έχεις είναι ο έλεγχος της υπάρχουσας τιμής. Λες πχ στο if... &&(pwm<255) και μετά προσθέτεις +51. Αυτό δεν είναι σωστό. Θα μπορούσε ενδεχομένως να δουλέψει, αλλά πχ αν για οποιοδήποτε λόγο η τιμή ας πούμε του pwm είναι 230 τότε ναι μεν η συνθήκη θα είναι αληθής, θα μπεί στο if αλλά όταν θα προσθέσεις το +51 θα πάει πάνω απο το επιτρεπτό όριο.

    Καλύτερα θα είναι να βγάλεις τα && απο το if, και αμέσως μετά την πρόσθεση να κάνεις τον έλεγχο... πχ.


    Κώδικας:
    if (upButtonState != prevUpButtonState)
      {
        if (upButtonState == LOW)
        {
          pwm+=51;
          if (pwm > 255) pwm = 255;
          Serial.println(pwm);
        }
    Το ίδιο και για το down.

    Επίσης καλό θα ήταν να κάνεις και debounce. Δες τι είναι το debounce στο youtube και γιατί χρειάζετε...

    πχ.

    Κώδικας:
    int tempButtonState = digitalRead(upButton);
    delay(100);
    if (digitalRead(upButton) == tempButtonState) upButtonState = tempButtonState;
    .
    .
    .
    if (upButtonState != prevUpButtonState)
      {
        if (upButtonState == LOW)
        {
          pwm+=51;
          if (pwm > 255) pwm = 255;
          Serial.println(pwm);
        }
    Με αυτό τον τρόπο θα αποφύγεις φαινόμενα τύπου να αυξάνει/μειώνει την τιμή πολλάπλές φορές με ένα μόνο πάτημα.

    Επίσης ένα σημαντικό, δεν είχα χρόνο να δω το βίντεο, αλλά δες στο datasheet του fan τι τάσεις φεύγουν απο το sense καλώδιο (πράσινο) και τι τάση χρειάζετε στο pwm καλώδιο (μπλέ) και βεβαιώσου ότι είναι στα όρια του arduino. Το arduino δίνει μέχρι 5V στην έξοδο του PWM και μπορεί να δεχτεί μέχρι 5.1 περίπου στην είσοδο. Αν η έξοδος του fan στο sense είναι μεγαλύτερη (πχ 12) θα καταστρέψεις την είσοδο. Μπορεί όχι αμέσως, αλλά σίγουρα με τον καιρό...

    Καλή επιτυχία!

    1 Not allowed! Not allowed!
    Mastroxalastis / Μαστροχαλαστής
    https://www.youtube.com/channel/UCOWjSR-OOc-ZBCT61EX_lJg

  5. #5
    Νέο Μέλος
    Όνομα
    Ιορδάνης
    Εγγραφή
    Feb 2022
    Περιοχή
    αθήνα
    Μηνύματα
    3

    Προεπιλογή

    Λοιπον εχεις δικιο για το datasheet. ο ανεμιστήρας είναι ο Noctua NF-S12A PWM 120mm και εδώ τα χαρακτηριστικά. ο κώδικας βέβαια είναι για 490hz.

    έχω καταλήξει εδώ αφου προσθεσα όσα μου ειπατε.


    Κώδικας:
    #include <Wire.h> 
    #include <LiquidCrystal_I2C.h>
    #include <TroykaDHT.h>
    DHT dht(2, DHT11);
    LiquidCrystal_I2C lcd(0x27,20,4);
    #define TempPin A0
    //gia count
    const byte upButtonPin = 7;
    const byte downButtonPin = 6;
    int buttonPushCounter = 0;
    byte upButtonState = HIGH;
    byte downButtonState = HIGH;
    byte prevUpButtonState = HIGH;
    byte prevDownButtonState = HIGH;
    //gia debunce
    unsigned long lastBtnUp = 0;
    unsigned long lastBtnDwn = 0;
    int transInt = 50;
    //gia pwm
    const int fan_control_pin = 9; // Blue wire
    unsigned long start_time;
    int rpm;
    int pwm = 0;
    int count = 0;
    
    
    
    
    void setup() {
      lcd.init();
      lcd.init();                  
      lcd.backlight();
      lcd.print("Jordan v1.0");
      pinMode(TempPin, INPUT);
      pinMode(upButtonPin, INPUT_PULLUP);
      pinMode(downButtonPin, INPUT_PULLUP);
      pinMode(13, OUTPUT);
      pinMode(fan_control_pin, OUTPUT);
      analogWrite(fan_control_pin, 0);
      attachInterrupt(digitalPinToInterrupt(2), counter, RISING); // Green wire
    }
    
    
    void loop() {
      
     int temp = ((analogRead(TempPin) * (5.0/1024))-0.5 )/0.01;
     upButtonState = digitalRead(upButtonPin); 
     downButtonState = digitalRead(downButtonPin);
      
      
         if (upButtonState == HIGH and downButtonState == HIGH and pwm == 0)
         {
           digitalWrite(13, HIGH);
              lcd.begin(16,2);
              lcd.clear();
              lcd.setCursor(0,0);
              lcd.print("pwm= 0");
              lcd.print("%");
              lcd.print("   temp=");
              lcd.setCursor(0,1);
              lcd.print("Speed=0");
              lcd.print("    ");
              lcd.print(temp);
              delay(100);
         }
    
    
    
    
     upButtonState = digitalRead(upButtonPin); 
      if (upButtonState != prevUpButtonState)
      {
        if (millis() - lastBtnUp > transInt)
        {
          if (upButtonState == LOW)
          {
            if (pwm<255) 
            { 
              pwm+=51;
              analogWrite(fan_control_pin, pwm);
              printlcd();
            }
           }
          lastBtnUp = millis();
        }
          prevUpButtonState = upButtonState;
       }
    
    
       
      downButtonState = digitalRead(downButtonPin);
      if (downButtonState != prevDownButtonState)
      {
        if(millis() - lastBtnDwn > transInt)
        {
          if (downButtonState == LOW)
          {
            if (pwm<=255 and pwm>0) 
            {
              pwm-=51;   
              analogWrite(fan_control_pin, pwm);
              printlcd();
            }
           }
          lastBtnDwn = millis();  
        }
          prevDownButtonState = downButtonState;
       }       
      
        
    }
      void counter() {
        count++;
    }
    void printlcd() {
        int   temp = ((analogRead(TempPin) * (5.0/1024))-0.5 )/0.01;
           start_time = millis();
            count = 0;
            while((millis() - start_time) < 1000){
            }
              rpm = count * 30 / 2;
     
              lcd.begin(16,2);
              // Print a message to the LCD.
              lcd.clear();
              lcd.setCursor(0,0);
              lcd.print("pwm= ");
              lcd.print(map(pwm, 0, 255, 0, 100));
              lcd.print("%");
              lcd.print("   temp=");
              lcd.setCursor(0,1);
              lcd.print("Speed=");
              lcd.print(rpm);
              lcd.print("    ");
              lcd.print(temp);
      }
    εδω μια φώτο απο tinkercad σε απλη οθόνη χωρίς ανεμιστήρα.
    σχεδιο1.jpg
    συγνώμη για την αναστάτωση και την ταλαιπωρία. θα το δοκιμάσω αυριο. ευχαριστώ.

    Update:
    Δεν δουλευει το rpm το pwm ειναι ok.

    0 Not allowed! Not allowed!
    Τελευταία επεξεργασία από το χρήστη iordanhsp : 18-02-22 στις 15:01

Παρόμοια Θέματα

  1. Πτώση rpm σε 4 cable fan υπολογιστή.
    By hackertom in forum Ερωτήσεις Αρχάριων
    Απαντήσεις: 1
    Τελευταίο Μήνυμα: 26-09-17, 15:03
  2. Βοηθεια για Low rpm alarm
    By Johnny305 in forum Διάφορα Κυκλώματα
    Απαντήσεις: 6
    Τελευταίο Μήνυμα: 07-04-15, 18:54
  3. Ερωτηση για γνωση Arduino για πειραγμα κωδικα
    By diskjohn in forum Διάφορα Κυκλώματα
    Απαντήσεις: 7
    Τελευταίο Μήνυμα: 01-04-15, 16:18
  4. Πoιο κυκλωμα να υλοποιησω για Rpm meter?
    By herctrap in forum Κυκλώματα για Auto & Moto
    Απαντήσεις: 17
    Τελευταίο Μήνυμα: 04-06-10, 14:49
  5. Μέτρηση rpm toυ pc fan
    By QED in forum Μικροελεγκτές
    Απαντήσεις: 2
    Τελευταίο Μήνυμα: 02-10-04, 23:20

Δικαιώματα - Επιλογές

  • Δημιουργία θεμάτων: Όχι
  • Υποβολή μηνυμάτων: Όχι
  • Σύναψη αρχείων: Όχι
  • Επεξεργασία μηνυμάτων: Όχι
  •  
  • BB code: σε λειτουργία
  • Smilies: σε λειτουργία
  • [IMG]: σε λειτουργία
  • [VIDEO] code is σε λειτουργία
  • HTML: εκτός λειτουργίας