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

Θέμα: Βοήθεια σε κώδικα για Arduino

Hybrid View

Προηγούμενο μήνυμα Προηγούμενο μήνυμα   Επόμενο Μήνυμα Επόμενο Μήνυμα
  1. #1
    Μέλος
    Όνομα
    Στράτος
    Εγγραφή
    Oct 2004
    Περιοχή
    Χανιά
    Μηνύματα
    526

    Προεπιλογή Βοήθεια σε κώδικα για Arduino

    Καλησπέρα. Προσπαθώ να φτιάξω ένα στροφόμετρο με arduino kai 7segment και hall effect sensor. Πήρα τον κώδικα από δύο διαφορετικά σχέδια και τον ένωσα. Ενώ σαν αυτόνομος ο καθ' ένας δουλεύει σωστά , μετά την ένωση μου παρουσιάζει το εξής.
    Ρολάρει το το κάθε segment ανά δευτερόλεπτο. Αν αλλάξω το const unsigned long sampleTime = 1000 σε 10 τότε στρώνει αρκετά αλλά δεν κρατάει την τιμή.


    Κώδικας:
     #include "SevSeg.h"
    SevSeg sevseg;
    int hallSensorPin = 10;                      // connect the hall effect sensor on pin 10
    const unsigned long sampleTime = 1000;
    const int maxRPM = 1260;                  // maximum RPM for LCD Bar
    int rpmMaximum = 0;
    
    void setup() 
    {
      byte numDigits = 3;
      byte digitPins[] = { 11, 12, 13};
      byte segmentPins[] = {9, 2, 3, 5, 6, 8, 7, 4};
      bool resistorsOnSegments = true;
      byte hardwareConfig = COMMON_CATHODE;
    
      sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments);
    }
    
    void loop() 
    {
      delay(100);
      int rpm = getRPM();
      if (rpm > rpmMaximum) rpmMaximum = rpm;
    
        sevseg.setNumber(rpm, 2);
      
    
      sevseg.refreshDisplay();
    }
    int getRPM()
    {
      int count = 0;
      boolean countFlag = LOW;
      unsigned long currentTime = 0;
      unsigned long startTime = millis();
      while (currentTime <= sampleTime)
      {
        if (digitalRead(hallSensorPin) == HIGH)
        {
          countFlag = HIGH;
        }
        if (digitalRead(hallSensorPin) == LOW && countFlag == HIGH)
        {
          count++;
          countFlag=LOW;
        }
        currentTime = millis() - startTime;
      }
      int countRpm = int(60000/float(sampleTime))*count;
      return countRpm;
    }
    Τα site είναι
    http://www.circuitbasics.com/arduino...play-tutorial/ (για τα segment)
    Και
    https://create.arduino.cc/projecthub...counter-253ac0 (για τον sensora)

    Καμιά βοήθεια;

    0 Not allowed! Not allowed!

  2. #2
    Μέλος Το avatar του χρήστη Fire Doger
    Όνομα
    Στέφανος
    Εγγραφή
    Jan 2015
    Περιοχή
    .
    Μηνύματα
    1.519

    Προεπιλογή

    Τα 7segment υπάρχουν πολλοί τρόποι να τα οδηγήσεις (ανάλογα και με το πακέτο ή την πλακέτα), ο ποιο συνηθισμένος είναι το scan, δηλαδή 1-1 την φορά πολύ γρήγορα έτσι ώστε με το μεταίσθημα να νομίζεις ότι είναι όλα μαζί αναμμένα, χρησιμοποιείς λιγότερα pin απ' το arduino και έχεις και μικρότερη κατανάλωση.

    Κανονικά έχεις έναν Timer για γενική χρήση συνήθως και εκεί μέσα χώνεις και τον driver για τα seven segment.
    Η συγκεκριμένη βιβλιοθήκη το κάνει χειροκίνητα με την .refreshDisplay(); την οποία και πρέπει να καλείς συνέχεια πολύ γρήγορα!

    Εσύ για 1 λεπτό περιμένεις μέσα σε μια while.

    Οι βασικές λύσεις είναι 3
    1. θα καλείς την refresh και μέσα στην while
    2. Θα αφαιρέσεις την while
    3. Θα βάλεις την scan σε interrupt από Timer


    *Και η μέτρηση συχνότητας είναι λάθος έτσι, οι AVR έχουν συγκεκριμένη λειτουργία (Input Capture) η οποία είναι για την μέτρηση συχνότητας, στις χαμηλές μετράς χρόνο από παλμό σε παλμό ενώ στις υψηλές μετράς παλμούς ανά μονάδα χρόνου (όπου μονάδα εξαρτάται απ' το σφάλμα που επιθυμείς)

    2 Not allowed! Not allowed!

  3. #3
    Μέλος
    Όνομα
    Στράτος
    Εγγραφή
    Oct 2004
    Περιοχή
    Χανιά
    Μηνύματα
    526

    Προεπιλογή

    Παράθεση Αρχικό μήνυμα από Fire Doger Εμφάνιση μηνυμάτων
    .............
    Η συγκεκριμένη βιβλιοθήκη το κάνει χειροκίνητα με την .refreshDisplay(); την οποία και πρέπει να καλείς συνέχεια πολύ γρήγορα!

    Εσύ για 1 λεπτό περιμένεις μέσα σε μια while. 1 δευτερόλεπτο εννοείς

    Οι βασικές λύσεις είναι 3
    1. θα καλείς την refresh και μέσα στην while Βελτιώθηκε αρκετά. Τώρα μένουν και τα τρία αναμμένα με την μέτρηση, απλά κάνουν ένα φλασάρισμα κάθε δευτερόλεπτο, στην αλλαγή της μέτρησης
    2. Θα αφαιρέσεις την while
    3. Θα βάλεις την scan σε interrupt από Timer


    *Και η μέτρηση συχνότητας είναι λάθος έτσι, οι AVR έχουν συγκεκριμένη λειτουργία (Input Capture) η οποία είναι για την μέτρηση συχνότητας, στις χαμηλές μετράς χρόνο από παλμό σε παλμό ενώ στις υψηλές μετράς παλμούς ανά μονάδα χρόνου (όπου μονάδα εξαρτάται απ' το σφάλμα που επιθυμείς) Έχεις κάποιο παράδειγμα; Εγώ θα το κάνω να μετράει έξι σημεία σε κάθε περιστροφή.
    Πάντως και έτσι είμαι αρκετά ικανοποιημένος. Σ' ευχαριστώ.

    0 Not allowed! Not allowed!

  4. #4
    Μέλος Το avatar του χρήστη Fire Doger
    Όνομα
    Στέφανος
    Εγγραφή
    Jan 2015
    Περιοχή
    .
    Μηνύματα
    1.519

    Προεπιλογή

    Ναι δευτερόλεπτο είναι...

    Επειδή έχεις την delay(100); είναι το φλασάρισμα.

    Είναι δύσκολο, αν δεν ξέρεις από interrupt και timer κάντο όπως μπορείς.

    1 Not allowed! Not allowed!

  5. #5
    Μέλος
    Όνομα
    Στράτος
    Εγγραφή
    Oct 2004
    Περιοχή
    Χανιά
    Μηνύματα
    526

    Προεπιλογή

    Τέλειο. To delay(100) το έκανα delay(1), και δεν φλασάρει. Και απ' ότι δείχνει δεν έχει πρόβλημα στον πάγκο επάνω. Όταν το βάλω στο τρυπάνι που θέλω, θα δω και στην πράξη.
    Ευχαριστώ για τις συμβουλές σου.

    0 Not allowed! Not allowed!

  6. #6
    Μέλος Το avatar του χρήστη thanasis 1
    Όνομα
    Θανάσης
    Εγγραφή
    Jul 2010
    Περιοχή
    ΑΘΗΝΑ
    Μηνύματα
    1.387

    Προεπιλογή

    Αφου λυθηκε το προβλημα που ειχα σχετικα με τα σηματα που επερνα απο τον μικροελεγκτη τωρα ας παμε παρακατω.
    Θελω να αναπαραγω το σημα αυτο

    https://imgur.com/a/3wuYKJE

    Με την χρηση delay ειναι ενας ευκολος τροπος να τον δημιουργησεις αλλα οχι τοσο αποδοτικος αν θες να μην υπαρχουν καθυστερισεις στο κυριο προγραμμα.
    Προσπαθησα με βαση το παραδειγμα BlinkWithoutDelay να δημιουργησω αυτο το σημα αλλα δεν τα καταφερα.Με αυτην την λογικη ομως δεν μπορει να γινει??
    Υπαρχουν και αλλοι τροποι??

    0 Not allowed! Not allowed!
    Τελευταία επεξεργασία από το χρήστη thanasis 1 : 09-05-19 στις 19:03

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

  1. Απαντήσεις: 82
    Τελευταίο Μήνυμα: 10-04-17, 20:21
  2. Βοήθεια σε κώδικα για menu 16x2 + array values + alarms
    By hackertom in forum Μικροελεγκτές
    Απαντήσεις: 7
    Τελευταίο Μήνυμα: 29-04-16, 10:19
  3. Βοήθεια σε κώδικα Arduino
    By ΚΩΣΤΑΣ2 in forum Μικροελεγκτές
    Απαντήσεις: 12
    Τελευταίο Μήνυμα: 27-02-16, 22:03
  4. Απαντήσεις: 14
    Τελευταίο Μήνυμα: 09-01-13, 17:54
  5. Απαντήσεις: 2
    Τελευταίο Μήνυμα: 24-03-12, 23:32

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

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