Σελίδα 1 από 2 1 2 ΤελευταίαΤελευταία
Εμφάνιση αποτελεσμάτων : 1 έως 10 από 12

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

  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.382

    Προεπιλογή

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

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

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

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

  7. #7
    Μέλος Το avatar του χρήστη SProg
    Όνομα
    Σάββας
    Εγγραφή
    Mar 2014
    Περιοχή
    Θεσσαλονίκη
    Μηνύματα
    2.612

    Προεπιλογή

    Δε φαίνεται στο σήμα που ανέβασες η βάση χρόνου. Θα μπορούσες και με καταστάσεις:

    Κώδικας:
    #define STATE_RESET  0
    #define TOTAL_STATES 4
    
    
    const int ledPin =  LED_BUILTIN;
    
    
    struct SignalStatesStruct
    {  
      char  Level;
      int   Period;
    };
    struct SignalStatesStruct Signal_Current_State[TOTAL_STATES] = {{HIGH ,0},
                                                                   {LOW  ,20}, 
                                                                   {HIGH ,10},  
                                                                   {LOW  ,40}};
    unsigned long       previousMillis = 0;        
    unsigned long       currentMillis  = 0;
    unsigned char       SIGNAL_TRIGGER     = 0;
    unsigned char       SIGNAL_STATE       = STATE_RESET;
    
    
    void setup() 
    {
      currentMillis   = millis();     
      previousMillis  = currentMillis;
      pinMode(ledPin, OUTPUT);
    }
    
    
    void loop() 
    {  
      currentMillis = millis();
      if(SIGNAL_TRIGGER) 
      {
        if(currentMillis >= (previousMillis + Signal_Current_State[SIGNAL_STATE].Period)) 
        {
          previousMillis  = currentMillis;
          Inc_State();
        }  
      }  
      digitalWrite(ledPin, Signal_Current_State[SIGNAL_STATE].Level); 
    }
    
    
    void Inc_State(void)
    {
      SIGNAL_STATE++;
      if(SIGNAL_STATE >= TOTAL_STATES) 
      { 
          previousMillis  = currentMillis;
          SIGNAL_TRIGGER = 0;
          SIGNAL_STATE   = STATE_RESET;
      }
    }
    Η χρονική περίοδος ανά κατάσταση είναι τυχαία, έτσι για το παράδειγμα και μόνο.

    1 Not allowed! Not allowed!

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

    Προεπιλογή

    Καταρχην σε ευχαριστω πολυ για τον κωδικα που εφτιαξες.
    Τον δοκιμασα,εβαλα και τον λογικο αναλυτη αλλα δεν μου βγαζει κατι.

    Παράθεση Αρχικό μήνυμα από SProg Εμφάνιση μηνυμάτων
    Δε φαίνεται στο σήμα που ανέβασες η βάση χρόνου.
    Κατι φωτο που ειχα κρατησει

    φωτο1

    φωτο2

    φωτο3

    0 Not allowed! Not allowed!

  9. #9
    Μέλος Το avatar του χρήστη SProg
    Όνομα
    Σάββας
    Εγγραφή
    Mar 2014
    Περιοχή
    Θεσσαλονίκη
    Μηνύματα
    2.612

    Προεπιλογή

    Δε θα σου βγαλει αν δε κανεις Trigger με SIGNAL_TRIGGER = 1;

    Αν θες να τρέχει συνέχεια βάλει στην αρχή του Loop το
    SIGNAL_TRIGGER = 1; και όριζε και μια περίοδο για το πρώτο State (στο παράδειγμα είναι 0).

    Δεν εχω Arduino για να το δοκιμασω, κοιτα το σαν λογικη.

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

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

    Προεπιλογή

    Ενταξει μια χαρα δουλευει το προγραμμα σου,σε ξανα ευχαριστω.
    Να σε ρωτησω και κατι αλλο,εκτος απο αυτον τον τροπο με τις καταστασεις υπαρχουν και αλλοι τροποι??
    Σε ρωτα γιατι εγω προσπαθουσα με κατι τετοιο να το κανω αλλα δεν τα καταφερα,υπαρει περιπτωση να βγαινει??

    0 Not allowed! Not allowed!

Σελίδα 1 από 2 1 2 ΤελευταίαΤελευταία

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

  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: εκτός λειτουργίας