Φορτιστής Arduino με οθόνη. Μέτρηση τάσης με Arduino. Περαιτέρω εργασία στον μπροστινό πίνακα

Παλιό καλό "Rectifier"
φορτιστής B14"!
Πάντα ήσουν σαν σωτήρας:
Μας βοήθησε, αγαπητέ!

Στη ζέστη και το κρύο του χειμώνα
Αναζωογόνησε την μπαταρία.
Ακόμα κι αν έχω κρυώσει
Είστε σαν ένα ρομπότ Terminator!

Δεν έσπασε, δεν τα παράτησε
Ακόμα και στην πιο δύσκολη ώρα.
Όταν χρειαζόταν, ταραζόμουν,
Χρεώνοντας τα πάντα για εμάς.

Έχουν ήδη περάσει σαράντα χρόνια
Από την καλή εποχή του Μπρέζνιεφ,
Όταν το σώμα σου είναι σαν σώμα
Σφραγίστηκε στο εργοστάσιο.

Και από τότε υπηρετείτε καλά.
Είστε προς όφελος όλων των μηχανών,
Διαφορετικό από την Ένωση
Γιατί η αλήθεια είναι άφθαρτη.

Αλλά ήρθε η ώρα να αλλάξεις
Πέτα το βαρύ φορτίο του χρόνου,
Για να μπορέσεις να σηκωθείς,
Για να γίνει έξυπνος ο Χόκινγκ.

Αν ρωτήσει κανείς σε φαλτσέτο
"Πως μπορώ να το κάνω?" -
Μην ανησυχείς, το λέω
Σε αυτό το άρθρο θα σας πω.

Μια στιγμή εθισμού.

Χαιρετισμούς, αγαπητοί αναγνώστες! Μετά από ένα διάλειμμα σχεδόν τεσσάρων μηνών, επιστρέφω στις επιχειρήσεις και, ως αναφορά στη δουλειά που έγινε, θεωρώ απαραίτητο να γράψω αυτό το άρθρο. Σκέφτηκα πολύ καιρό από πού να ξεκινήσω, καλά, να μην δημοσιεύσω για τέταρτη φορά για μηδενική ορατότητα κ.λπ. - αυτό το απόσπασμα έχει ήδη λειτουργήσει για μένα τακτικά στα τρία τελευταία άρθρα, οπότε αυτό είναι αρκετό για αυτό - αφήστε το να πάει σε μια άξια ανάπαυσης! Λοιπόν, εν τω μεταξύ, θα χρησιμοποιήσω ένα νέο πειραματικό τέχνασμα, ας το ονομάσουμε "λεπτό εθισμού στα ναρκωτικά" - μια τόσο διασκεδαστική και χαλαρή στιγμή "γεια σας", που οδηγεί ομαλά στην κύρια ιδέα του άρθρου . 🙄

Έτσι, όπως ήδη αναφέρθηκε στο "λεπτό", σήμερα θα σας πω για το πώς έγινα αρχαίος Φορτιστήςαρχές της δεκαετίας του εβδομήντα σε ένα νέο, σύγχρονο, ελεγχόμενο από μικροελεγκτή. Αυτή η σκέψη μου ήρθε επειδή ο φίλος μου με κάλεσε για μια μπύρα ενώ η μπαταρία μου φορτιζόταν. Θα ήμουν ευτυχής να πάω, αλλά κακή τύχη - ο φορτιστής έπρεπε να παρακολουθείται συνεχώς! Τρέχετε σε αυτό μία φορά κάθε μισή ώρα, ή ακόμα πιο συχνά, για να ελέγχετε την τάση στην μπαταρία και αν υπερβαίνει το μέγιστο, μειώστε την ισχύ με τον κατάλληλο διακόπτη στον μπροστινό πίνακα. Συμφωνώ, δεν είναι βολικό: είστε συνεχώς αλυσοδεμένοι σε μια μπαταρία που φορτίζει και δεν μπορείτε να μετακινηθείτε πουθενά, και αν ξαφνικά χάσετε την κατάλληλη στιγμή, η μπαταρία δεν θα σας ευχαριστήσει. Από την άλλη, δεν θα το πει πάντως: είναι ένα μνημείο που δεν ξέρει να μιλάει))))

Εκτός από τα αστεία, από καιρό ήθελα να κάνω κάτι σοβαρό στο Arduino, το οποίο γνώρισα τον Νοέμβριο, παίρνοντας ένα πολύτιμο πακέτο από τους Κινέζους από την Aliexpress με μικροελεγκτή, ασπίδα και άλλα καλούδια στο ταχυδρομείο. Και εδώ είναι, μια μεγάλη ευκαιρία - πάρτε το και κάντε το! Το πήρα λοιπόν και άρχισα να το κάνω κατευθείαν!

Κύκλωμα φορτιστή

Αρχικά, θα σας δώσω ένα διάγραμμα με δυνατότητα κλικ της τελικής συσκευής:

Κατάλογος των κύριων εξαρτημάτων

  • 8 πυκνωτές: 2 από 22 pF, 1 από 100 pF, μερικά κομμάτια των 100 mF και για τροφοδοσία - ένας μεγάλος των 6,3 βολτ και δύο μεγάλοι των 16, για παράδειγμα, και 1500 mF, αντίστοιχα (όλα μπορούν να είναι 16 βολτ ή περισσότερο, δεν έχει σημασία).
  • Προγραμματιζόμενος μικροελεγκτής Atmega328 με χαλαζία 16 MHz και κατά προτίμηση ασπίδα για αυτόν (μετακινήστε μερικές σελίδες στην πρώτη ασπίδα, αυτή θα είναι η φθηνότερη επιλογή) για να κάνετε το φλας βολικό.
  • Για τον ίδιο λόγο - υποδοχές σύσφιξης για το προαναφερθέν μικροκύκλωμα. Αν και μπορείτε να τα βγάλετε πέρα ​​με τα κανονικά ως οικονομική επιλογή. Λοιπόν, ή κολλήστε τα καλώδια στο MK και αναβοσβήστε τα με άλλο Arduino ή φλας - όπως προτιμάτε.
  • 9 τρανζίστορ KT315 και 1 KT815 (ή ανάλογα) - χωρίς συγκόλληση από οποιονδήποτε παλιό σοβιετικό εξοπλισμό.
  • 8 λευκά LED διάχυσης και 1 πράσινο.
  • 9 ρελέ με πηνία 12 volt: ένα για 220 V, τέσσερα για 12 V 16 A και τέσσερα μικρότερα για 12 V 12 A. Τα τελευταία 8 πρέπει να είναι όσο το δυνατόν μικρότερα.
  • 40 αντιστάσεις: 15 560 ohm, 12 kilo ohm, 8 ohm, 2 10k και μία από τις 3k3, 4k7 και 30k.
  • Μια δυο διόδους για 12 βολτ: μια για μισό αμπέρ, η δεύτερη τουλάχιστον για ένα αμπέρ, μια ρεζέρβα δεν θα βλάψει. Είναι κολλημένο από οπουδήποτε, για παράδειγμα από νεκρά τροφοδοτικά.
  • Κάποιο είδος λαμπτήρα, ίσως ένα LED με αντίσταση, που καίει από 220 βολτ. Στην πραγματικότητα, ένα νέον κορίτσι θα φαινόταν cool εκεί!
  • Μια οθόνη δεκαέξι τμημάτων από μια παλιά μονάδα συστήματος για την εμφάνιση της τρέχουσας τάσης σε αυτήν. Λοιπόν, ή τρία επτά τμημάτων. Ή ακόμα και σφυρί σε ένα μπουλόνι για να εμφανιστεί η τρέχουσα τάση: αυτό, τελικά, αυτόματη συσκευή, ελέγχει την ίδια την τάση, δεν χρειάζεται να το γνωρίζετε, σε ακραίες περιπτώσεις μπορείτε να το μετρήσετε με ένα ελεγκτή. Αντί για οθόνη, μπορείτε απλά να βάλετε μερικά LED για να αναβοσβήνει το arduino μαζί τους, λένε, δεν έχω παγώσει, δουλεύω, όλα είναι υπό έλεγχο! (Όχι, δεν έχω δει ποτέ παγωμένο Arduino, αλλά παρόλα αυτά, πρέπει να είστε προετοιμασμένοι για οτιδήποτε.) 🙄
  • 3 καταχωρητές βάρδιας 74HC595
  • Λοιπόν, κάτι σαν τα μισά μιας πλακέτας κυκλώματος όπως αυτό (αγόρασα 10 κομμάτια στο eBay για ένα ποτήρι κομπόστα):

Θα ήθελα να σημειώσω ότι σχεδόν όλα τα εξαρτήματα που χρησιμοποιούνται σε αυτό το έργο δεν έχουν ακριβείς αξιολογήσεις και μπορούν να αντικατασταθούν με παρόμοια ή παρόμοια είτε με ελάχιστη προσαρμογή του κυκλώματος και του υλικολογισμικού, είτε χωρίς καμία απολύτως αλλαγή. Προσπάθησα να χρησιμοποιήσω εκείνα τα μέρη που κυριολεκτικά ήταν στα χέρια μου: για παράδειγμα, πρόσφατα συγκόλλησα τη συντριπτική πλειονότητα των αντιστάσεων και τρανζίστορ που χρησιμοποιήθηκαν εδώ από ένα μαγνητόφωνο Vilma πριν από την καταιγίδα, τα υπολείμματα του οποίου, μετά την αποκόλληση, στάλθηκαν με ασφάλεια στο μια χωματερή. Έτσι, το ποσό που δαπανήθηκε για την αγορά εξαρτημάτων για αυτήν τη συσκευή δεν υπερβαίνει τα 15 $ και το μεγαλύτερο μέρος του προϋπολογισμού δαπανήθηκε σε ρελέ.

Αρχική έκδοση φορτιστή

Δυστυχώς, δεν είχα φωτογραφία αυτού του φορτιστή αρχική κατάσταση, οπότε το μόνο που μπορώ να σας προσφέρω είναι σε αυτό το στάδιο- φωτογραφία με το κάλυμμα ήδη αφαιρεμένο, το μηχανικό μέρος του διακόπτη τροφοδοσίας ξεβιδωμένο (στα αριστερά) και τη λαβή αυτού του διακόπτη (στα δεξιά). Το ηλεκτρικό του μέρος προεξέχει από το πάνω μέρος της συσκευής. Αφαιρείται επίσης από την αρχική του οπή ο διακόπτης τάσης (6 ή 12 βολτ):

Αφού έκανα τους παραπάνω χειρισμούς, ξεκόλλησα επίσης το καλώδιο τροφοδοσίας από την ασφάλεια και την κύρια περιέλιξη του μετασχηματιστή, αν και εξακολουθεί να βρίσκεται στην επάνω δεξιά γωνία του επόμενου πλαισίου. Αλλά μην τον συνηθίσετε πολύ - βρήκα έναν εξαιρετικό αντικαταστάτη γι 'αυτόν, οπότε δεν θα τον ξαναδείτε.

Αρχή λειτουργίας της αρχικής συσκευής

Ο ίδιος ο φορτιστής είναι κατασκευασμένος σύμφωνα με απλή αρχή- 220 βολτ τροφοδοτούνται στην κύρια περιέλιξη του μετασχηματιστή, κατά συνέπεια, εναλλασσόμενη τάση εμφανίζεται επίσης στο δευτερεύον τύλιγμα. Η ισχύς μπορεί να ελεγχθεί λόγω του ότι υπάρχουν αρκετές έξοδοι από το δευτερεύον τύλιγμα (9 συνολικά). Αυτό σημαίνει ότι μεταξύ της πρώτης και καθεμιάς από τις επόμενες οκτώ ακίδες επιτυγχάνονται τα πάντα. μεγάλη ποσότηταστροφές, και όσο περισσότερες στροφές, όπως γνωρίζετε, τόσο μεγαλύτερη είναι η τάση (δηλαδή ρεύμα ή ισχύς - όπως θέλετε). Αυτές οι 8 ακίδες πηγαίνουν στον ίδιο διακόπτη με τον οποίο επιλέγετε την τρέχουσα ισχύ φόρτισης της μπαταρίας.

Αποδεικνύεται ότι μεταξύ του πρώτου ακροδέκτη της δευτερεύουσας περιέλιξης και της εξόδου από τον διακόπτη έχουμε την εναλλασσόμενη τάση που επιλέγεται από αυτόν τον διακόπτη. Αλλά ακόμα δεν μπορούν να φορτίσουν την μπαταρία, γιατί για να γίνει αυτό πρέπει να μετατραπεί σε μόνιμη, δηλαδή να ισιωθεί. Εξ ου και το όνομα αυτής της συσκευής- ανορθωτής.

Για ίσιωμα AC τάσηΑυτός ο φορτιστής χρησιμοποιεί ένα τόσο απλό και αξιόπιστο πράγμα όπως μια γέφυρα διόδου, που αποτελείται από τέσσερις ισχυρές διόδους D242 τοποθετημένες σε μεμονωμένα καλοριφέρ και στερεωμένες σε ένα διηλεκτρικό υπόστρωμα. Έτσι από τον διακόπτη το ρεύμα ρέει πρώτα στην είσοδο της γέφυρας διόδου, και μετά από την έξοδό του μέσω του αμπερόμετρου στην μπαταρία.

Επιλογή μεθόδου αλλαγής δευτερευόντων περιελίξεων

Πλέον κυριο ΠΡΟΒΛΗΜΑΑυτό το έργο ήταν η επιλογή της μεθόδου μεταγωγής των προαναφερθέντων ακροδεκτών δευτερεύουσας περιέλιξης. Υπήρχαν πολλές επιλογές, αλλά αμέσως αποφάσισα να δοκιμάσω την πιο τρελή και αναξιόπιστη από αυτές, αλλά την απλούστερη από άποψη κόστους εργασίας - σύνδεση σερβομηχανισμού αντί να αλλάζω χειροκίνητα τη θέση του διακόπτη:

Συνέδεσα τον σερβοκινητήρα στον διακόπτη, έγραψα γρήγορα το υλικολογισμικό και προσπάθησα να το γυρίσω, αλλά, όπως αποδείχθηκε, δεν υπήρχε αρκετή ισχύ και μερικές φορές κολλούσε στο πιο κρίσιμο σημείο, οπότε αυτή η επιλογή, δυστυχώς, δεν δουλεύει.

Ω ναι! Παραλιγο να το ξεχασω! Στην πραγματικότητα, δεν υπήρχαν 9 αλλά 10 ακροδέκτες από τη δευτερεύουσα περιέλιξη, οι δύο πρώτοι ήταν ένας για έξι βολτ, οι άλλοι για δώδεκα, και οι δύο πήγαν στον διακόπτη εναλλαγής και μόνο στη συνέχεια στη γέφυρα διόδου:

Αλλά επειδή δεν σχεδίαζα να φορτίσω τις μπαταρίες στα 6 V, αρνήθηκα αυτή τη λειτουργία, γι 'αυτό πέταξα τον διακόπτη εναλλαγής (από το σχέδιο, όχι γενικά) και μόνωσα το καλώδιο για έξι βολτ και έτρεξα το καλώδιο δώδεκα βολτ από ο μετασχηματιστής απευθείας στη γέφυρα διόδου.

Λοιπόν, πώς συνεχίζετε να μετακινείτε; Εδώ είναι είτε τρανζίστορ, είτε θυρίστορ, είτε χρήση ρελέ. Και επέλεξα την τελευταία επιλογή, γιατί τα ρελέ είναι μικρότερα από τα τρανζίστορ/θυρίστορ και σε αντίθεση με αυτά δεν ζεσταίνονται καθόλου αν τα πάρεις με ρεζέρβα ρεύματος. Έτσι έκανα - αγόρασα 8 μικρά ρελέ με πηνία για 12 βολτ, 4 τεμάχια για 16 αμπέρ και 4 για 12 αμπέρ. Σε μέγεθος απλά χωρούν ελεύθερος χώροςμέσα στη θήκη του φορτιστή:

Αλγόριθμος λειτουργίας συσκευής

Και εδώ, έχοντας τελικά αποφασίσει για τη μέθοδο εναλλαγής των εξόδων της δευτερεύουσας περιέλιξης, θεωρώ απαραίτητο να κάνω μερικές "λογοτεχνικές προσθήκες" και να μιλήσω για τον αλγόριθμο για τη λειτουργία της συσκευής. Αρχικά, για να το συντάξω, απλώς ανέλυσα τις ενέργειές μου κατά τη φόρτιση της μπαταρίας με αυτό το μηχάνημα σαϊτάν και, με βάση αυτό, άρχισα να σκιαγραφώ τις πρώτες πινελιές ενός νέου σκίτσου, το οποίο μπορείτε να σηκώσετε. Συχνά θα παραθέτω κομμάτια του για να σας βοηθήσω να καταλάβετε τι είναι τι, οπότε αν ήμουν στη θέση σας, θα το άνοιγα αμέσως τώρα και θα το μελετούσα καθώς προχωράω.

Αρχικά, ας εισάγουμε 3 τις πιο σημαντικές παραμέτρους:

// Μέγιστη τάση * 10
byte maxVoltageX10 = 148;

// Τάση * 10, στην οποία δεν είναι πλέον δυνατή η αύξηση της ισχύος
byte powerUpMaxTreshold = 142;

// Τάση * 10 στην οποία η ισχύς θα αναγκαστεί να αυξηθεί
byte powerUpMinTreshold = 136;

Πολλαπλασιάζονται επί 10, πρώτον επειδή κατά τον υπολογισμό τους είναι πιο βολικό να χρησιμοποιείτε ακέραιους αριθμούς - χωρίς στρογγυλοποίηση κ.λπ., δεύτερον επειδή αυτοί οι αριθμοί εμφανίζονται στην πραγματικότητα στην οθόνη και το κόμμα είναι, όπως ήταν, εικονικό , οπότε υπάρχει δεν χρειάζεται να κάνετε περιττούς υπολογισμούς στον κωδικό και είναι σαφές ότι πρόκειται για 14,8, 14,2 και 13,6 βολτ, αντίστοιχα.

Η πρώτη παράμετρος λέει στο πρόγραμμα τη μέγιστη επιτρεπόμενη τάση, εάν ξεπεραστεί, η ισχύς θα μειωθεί κατά ένα επίπεδο και εάν δεν υπάρχει πού να τη μειώσει, ο φορτιστής θα πρέπει απλώς να απενεργοποιηθεί.

Η δεύτερη παράμετρος θα χρησιμοποιηθεί στην αρχή της διαδικασίας φόρτισης - μετά την ενεργοποίηση, η ισχύς θα αυξηθεί έως ότου η τάση στην μπαταρία είναι μικρότερη από την τιμή που έχει ορίσει.

Η τρίτη παράμετρος εισήχθη ειδικά για τις περιπτώσεις που θα φορτιστεί η μπαταρία που είναι συνδεδεμένη στο αυτοκίνητο. Για παράδειγμα, κάποιος άνοιξε το ραδιόφωνο -> η τάση έπεσε κάτω από αυτήν την τιμή -> αυξάνουμε την ισχύ. Τι γίνεται όμως αν το φορτίο που ρίχνει την τάση σε αυτό το επίπεδο είναι βραχυπρόθεσμο (ανάβοντας τους προβολείς ή τον αναπτήρα) ή περιοδικό, με μια συγκεκριμένη συχνότητα (για παράδειγμα, από τις κρούσεις ενός υπογούφερ) και θα βγει με τέτοιο τρόπο που μόλις οι εγκέφαλοι αυξήσουν την ισχύ, θα χρειαστεί αμέσως μείωση, μετά αμέσως αύξηση και πάλι κ.λπ.; Το αποτέλεσμα θα είναι ένας φαύλος κύκλος, τα ρελέ θα κάνουν συνεχώς κλικ, φθείρονται, και για την μπαταρία, ίσως, αυτό δεν θα είναι πολύ χρήσιμο... Ειδικά για αυτό, μπορούμε να κάνουμε το σύστημά μας αυτοεκπαιδευόμενο, όπως λες, με την είσοδο πρόσθετη παράμετρος:

// Εάν έχουν περάσει λιγότερα από αυτά πολλά χιλιοστά του δευτερολέπτου μεταξύ της αύξησης της ισχύος από το powerUpMinTreshold και της μείωσής της, τότε το powerUpMinTreshold θα μειωθεί κατά 1
ανυπόγραφο int powerUpMinTresholdTimeout = 60000;

Όπως μπορείτε να δείτε από το σχόλιο, χάρη σε αυτήν την παράμετρο, το powerUpMinTreshold θα μειώνεται κατά ένα δέκατο του βολτ κάθε φορά που ο εγκέφαλος μειώνει την ισχύ λιγότερο από το powerUpMinTresholdTimeout χιλιοστά του δευτερολέπτου μετά την αύξηση της. Αυτό είναι όλο, το πρόβλημα λύθηκε: κάνουν κλικ στα ρελέ μια φορά, κάνουν κλικ μια δεύτερη φορά και την τρίτη φορά θα σκεφτούν 10 φορές πριν κάνουν κλικ. Χα-χα-χα, επικοινώνησαν με λάθος άτομα!

Λοιπόν, φαίνεται ότι έχουμε καταλάβει λίγο πολύ τη βάση του αλγορίθμου, τώρα ας προχωρήσουμε στις λεπτομέρειες και τις αποχρώσεις.

Σχεδίασα αμέσως ότι ολόκληρο το σύστημα θα τροφοδοτείται από την ίδια την μπαταρία και τα 220 βολτ θα συνδέονται μέσω ενός ρελέ που ελέγχεται από τον εγκέφαλο (δηλαδή το Arduino), χάρη στο οποίο θα μπορούσαμε να απενεργοποιήσουμε την παροχή ρεύματος στο συσκευή σε περίπτωση έκτακτης ανάγκης ή μετά την ολοκλήρωση της φόρτισης της μπαταρίας. Επιπλέον, θα υπάρχουν λιγότεροι σπινθήρες από το ρελέ παρά από την εισαγωγή βύσματος στην πρίζα, επομένως αυτή η επιλογή είναι επίσης πιο αξιόπιστη. Φυσικά, η σύνδεσή του θα γραφτεί παρακάτω, γιατί προς το παρόν συζητάμε μόνο θεωρητικά θέματα.

Η διαδικασία μεταγωγής θα συμβεί ως εξής: πρώτα θα χρειαστεί να συνδέσετε το βύσμα τροφοδοσίας στην πρίζα, μετά από το οποίο, φυσικά, δεν θα συμβεί τίποτα και, στη συνέχεια, θα χρειαστεί να συνδέσετε την ίδια την μπαταρία και εάν η τάση σε αυτήν είναι μεγαλύτερη από οκτώ βολτ, ολόκληρο το σύστημα θα ξεκινήσει και θα αρχίσει να το φορτίζει. Αλλά εδώ μπαίνει στο παιχνίδι μια άλλη δύσκολη παράμετρος:

// Καθυστέρηση σε χιλιοστά του δευτερολέπτου πριν από την έναρξη της φόρτισης
ανυπόγραφο int powerOnDelay = 2000;

Χρειάζεται, για παράδειγμα, για να μειωθεί ο σπινθήρας στο μπλοκ ρελέ, με τη βοήθεια του οποίου οι ακροδέκτες της δευτερεύουσας περιέλιξης του μετασχηματιστή θα ενεργοποιηθούν στην τελική συσκευή, επειδή στο πρώτο ρελέ του μπλοκ ρελέ το ρεύμα θα είναι υψηλότερο από το ρελέ που παρέχει ισχύ στον μετασχηματιστή, επιπλέον Εάν συμβεί κάτι, αυτό το δεύτερο ρελέ θα είναι πολύ πιο εύκολο να αντικατασταθεί. Δηλαδή, όταν συνδεθεί η μπαταρία, η ισχύς θα ανέβει πρώτα στο ένα και στη συνέχεια, μετά από αυτήν την καθυστέρηση, το ρελέ τροφοδοσίας θα ενεργοποιηθεί. Αυτές οι τέσσερις γραμμές κώδικα στη διαδικασία αύξησης ισχύος είναι υπεύθυνες για αυτό:

αν (powerLevel == 1) (
καθυστέρηση (powerOnDelay);

}

Σε γενικές γραμμές, αυτός ο τελεστής υπό όρους θα μπορούσε να καθοριστεί έτσι ώστε να εκτελείται μόνο μία φορά κατά την πρώτη ενεργοποίηση, αλλά, θεωρητικά, εάν αυτό συμβεί αργότερα, όταν η ισχύς πέσει στο πρώτο επίπεδο από υψηλότερα, τίποτα δεν θα αλλάξει, το ρελέ θα να ενεργοποιηθεί ούτως ή άλλως, έτσι αποφάσισα να μην φυτέψω επιπλέον κήπο.

Παρεμπιπτόντως, υπάρχει μια πολύ ενδιαφέρουσα παράμετρος στον κώδικα:

// Επίπεδο ισχύος (αρχικό)
byte powerLevel = 0;

Αυτός, όπως ίσως μαντέψατε, στήνει Πρώτο επίπεδοισχύος και εισήχθη σε πολύ πρώιμο στάδιο ανάπτυξης υλικολογισμικού και στο αυτή τη στιγμήχρησιμοποιείται εκεί απλώς ως τρέχον επίπεδο. Το περίεργο είναι ότι αν το αυξήσετε τώρα, τότε η κατάσταση που περιγράφεται στην προηγούμενη παράγραφο δεν θα λειτουργήσει ποτέ, δηλαδή, τα 220 βολτ δεν θα φτάσουν ποτέ στην κύρια περιέλιξη του μετασχηματιστή, πράγμα που σημαίνει ότι η συσκευή δεν θα φορτίσει την μπαταρία. Πιχάλκα.

Λοιπόν, εντάξει, ας μην μιλάμε για θλιβερά πράγματα. Ας πούμε ότι ενεργοποιήσαμε τη συσκευή και ξεκίνησε η φόρτιση. Όλα είναι καλά, αλλά μην ξεχνάτε ότι μετά την αύξηση του ρεύματος, η τάση στην μπαταρία δεν αυξάνεται αμέσως και αν δεν κάνετε καθυστερήσεις πριν την αυξήσετε, τότε μετά την ενεργοποίηση οι εγκέφαλοι θα μεταφέρουν αμέσως την ισχύ στο μέγιστο επίπεδο, και αυτό είναι λάθος, γι' αυτό εισάγεται η ακόλουθη παράμετρος:

// Χρόνος μετά τον οποίο η ισχύς μπορεί να αυξηθεί κατά ένα επίπεδο, σε χιλιοστά του δευτερολέπτου
int powerUpTime = 5000;

Δηλαδή, θα πρέπει να περάσουν τουλάχιστον 5000 χιλιοστά του δευτερολέπτου μεταξύ δύο αυξήσεων ισχύος, κατά τις οποίες η τάση μπορεί ήδη να ανέβει πάνω από το powerUpMaxTreshold και τότε δεν θα υπάρχει ανάγκη να αυξηθεί η ισχύς.

Όσο για τη μείωση της ισχύος, όλα είναι γενικά απλά: το πρόγραμμα ελέγχει περιοδικά εάν η τάση ρεύματος υπερβαίνει τη μέγιστη επιτρεπόμενο επίπεδο, και αν υπερβαίνει, η ισχύς πρέπει να μειωθεί:

// Διακοπή ρεύματος
εάν (τάσηX10 > maxVoltageX10) (

Εάν όμως πληρούται αυτή η προϋπόθεση, πρέπει να υπάρχουν δύο επιλογές για την εξέλιξη των γεγονότων. Το πρώτο είναι όταν το τρέχον επίπεδο ισχύος είναι μεγαλύτερο από ένα:

Σε αυτήν την περίπτωση, πρέπει να ρυθμίσουμε την ισχύ σε χαμηλότερο επίπεδο και να συνεχίσουμε τη φόρτιση. Διαφορετικά, όταν το επίπεδο ισχύος ήταν ήδη στο χαμηλότερο επίπεδο, απλά απενεργοποιούμε την τροφοδοσία και αναβοσβήνουμε την οθόνη. Χαμογελάμε και κουνάμε, με λίγα λόγια η μπαταρία είναι πλήρως φορτισμένη!

Γενικά, όπως έχει δείξει η πρακτική, αυτές οι μπαταρίες που φόρτισα θα μπορούσαν να αφαιρεθούν με ασφάλεια από τη φόρτιση ακόμη και στο δεύτερο επίπεδο ισχύος, επειδή το ρεύμα έχει ήδη πέσει κάτω από τα 500 mA. Ωστόσο, δεν πρέπει να αμελήσετε τη λειτουργία αυτόματης απενεργοποίησης - υπάρχουν διαφορετικοί τύποι μπαταριών...

Επίσης, για τη μείωση της ισχύος υπάρχει μια παράμετρος καθυστέρησης, παρόμοια με την παράμετρο powerUpTime για αύξηση:

//Παύση μετά τη μείωση ισχύος, σε χιλιοστά του δευτερολέπτου
int powerDownPause = 500;

Είναι αλήθεια ότι υλοποιείται πιο απλά, μέσω της συνήθους καθυστέρησης() μετά από άμεση αναγωγή. Σκέφτηκα ότι το μισό δευτερόλεπτο δεν είναι τόσο μεγάλο διάστημα για να το χρησιμοποιήσω πρόσθετη προϋπόθεσηστη δήλωση επιλογής, αλλά στον καθένα το δικό του, οπότε αν κάποιος από εσάς δεν έχει τίποτα να κάνει, πρώτα απ' όλα θα μπορούσατε να τροποποιήσετε αυτό το κομμάτι κώδικα σύμφωνα με την αρχή powerUpTime.

Είναι εκπληκτικό το πώς έχω ήδη γράψει τόσα πολλά και δεν έχω πει από πού αντλώ πραγματικά την τρέχουσα ένταση. Διόρθωση:

void loop() (
ct=millis();

Αποδεικνύεται ότι στην αρχή κάθε επανάληψης του βρόχου, ο οποίος, όπως ξέρουμε, απλώς επαναλαμβάνεται ατελείωτα μετά την εκκίνηση του συστήματος, κάνουμε δύο πράγματα: Πρώτον, γράφουμε τον τρέχοντα χρόνο από την έναρξη του τσιπ, σε χιλιοστά του δευτερολέπτου, στο μεταβλητή ct και, στη συνέχεια, υπολογίζουμε απλώς την τρέχουσα τάση χρησιμοποιώντας τη διαδικασία analogRead(), χρησιμοποιώντας τον αριθμό εισόδου αναλογικής παρακολούθησης που καθορίζεται στην αρχή του σκίτσου:

// Αναλογική είσοδοςγια παρακολούθηση τάσης
byte voltageInput = 5;

Και επίσης 2 συντελεστές, για τους οποίους θα μιλήσω λεπτομερώς αργότερα:

// Συντελεστής υπολογισμού τάσης (διαιρούμενος με αυτόν)
τάση επιπλεύσεωςX10Συντελεστής = 5,11;

// Μετατόπιση υπολογισμού τάσης (προστίθεται)
int voltageX10Shift = 35;

Αλλά θα ήταν πολύ απλό αν όλα ήταν τόσο απλά. Επομένως, για να περιπλέκεται ο αλγόριθμος, εισήχθησαν 2 ακόμη μεταβλητές στον κώδικα:

boolean goingUp = true, isUpAfter = false;

Η πρώτη μεταβλητή μας λέει σε ποια κατάσταση βρίσκεται αυτή τη στιγμή η διαδικασία φόρτισης. Η τιμή του είναι αληθής μέχρι να μειωθεί η ισχύς για πρώτη φορά. Δηλαδή, το goUp = true μας λέει ότι ενεργοποιήσαμε τον φορτιστή πριν από λίγο καιρό και εξακολουθεί να φορτίζει την μπαταρία με το μέγιστο δυνατό ρεύμα, χωρίς ποτέ να το μειώνει για προστασία από υπέρταση.

Με το δεύτερο, όλα είναι τελικά πολύπλοκα - μας λέει εάν η αύξηση ισχύος συνέβη αφού το goUp έγινε ψευδές και ορίζεται από το ακόλουθο απλό κομμάτι κώδικα στο τέλος της διαδικασίας αύξησης ισχύος:

αν (goingUp == false) (isUpAfter = true;)

Αυτή τη στιγμή μάλλον σκέφτεστε, γιατί στο διάολο είναι όλα αυτά απαραίτητα; Θα σου εξηγήσω αμέσως!

Ο λόγος για την προσθήκη αυτών των δύο μεταβλητών ήταν ακριβώς η εφαρμογή της δυνατότητας φόρτισης μιας μπαταρίας που στέκεται σε ένα αυτοκίνητο με μια μπαταρία συνδεδεμένη σε αυτό. μεταβλητό φορτίο. Ο πρώτος σκοπός της συνάρτησης goUp είναι να καθορίσει την παράμετρο με την οποία θα λειτουργήσει η αύξηση ισχύος:

εάν ((powerLevel<8) && (ct >powerTime + powerUpTime) && ((goingUp == true &&voltageX10< powerUpMaxTreshold) || (goingUp == false && voltageX10 < powerUpMinTreshold))) {

Όπως μπορείτε να δείτε, στην πρώτη φάση φόρτισης αυξάνουμε την ισχύ εάν η τάση ρεύματος είναι μικρότερη από το powerUpMaxTreshold και στη δεύτερη φάση - εάν είναι μικρότερη από το powerUpMinTreshold: αυτές είναι οι ίδιες παράμετροι για τις οποίες μίλησα στην αρχή.

Εάν η δήλωση υπό όρους που γράφτηκε παραπάνω εξακολουθεί να εκτελείται και αυτό το ίδιο goUp είναι ψευδές, τότε το πατενταρισμένο σύστημα μπαίνει στο παιχνίδι πρόσθετος έλεγχοςΤάση:

boolean stillLow = αληθές;
αν (goingUp == false) (
για (int x=0; x<= upCycles; x++){
voltageX10analogRead(voltageInput)+voltageX10Shift)/voltageX10Coefficient;
if (voltageX10 > powerUpMinTreshold) (sillLow=false; break;)
καθυστέρηση(1);
}
}
αν (ακόμα Χαμηλό == αληθές) (

Στην οποία ένας νέος χαρακτήρας μπαίνει στη σκηνή:

//Αριθμός επαναλήψεων του χιλιοστού του δευτερολέπτου ελέγχου τάσης πριν από την αύξηση της ισχύος
int upCycles = 5000;

Το γεγονός είναι ότι όταν υπάρχει ένα σήμα για αύξηση της ισχύος αφού το goUp έχει γίνει ψευδές, πιθανότατα έχουμε να κάνουμε με κάποιο είδος ασταθούς φορτίου - το ίδιο υπογούφερ, όπως ήδη υπέθεσα, ή κάποια άλλα άγνωστα σκουπίδια. Και αν ναι, τότε γιατί, αντί να αυξάνουμε ανόητα την ισχύ, να κάνουμε ξανά κλικ στους πολύτιμους διακόπτες μας και να διακινδυνεύσουμε να βγάλουμε για λίγο την τάση της μπαταρίας υψηλότερη από τη μέγιστη καθορισμένη απλός έλεγχος: 5 χιλιάδες φορές (upCycles) με διάστημα ενός χιλιοστού του δευτερολέπτου, ελέγξτε την τάση ρεύματος και αν τουλάχιστον μία φορά, ακούστε, τουλάχιστον μία φορά υπερβαίνει το powerUpMinTreshold - αυτό είναι, Khan, δεν θα υπάρξει αύξηση, απενεργοποιήστε το ψάρεμα βέργες! Ένας απλός αλλά αποτελεσματικός έλεγχος.

Το isUpAfter, με τη σειρά του, μας βοηθά να εφαρμόσουμε τη συνάρτηση μείωσης powerUpMinTreshold (το μίλησα στην αρχή), εδώ είναι πώς φαίνεται:

if ((isUpAfter == true) && (powerTime > ct - powerUpMinTresholdTimeout)) (powerUpMinTreshold = powerUpMinTreshold - 1;)

Εδώ powerTime είναι ο χρόνος της τελευταίας αύξησης ισχύος την τρέχουσα στιγμή.

Γεγονός είναι ότι, εκτός από την κατάσταση του powerUpMinTresholdTimeout που αναφέρθηκε παραπάνω, πρέπει να το μειώσουμε μόνο όταν χαμηλώνουμε την ισχύ αφού το ανεβάσουμε για πρώτη φορά αφού είχαμε ήδη αρχίσει να το χαμηλώνουμε. Σας είπα ότι αυτό το isUpAfter είναι περίπλοκο!

Αυτός είναι ο αλγόριθμος, είτε το πιστεύετε είτε όχι. Θα μιλήσω για τις υπόλοιπες λεπτομέρειες και τις λεπτές του λεπτομέρειες στην πορεία της περαιτέρω ιστορίας σχετικά με την πραγματική συναρμολόγηση της συσκευής.

Προετοιμασία του μπλοκ ρελέ

Έτσι, έχοντας καταλάβει ποιες επαφές των ρελέ είναι υπεύθυνες για τι και έχοντας αποφασίσει την τοποθέτησή τους σε σχέση με το άλλο, άρχισα να κολλάω:

Για να το κάνω αυτό, χρησιμοποίησα το "Moment - Crystal" που βρίσκεται κοντά. Δεν θα πω ότι πρόκειται για κάποιο είδος κόλλας super-duper, αλλά οι ιδιότητές της μου ταιριάζουν. Είναι καλύτερα, φυσικά, να χρησιμοποιήσετε το "Glue To Death" του Khaigirov, στεγνώνει πιο γρήγορα και γενικά σκληραίνει στο τέλος, αλλά υπάρχει 2-3 φορές λιγότερο στο σωληνάριο και κοστίζει μιάμιση φορά περισσότερο από το Moment , επομένως, όπως είπε ο ήρωας ενός καλού σοβιετικού κινούμενου σχεδίου, "Κι έτσι θα γίνει!"

Όσο για την κόλληση, όλα είναι απλά και γραμμένα στο σωληνάριο - εφαρμόστε και στις δύο επιφάνειες, περιμένετε 5-10 λεπτά και πιέστε σφιχτά (ναι, τόσο δυνατά που το κάρβουνο που πιέζεται ανάμεσα στις καρφίτσες μετατρέπεται σε διαμάντι 😆):

Αυτό είναι όλο, τα relyushki είναι συμπιεσμένα. Οπως βλέπεις, κεντρικές επαφέςΤα τοποθέτησα το ένα δίπλα στο άλλο, θα πρέπει ακόμα να είναι συνδεδεμένα μεταξύ τους:

Έκανα το ίδιο με τα μεγάλα ρελέ, και στη συνέχεια κόλλησα αυτά τα 2 μπλοκ που προέκυψαν μεταξύ τους, μετά από τα οποία άρχισα να συγκολλώ τα καλώδια στις επαφές. Το παχύ κίτρινο καλώδιο συνδέεται με τη σειρά του σε όλα τα ρελέ - αυτός είναι ο δίαυλος εξόδου, ο οποίος στη συνέχεια θα πάει στη γέφυρα διόδου, τα κόκκινα καλώδια είναι στους πρώτους 4 ακροδέκτες από τη δευτερεύουσα περιέλιξη του μετασχηματιστή και το μικρό κίτρινο καλώδιο που περνά με τη σειρά του από όλα τα ρελέ είναι σταθερά +12 βολτ πηνία Και τα μειονεκτήματα των πηνίων, όπως ίσως μαντέψατε, είναι τα καφέ και λευκά σύρματα, στα οποία θα επανέλθουμε σύντομα.

Το ίδιο σχέδιο, αλλά από την άλλη πλευρά, με νέα συγκολλημένα καλώδια για τη σύνδεση των δευτερευόντων καλωδίων περιέλιξης. Επιπλέον, με μεγάλα ρελέ υπάρχουν 2 καλώδια ανά έξοδο ανά έξοδο - έτσι είναι φτιαγμένο αυτό το μοντέλο ρελέ για πιο ομοιόμορφη κατανομή φορτίου και, ως αποτέλεσμα, λιγότερη παραγωγή θερμότητας:

Δεδομένου ότι το ρεύμα που καταναλώνεται από τα πηνία σε τέτοια ρελέ (~100 mA) υπερβαίνει κατά πολύ το μέγιστο ρεύμα που μπορεί να ληφθεί από Έξοδοι Arduino(~40 mA) ή καταχωρητής μετατόπισης 74HC595 (~25 mA), πρέπει να χρησιμοποιούνται τρανζίστορ για την ενεργοποίηση των πηνίων ρελέ. Και το παλιό καλό πορτοκαλί KT315 φαίνεται να είναι φτιαγμένο για αυτό!

Αυτά είναι τρανζίστορ n-p-n, οπότε στο κύκλωμα, για να το εξηγήσουμε με απλό τρόπο, το ρεύμα πρέπει να ρέει από το συν στο πηνίο, μετά από αυτό στον συλλέκτη του τρανζίστορ και μετά από τον πομπό του τρανζίστορ στο μείον. Αυτό το τρανζίστορ ανοίγει με ρεύμα από τη βάση στον πομπό, αλλά το ρεύμα που απαιτείται εκεί είναι πολύ μικρό, επομένως συνδέουμε τις βάσεις των τρανζίστορ μέσω αντιστάσεων 1 kOhm (1000 Ohm):

Τώρα το μόνο που μένει είναι να κολλήσετε κοντά καλώδια στις αντιστάσεις, χωρίς να ξεχνάτε να μονώνετε προσεκτικά τα πάντα και μπορείτε να τα στερεώσετε - προσωπικά, αποφάσισα να κολλήσω τα τρανζίστορ στο πλάι των ρελέ για να μην μπερδευτούν και να μην έρθει τίποτα μακριά από:

Όπως μπορείτε να δείτε στη φωτογραφία, τα τρανζίστορ βρίσκονται τέλεια και στις δύο πλευρές του μπλοκ ρελέ, γέμισα επίσης τις υπόλοιπες επαφές με κόλλα για να είμαι σίγουρος ότι τίποτα δεν θα βραχυκυκλώσει ή θα καεί πουθενά:

Τα τρανζίστορ είναι κολλημένα και το μπλοκ είναι σχεδόν έτοιμο:

Τώρα βρισκόμαστε αντιμέτωποι με το ερώτημα - με τι πρέπει να συνδέσουμε τα τρανζίστορ; Στο Arduino; Όχι, τότε δεν θα υπάρχουν αρκετές έξοδοι για άλλα εξαρτήματα και σε τέτοιες περιπτώσεις το τσιπ εξοικονόμησης παίζει - ο καταχωρητής μετατόπισης 74HC595. Έχουν γραφτεί τόσα πολλά για αυτό στο Διαδίκτυο, οπότε δεν θα γράψω 3 παραγράφους εδώ, θα πω απλώς ότι χάρη σε τέτοια μικροκυκλώματα, μπορείτε να αυξήσετε τον αριθμό των εξόδων Arduino, θυσιάζοντας μόνο τρεις για αυτό. Επιπλέον, μπορούν να συνδεθούν σε σειρά σε μια αλυσίδα. Υπάρχουν διαφορετικές εκδόσεις τέτοιων μικροκυκλωμάτων, για παράδειγμα με 16 εξόδους ή 8, σε διαφορετικές συσκευασίες. Σε αυτό το έργο, αποφάσισα να χρησιμοποιήσω μια επιλογή 8 εξόδων σε ένα μικρό πακέτο SO-16. Αν και το έργο είναι εξαιρετικό, όλα καταλαμβάνουν λίγο χώρο, ο οποίος λείπει ήδη από το συμπαγές σώμα της συσκευής, το οποίο δεν έχει σχεδιαστεί για τέτοιες τροποποιήσεις:

Για να υποδείξω την τρέχουσα ισχύ της συσκευής, αποφάσισα να χρησιμοποιήσω 8 LED, ένα για κάθε ζεύγος τρανζίστορ / ρελέ, για αυτό χρησιμοποίησα ένα καλώδιο οκτώ πυρήνων, κολλώντας κάθε πυρήνα στο αντίστοιχο κανάλι ελέγχου, αλλά όχι απευθείας στον καταχωρητή, αλλά για τις αντιστάσεις, ηλεκτρικά δεν υπάρχει διαφορά, αλλά μηχανικά είναι πιο αξιόπιστο, νομίζω. Μετά από ενδελεχή έλεγχο (περισσότερα για αυτό παρακάτω), γέμισα το μικροκύκλωμα με την ίδια κόλλα και πέρασα για άλλη μια φορά όλα τα τρανζίστορ μαζί του - τώρα αυτό το σύστημα έχει γίνει ακόμα πιο "στερεό" και δυνατό:

Σύστημα ένδειξης τάσης

Ήρθε η ώρα για θεωρητικές δοκιμές του συστήματος απεικόνισης. Για να εμφανίσω την τρέχουσα τάση της μπαταρίας, χρησιμοποίησα μια οθόνη από μια παλιά μονάδα συστήματος από την εποχή των πρώτων Pentium. Δεν υπάρχουν κόλπα με αυτό, κάθε τμήμα είναι ένα απλό πράσινο LED που λειτουργεί από 2-2,1 βολτ. Η μόνη εξαίρεση είναι η μονάδα - σε αυτήν 2 τμήματα παραλληλίζονται και τοποθετούνται σε ένα πόδι. Η οθόνη έχει συνολικά 16 πόδια: 1 συν και 15 μείον. Δηλαδή, η ισχύς παρέχεται πάντα στο συν και η παροχή γείωσης σε ένα συγκεκριμένο σκέλος φωτίζει το τμήμα που χρειαζόμαστε - όλα είναι εξαιρετικά απλά, αλλά πώς να το εφαρμόσετε; Για να γίνει αυτό, χρησιμοποιούμε και πάλι καταχωρητές shift, αυτή τη φορά 2 τεμάχια. Για την κατασκευή πρωτοτύπων σε breadboard, χρησιμοποίησα το ίδιο 74HC595, αλλά σε συσκευασία DIP-16, επειδή είναι πολύ πιο βολικό να δουλεύεις μαζί τους. Στην παρακάτω εικόνα, όπως μπορείτε να δείτε, το σύστημα είναι ήδη συναρμολογημένο και λειτουργεί:

Αλλά αυτό το σύστημαπολύ διαφορετικό από αυτό που μπήκε στην τελική συσκευή. Ας ξεκινήσουμε με το γεγονός ότι αρχικά αποφάσισα να χρησιμοποιήσω σταθεροποιητή για να τροφοδοτήσω την οθόνη, αν και στο τέλος τον εγκατέλειψα και συνέδεσα κάθε σκέλος της οθόνης μέσω μιας αντίστασης 560 Ohm. Δεύτερον, σε αυτό το διάγραμμα, τα LED τροφοδοτούνται μέσω ενός άλλου σταθεροποιητής, επιπλέον, τροφοδοτεί και ο ίδιος ο καταχωρητής μετατόπισης. Αλλά τελικά, έμεινε μόνο ένας σταθεροποιητής στον φορτιστή μου - KREN5V, κατασκευασμένος στην ΕΣΣΔ, όπως το μαντέψατε, 5 βολτ.

Ωστόσο, σε αυτό το στάδιο, η μέθοδος τροφοδοσίας του υλικού δεν ήταν τόσο σημαντική - το κύριο πράγμα ήταν να μάθουμε πώς να εμφανίζουμε σημαντικές πληροφορίες στην οθόνη, για τις οποίες ήταν απαραίτητο να μάθουμε σε ποιο τμήμα αντιστοιχούσε κάθε μια από τις ακίδες καταχωρητή και στη συνέχεια δημιουργήστε δύο πίνακες στο υλικολογισμικό - δεκάδες και μονάδες, στις οποίες, χρησιμοποιώντας μονάδες και μηδενικά, εισάγετε την επιθυμητή μάσκα για κάθε εμφανιζόμενο αριθμό, δηλαδή 0-19 για τους δύο πρώτους χαρακτήρες της οθόνης και 0-9 για τον τρίτο χαρακτήρας:

// Πρότυπα για την οθόνη
char* δεκάδες=("10000001","10111011","01100001","00101001","00011011","00001101","000000101","10101011","0000000000001", "10100000", "000000", 10111010", "01100000", "00101000", "00011010", "00001100", "00000100", "10101010", "00000000", "00001000");
char* ones=("10000010","10111110","10001001","10011000","10110100","11010000","11000000","10111010","1000000000","1000000000","100000000");

Επίσης, η σειρά σύνδεσης των μητρώων στη διαδικασία περαιτέρω εργασίας έχει αλλάξει - το μπλοκ ρελέ θα είναι το πρώτο στην αλυσίδα και μόνο τότε η οθόνη, τα ρελέ εξακολουθούν να είναι πιο σημαντικά, ωστόσο, αυτή τη στιγμή δεν είναι έτσι σημαντικό, γιατί η σειρά δεν έχει σημασία ιδιαίτερη σημασία- μόνο στο υλικολογισμικό, στη διαδικασία εξόδου, πρέπει να ανταλλάξετε μερικές γραμμές και αυτό είναι.

Όταν το σύστημα άρχισε να λειτουργεί, αντί για τον καταχωρητή τρίτης βάρδιας, σύνδεσα ένα έτοιμο μπλοκ ρελέ σε αυτό. Και για να χτυπήσουν τα ρελέ, χρειαζόμουν δώδεκα βολτ τροφοδοτικό (όχι από κινέζικο διακόπτη, αλλά σταθεροποιημένο, με ομαλή επιλογή τάσης). Εάν θέλετε να χρησιμοποιήσετε ένα μη σταθεροποιημένο, χρησιμοποιήστε ένα εννέα βολτ, ή ακόμα και 7,5 - θα έχουν 12 βολτ χωρίς φορτίο. Το κυριότερο είναι να μην συγχέουμε το σταθερό με το μεταβλητό! Η επόμενη φωτογραφία δείχνει πώς συνδέονται 12 βολτ στα ακροφύσια με δύο βύσματα με καλώδια στην επάνω δεξιά γωνία 🙄

Η οθόνη λειτουργεί ήδη! Έγραψα ένα σκίτσο που εμφανίζει εναλλάξ αριθμούς από το μηδέν έως το 199 στην οθόνη και τη δυαδική τους αναπαράσταση στα LED στα δεξιά. Λοιπόν, έχει πλάκα!

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

// Επαφή που είναι συνδεδεμένη στην είσοδο ST_CP του 74HC595
int latchPin = 8, voltageX10,voltageGuard,ons,dz,
// Επαφή που είναι συνδεδεμένη στην είσοδο SH_CP του 74HC595
ClockPin = 12,
// Επαφή που είναι συνδεδεμένη στην είσοδο DS του 74HC595
DataPin = 11;

Όταν το σύστημα ξεκινά, ο τρόπος λειτουργίας αυτών των επαφών, όπως και των άλλων που χρησιμοποιούμε, ορίζεται σε OUTPUT:

void setup() (
pinMode(latchPin, OUTPUT);
pinMode (clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(relay220Pin, OUTPUT);
pinMode(fanPin, OUTPUT);

Λοιπόν, η έξοδος των πληροφοριών στους καταχωρητές μοιάζει με αυτό:

digitalWrite(latchPin, LOW);



Επιπλέον, αρχικά η shiftOut() λαμβάνει ως είσοδο μεταβλητή τύπου byte, και δεδομένου ότι είναι πολύ πιο σαφές για εμάς να γράφουμε απευθείας μονάδες και μηδενικά σε καταχωρητές, ο κώδικας χρησιμοποιεί ειδική λειτουργία bitseq(), που μετατρέπει τα παραπάνω μοτίβα σε αυτό ακριβώς που θέλει να κάνουμε η shiftOut():

byte bitseq (χαρακτηριστικά)(
byte ab=0;
για (byte ba=0; ba<8; ba++){
if (s == "0") (bitWrite(ab,ba,0);) else (bitWrite(ab,ba,1);)
}
επιστροφή ab?
}

Μέχρι εκείνη τη στιγμή, η επιφάνεια εργασίας μου έμοιαζε κάτι σαν την παρακάτω φωτογραφία. Μην ταράζετε το μυαλό σας αναρωτιέστε τι είναι το ασθενοφόρο. Ωραία σειρά, την βλέπω ήδη δεύτερη φορά. 🙄 Παρεμπιπτόντως, για να συνδέσω κυκλώματα χωρίς ρεύμα στη συσκευή μου, χρησιμοποίησα συνεστραμμένο ζεύγος, το ίδιο της κατηγορίας 5e, απλά έχω πολλά - δεν πετάω παλιά καλώδια από την οροφή, αλλά τα ξετυλίγω . Αλλά δεν είναι όλες οι καλωδιώσεις καλές για τέτοια πράγματα. Αυτά που χρησιμοποίησα δεν είναι συμπαγή εσωτερικά, αλλά στριμωγμένα, γεγονός που τα κάνει πολύ ελαστικά και όχι εύθραυστα, ενώ έχουν και υψηλής ποιότητας μόνωση. Αλλά δεν θα χρησιμοποιούσα ένα κανονικό καλώδιο συνεστραμμένου ζεύγους με συμπαγείς πυρήνες - λυγίζει πολύ σφιχτά (καλά, σχετικά) και θα ήταν εντελώς παράλογο να το κολλήσω σε μικρά μικροκυκλώματα σε συσκευασία SO-16. Τι λέτε, έπρεπε να έχουν χρησιμοποιήσει DIP mikruhi; Χα, δεν έχετε δει ακόμα τι είδους μαζοχισμός θα ξεκινήσει αυτή τη στιγμή, οπότε ας μην τραβάμε τη γάτα από τα κέρατα (ναι) - πάμε!

Στην πραγματικότητα δεν είναι τόσο κακή ιδέα να τοποθετήσετε μικρές μάρκες μέσα στον δείκτη. Εξάλλου, δεν υπάρχει χώρος στην παλιά θήκη ούτως ή άλλως, ο μπροστινός πίνακας έπρεπε να τοποθετηθεί σε μικρούς αποστάτες και αν είχα χρησιμοποιήσει καταχωρητές σε θήκες DIP - ουάου, δεν ξέρω πώς θα χωρούσαν όλα εκεί!

Όπως είπα ήδη, στην τελική έκδοση τα τμήματα συνδέονται μέσω αντιστάσεων, και όχι απευθείας, αλλά, ωστόσο, αποφάσισα να δείξω και την πρώτη επιλογή: ίσως σε κάποιον να αρέσει καλύτερα. Δεδομένου ότι αυτή η ίδια η οθόνη είναι γεμάτη με κάτι στην πίσω πλευρά (τι αηδίες είναι αυτές οι οθόνες πλήρωσης σας) και η επιφάνεια αυτής της γέμισης είναι επίσης κοίλη προς τα μέσα, έκοψα ένα μικρό επίπεδο πιάτο από μια πλαστική κάρτα πληρωμής. Λευκορώσος μονοπώλιος στον τομέα των τηλεπικοινωνιών, τον οποίο κόλλησα κατευθείαν στην οθόνη και μετά κόλλησα τα ίδια τα μητρώα πάνω της, έχοντας προηγουμένως σημειώσει το πρώτο πόδι στο πίσω μέρος του καθενός από αυτά (γιατί «Μην ανακατεύετε τις απόψεις, Kutuzau! ”).

Αφού κόλλησα όλα τα καλώδια και, ξανά, έλεγξα ότι όλα λειτουργούσαν, γέμισα τα πάντα με κόλλα. Επειδή μια λάθος κίνηση και το καλώδιο θα σπάσει από την επαφή, θα βραχυκυκλώσει κάτι και θα υπάρξει μεγάλο, μεγάλο χάος. Αλλά αυτό δεν θα συμβεί με την κόλλα, όλα είναι καλά με την κόλλα. Κόλλα, με λίγα λόγια, κανόνες. Μέχρι να πρέπει να το σκίσετε 😆 👿 Αλλά ας μην μιλάμε για θλιβερά πράγματα, ορίστε τι συνέβη μετά από αυτούς τους χειρισμούς:

Έτσι, έχω συνδέσει ακόμη και αυτά τα δύο μπλοκ μεταξύ τους (προσωρινά όμως) για να μπορώ να απολαμβάνω ξανά τους αριθμούς που αναβοσβήνουν και τους αριθμούς που κάνουν κλικ:

Δυστυχώς, όταν συνδύασα την οθόνη με τους καταχωρητές σε ένα, έπρεπε να αλλάξω ελαφρώς τη σειρά με την οποία συνδέθηκαν τα πόδια της, οπότε μετά την εκκίνηση ολόκληρου του συστήματος, αντί για αραβικούς αριθμούς είδα μερικούς εξωγήινους:

Αν και, στην πραγματικότητα, υπάρχει λίγος εξωγήινος στο ένα και στο εννέα, μόνο στη μέση υπήρχε κάποιο είδος σκουπιδιών, αλλά όλα αυτά είναι δευτερεύοντα πράγματα. Το επόμενο βήμα ήταν να βιδώσω ένα βολτόμετρο, δηλαδή να δημιουργήσω έναν αισθητήρα τάσης, επειδή ο αλγόριθμος λειτουργίας του φορτιστή μου θα πρέπει να εξαρτάται από την τάση ρεύματος.

Μέτρηση τάσης με Arduino

Το Arduino είναι καλό, αρχικά έχει αναλογικές εισόδους στις οποίες μπορείς να παρακολουθείς την τάση σε πραγματικό χρόνο. Το μόνο πρόβλημα είναι ότι το εύρος μέτρησης αυτών των εισόδων εκτείνεται από το μηδέν έως μόνο πέντε βολτ, αλλά οι τάσεις μας θα είναι σχεδόν 15, επομένως αυτό το πρόβλημα πρέπει να λυθεί με κάποιο τρόπο. Και εδώ ένας απλός διαιρέτης τάσης που χρησιμοποιεί δύο αντιστάσεις έρχεται να μας βοηθήσει. Για παράδειγμα, για το απόλυτο μέγιστο θα πάρουμε 20 βολτ (καλά, για κάθε ενδεχόμενο, για να μην καεί τίποτα, αν μη τι άλλο), και το ταβάνι μας είναι 5, δηλαδή το ένα τέταρτο του μέγιστου, που σημαίνει ότι πρέπει να διαιρέστε την τάση με 4. Για να το κάνετε αυτό, πάρτε 2 αντιστάσεις τέτοιων τιμών που η τιμή της πρώτης είναι 1/4 και η τιμή της δεύτερης είναι τα 3/4 του αθροίσματος των τιμών τους. Για παράδειγμα, 10 και 30 kOhm. Ή 5 και 15 kOhm, ή 2,5 και 7,5, λοιπόν, καταλαβαίνετε. Δεν αξίζει να πάρετε λιγότερα, γιατί το ρεύμα εκεί είναι μικρό. Λοιπόν, συνδέστε σύμφωνα με το διάγραμμα: 10 μεταξύ της αναλογικής εισόδου και της γείωσης και 30 μεταξύ της αναλογικής εισόδου και της εξόδου φόρτισης της μπαταρίας.

Αλλά δεν είναι τόσο απλό - η διαδικασία analogRead() θα σας δώσει μια τιμή από 0 έως 1024, όπου το μηδέν είναι μηδέν και το 1024 είναι 5 βολτ για αυτήν ή 20 βολτ για εμάς. Επομένως, για να υπολογίσουμε εκ νέου αυτήν την τιμή, πρέπει να εισαγάγουμε έναν συγκεκριμένο συντελεστή, τον οποίο θα ορίσουμε ως σταθερά στην κεφαλίδα του υλικολογισμικού (voltage floatX10Coefficient = 5,11;). Κοιτάζοντας λίγο μπροστά, θα πω ότι στη συνέχεια η τάση που βλέπει το Arduino, σε υψηλό ρεύμα, άρχισε να πηδά με εξάπλωση έως και μισό βολτ, οπότε έπρεπε να συνδέσουμε τον αυτοσχέδιο αισθητήρα μας μέσω μιας διόδου, μετά την οποία εγκατέστησα έναν πυκνωτή 16V 1000 mF, και συνέδεσα επίσης ένα ρελέ 220 εκεί Β, αλλά περισσότερα για αυτό στο τέλος. Γιατί μιλάω για αυτό τώρα; Επειδή η δίοδος, όπως γνωρίζετε, μειώνει ελαφρώς την τάση, έτσι εισήγαγα έναν δεύτερο συντελεστή για να αντισταθμίσω την παρουσία αυτής της διόδου (int voltageX10Shift = 35;), δηλαδή πρώτα ο δεύτερος συντελεστής προστίθεται στην τιμή εξόδου και τότε αυτό που συμβαίνει διαιρείται με το πρώτο .

Ως αποτέλεσμα, η παρακολούθηση της τάσης αποδείχθηκε επιτυχής - συγκρίνετε τις μετρήσεις με τον ελεγκτή (δεν πρόκειται για μπαταρία συνδεδεμένη στη συσκευή, αλλά για το ίδιο σπιτικό σταθεροποιημένο τροφοδοτικό):

Μπροστινός πίνακας φορτιστή

Στη συνέχεια, ήρθε η ώρα να δουλέψουμε στο πρόσωπο της συσκευής μας. Αρχικά, σκέφτηκα να φτιάξω ένα νέο πάνελ και να το κολλήσω εκεί, αλλά αφού το σκέφτηκα, κατάλαβα πώς να χρησιμοποιήσω τις παλιές επιγραφές, οπότε όλα είχαν νόημα. Στη θέση του ρυθμιστή ρεύματος, ανοίγονται τρύπες για τα LED και το βέλος στην κορυφή δείχνει προς ποια κατεύθυνση θα είναι μεγαλύτερο το ρεύμα, πόσο δροσερό!

Τώρα τα LED έχουν ήδη τοποθετηθεί και η οθόνη έχει εισαχθεί σε μια νέα θέση, και ακόμη και οι υπόλοιπες τρύπες έχουν βρει χρήση: στην τρύπα από τον τρέχοντα ρυθμιστή θα υπάρχει μια λάμπα συνδεδεμένη με την κύρια περιέλιξη του ο μετασχηματιστής - θα ανάψει όταν η φόρτιση είναι σε εξέλιξη, δηλαδή όταν τροφοδοτείται ο μετασχηματιστής 220 βολτ. Και αν ο φορτιστής φαίνεται να φορτίζει, αλλά η λυχνία δεν ανάβει, ελέγξτε αν ξεχάσατε να συνδέσετε το φις στην πρίζα! Στην τρύπα από τον διακόπτη 6-12 volt υπάρχει μια πλαστική μπορντούρα για LED, η οποία θα συνδεθεί απευθείας στην μπαταρία μέσω μιας αντίστασης χωρίς σταθεροποιητή και η φωτεινότητα της λάμψης της θα δείξει πόσο φορτισμένη είναι η μπαταρία. Αυτό είναι χρήσιμο εάν η μπαταρία είναι τελείως νεκρή και δεν υπάρχουν ούτε πέντε βολτ σε αυτήν για να τροφοδοτήσει τον εγκέφαλο - τότε η δίοδος θα λάμπει αμυδρά και δεν θα υπάρχουν ερωτήσεις, σαν να έχει χαλάσει η συσκευή. Αν και, φυσικά, δικαιολογώ: αν δεν υπήρχε μια τρύπα, δεν θα σκεφτόμουν καν να βάλω τίποτα εκεί. Αυτό συμβαίνει συνήθως με τους άντρες, αν καταλαβαίνετε τι εννοώ.

Παρεμπιπτόντως, λες, πού έχεις δει, Andryusha, τις μπαταρίες των αυτοκινήτων να έχουν αποφορτιστεί στα 5 βολτ; Λοιπόν, τότε δεν τα είχα δει πουθενά, αλλά αφού τελείωσαν τις εργασίες σε αυτόν τον φορτιστή, μου έφεραν ένα από αυτά. 3 βολτ. Και μάλιστα το φόρτισα, και είναι ακόμα και ζωντανό, αν και, όπως πιστεύω, είναι θειωμένο μέχρι θανάτου. Υπήρχε ένας δεύτερος σε παρόμοια κατάσταση, αλλά τίποτα δεν μπορούσε να τον σώσει 😆

Έτσι έμοιαζε το πίσω μέρος του ρύγχους εκείνη την ώρα:

Και στην επόμενη φωτογραφία ξεκολλάω σιγά σιγά την κόλλα και αντικαθιστώ τα καλώδια με αντιστάσεις. Φυσικά, ακρωτηρίασα και τον σταθεροποιητή στην κάτω αριστερή γωνία της φωτογραφίας καθώς ήταν περιττός. Και παρεμπιπτόντως, η συγκόλληση αντιστάσεων είναι πολύ πιο εύκολη από την καλωδίωση - αν το έκανα ξανά τώρα, θα το έκανα αμέσως, με αντιστάσεις και αυτά τα μικρά μικροκυκλώματα.

Επίσης σε αυτή τη φωτογραφία στην επάνω αριστερή γωνία μπορείτε να δείτε πώς συνέδεσα τα LED. Έχουν ένα κοινό μείον, πηγαίνει κατά μήκος της εσωτερικής ακτίνας και συνδέεται με γενικό μείονσυσκευές μέσω μιας αντίστασης 3,3 kOhm - επέλεξα αυτή για να είναι φωτεινή και να μην τυφλώνει. Φαίνεται ότι λειτούργησε σωστά. Γιατί υπάρχει μόνο μία αντίσταση; Επειδή ανά πάσα στιγμή, με εξαίρεση τη στιγμή της εναλλαγής του φορτίου μεταξύ των ρελέ, μόνο ένα LED θα ανάψει στην οθόνη.

Γιατί εκτός από τη στιγμή της εναλλαγής; Επειδή αν σβήσει ένα ρελέ και μετά ανάψει το δεύτερο - τη στιγμή που απενεργοποιείται το πρώτο και τη στιγμή που ανοίγει το δεύτερο, θα εμφανιστεί ένας σπινθήρας στις επαφές τους, από αυτούς τους σπινθήρες θα σχηματιστούν εναποθέσεις άνθρακα στις επαφές, λόγω των οποίων θα αποτύχουν με την πάροδο του χρόνου - θα αυξηθεί η αντίστασή τους, θα αρχίσουν να ζεσταίνονται, και αυτό είναι, αναμνηστική θάλασσα! Οπότε είναι σωστό να ανάψετε πρώτα το δεύτερο ρελέ και μόλις ανάψει, να κλείσετε το πρώτο, τότε θα απαλλαγούμε από τους σπινθήρες και τα ρελέ θα ζήσουν ευτυχισμένα! Παρεμπιπτόντως, στον αρχικό διακόπτη όλα γίνονται ακριβώς με αυτόν τον τρόπο, οπότε όχι, δεν το βρήκα αυτό, το χειροκρότημα και τα λουλούδια στο αυτοκίνητο αποστέλλονται σε αυτήν την περίπτωση στους σχεδιαστές της αρχικής συσκευής και όχι σε εσάς ταπεινός υπηρέτης. Λοιπόν, δεν είναι όλα Μασλένιτσα για τη γάτα. 🙄

Παρεμπιπτόντως, η καθυστέρηση εναλλαγής μεταξύ των ρελέ ρυθμίζεται από αυτήν την παράμετρο:

// Διάρκεια μετάβασης μεταξύ ηλεκτρονόμων σε χιλιοστά του δευτερολέπτου
byte relayTransition = 80;

Τι θα συμβεί όμως εάν, κατά κάποιον τρόπο, ως δια μαγείας, δύο ή περισσότερα ρελέ ανάβουν ταυτόχρονα για χρονικό διάστημα μεγαλύτερο από τον καθορισμένο χρόνο για την εναλλαγή, λόγω κάποιου είδους σφάλματος; Αλλά θα είναι πολύ κακό: θα βραχυκυκλώσετε ένα τμήμα της δευτερεύουσας περιέλιξης. Τα καλώδια θα αρχίσουν να λιώνουν, ο καπνός θα προέρχεται από τον μετασχηματιστή και γενικά θα συμβεί ο Αρμαγεδδώνας. Το ίδιο που γύρισε ο Μάικλ Μπέι.

Λοιπόν, αγαπητοί κύριοι, κυρίες και βαν-νταμ, ειδικά για αυτόν τον σκοπό κατέληξα σε ένα σύστημα προστασίας από έναν τέτοιο Αρμαγεδδώνα. Μια αντίσταση 220 Ohm συνδέεται στο θετικό κάθε LED. Γιατί 220; Πρώτον, επειδή εκείνη τη μέρα η Σελήνη ήταν στον Κρόνο και δεύτερον, επειδή πριν από την Πρωτοχρονιά είχα την ευκαιρία να ξεκαλώσω μερικά εγχώρια μαγνητόφωνα, καθώς και ένα εξίσου εγχώριο ηλεκτρονικό πιάνο (ή ένα πιάνο, δεν ξέρω , αλλά όχι ένα πιάνο εν συντομία), οπότε από εκεί ξεκόλλησα ένα ολόκληρο κουτί από αυτές τις αντιστάσεις 220 Ohm, πρέπει να τις βάλω κάπου - οπότε, εξαιρετική χρήση!

Από την άλλη, όλες αυτές οι αντιστάσεις συνδέονται και έλκονται στη γείωση μέσω μιας αντίστασης 4k7 (αυτό σημαίνει 4,7 kOhm, ήρθε η ώρα να ονομάσουμε ένα φτυάρι!), από την οποία έχω επίσης ένα σκασμό και πολλά άλλα. Έτσι μετράμε την τάση σε αυτό το σημείο G, όπου και οι 9 αυτές αντιστάσεις συγκλίνουν, δηλαδή συνδέουμε αυτό το σημείο στην επόμενη αναλογική είσοδο του Arduino, η οποία ορίζεται από την ακόλουθη παράμετρο:

// Αναλογική είσοδος για παρακολούθηση του αριθμού των ενεργοποιημένων ρελέ
byte guardInput = 4;

Και από αυτή την τάση βλέπουμε αμέσως πόσα LED ανάβουν εκεί αυτή τη στιγμή, και αφού συνδέονται απευθείας με τα τρανζίστορ, αυτό είναι το ίδιο που βλέπουμε, πόσα ρελέ είναι ενεργοποιημένα αυτή τη στιγμή, και αυτό ακριβώς είναι αυτό που χρειαζόμαστε και είναι απαραίτητο σε αυτή την κατάσταση! Δηλαδή βάζουμε ένα κατώφλι τάσης πάνω από το οποίο πρώτα κόβουμε αμέσως 220 βολτ χρησιμοποιώντας το κατάλληλο ρελέ και δεύτερον προσπαθούμε να διορθώσουμε την κατάσταση με τα ρελέ και μόλις διορθωθεί ανάβουμε ξανά τα 220 και συνεχίζουμε. να δουλεύει σαν να μην ήταν τίποτα λάθος συνέβη. Όλα είναι απλά και αξιόπιστα, το έλεγξα!

Αυτό το όριο ορίζεται εδώ:

// Μέγιστη επιτρεπόμενη τιμή guardInput
byte guardTreshold = 160;

Και η διαδικασία του ελέγχου που περιγράφηκε παραπάνω εκτελείται σε κάθε κύκλο του βρόχου και μοιάζει με αυτό:

// Έλεγχος για τον αριθμό των διακοπτών και αυτόματη απενεργοποίηση - επαναφορά - ενεργοποίηση
if (voltageGuard > guardTreshold) (
digitalWrite(relay220Pin, LOW);
ενώ (voltageGuard > guardTreshold) (
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, bitseq(ones));
shiftOut(dataPin, clockPin, MSBFIRST, bitseq(δεκάδες));
shiftOut(dataPin, clockPin, MSBFIRST, bitseq(relays));
digitalWrite(latchPin, HIGH);
voltageGuard=analogRead(guardInput);
}
digitalWrite(relay220Pin, HIGH);
}

Και τώρα θα σας δείξω ακόμα τη φωτογραφία που υποσχέθηκα πριν από 9 παραγράφους, έστω και μόνο για λόγους ευπρέπειας:

Και το κάλυμμα που αφαιρέθηκε μας δείχνει την τάση. Εξυπνάδα!

Ρελέ εναλλασσόμενου ρεύματος

Ωστόσο, πρέπει να προχωρήσουμε. Όπως μπορείτε να δείτε, ο φορτιστής συναρμολογείται σταδιακά, τα καλώδια σταδιακά επιμηκύνονται και δύο νέοι χαρακτήρες εμφανίζονται στη σκηνή - το ίδιο ρελέ 220 βολτ και ένα μικρό ψυγείο δώδεκα βολτ - ογδόντα από τον υπολογιστή:

Ο Relyukha είναι συνηθισμένος, δεν διαφέρει από τους άλλους. Τραβάει 220 βολτ στα 10 αμπέρ. Αλλά δεν το χρειαζόμαστε αυτό, έχουμε μια ασφάλεια 1 αμπέρ. Αλλά μια επιφύλαξη σε τέτοια πράγματα είναι καλή, είναι αξιοπιστία. Το πηνίο αυτού του ρελέ λειτουργεί με 12 βολτ, αλλά υπάρχουν παρόμοια για 5. Αγόρασα 25 από αυτά με τη μία στο Ali, φθηνά. Γιατί πήρα 12 και όχι 5; Κοίτα, όπου κι αν το άναψα, θα χρειαζόμουν ακόμα ένα τρανζίστορ, σωστά; Κι ας ήταν 5 βολτ. Αλλά αν είναι στο 5, πρέπει να συνδεθεί μέσω ενός στελέχους, μέσω του οποίου τροφοδοτούνται ήδη όλοι οι εγκέφαλοι, θα ζεσταθεί ακόμη περισσότερο από αυτό - γιατί στο διάολο είναι τόσο απαραίτητο; Μπορείτε να χτυπήσετε απευθείας στα 12, αλλά τουλάχιστον 15 θα είναι εκεί - δεν τη νοιάζει, δουλεύει. Επιπλέον, ξεκινώντας από οκτώ βολτ. Συνέδεσα το LED σε αυτό απλώς για ένδειξη κατά τη διάρκεια της δοκιμής, όπως αν ανάψει το LED, σημαίνει ότι λειτουργεί και ουσιαστικά 220 βολτ πήγαν στον μετασχηματιστή. Συνδέεται απευθείας στην έξοδο του arduino, μέσω του ίδιου KT315, όπως και τα άλλα ρελέ στο ίδιο μπλοκ. Και ναι, το rezuk είναι επίσης 1 kOhm, αν και το 2 πιθανότατα θα λειτουργήσει εκεί, μπορείτε να εγκαταστήσετε αυτά που είναι μεγαλύτερα, αλλά έχετε κατά νου ότι όσο χαμηλότερη είναι η τιμή του rezuk, τόσο περισσότερο ρεύμα θα περάσει από το τρανζίστορ. Για γενική ενεργειακή απόδοση, αυτά τα + - μερικά milliamps δεν έχουν σημασία, αλλά για εξόδους χαμηλού ρεύματος του Arduino και των μητρώων - όχι πραγματικά, οπότε ορίστε.

Η ενεργοποίηση αυτού του ρελέ, όπως πιθανότατα έχετε ήδη καταλάβει, πραγματοποιείται χρησιμοποιώντας

digitalWrite(relay220Pin, HIGH);

Και σβήνοντας με

digitalWrite(relay220Pin, LOW);

Σύνδεση ψυγείου για ψύξη του φορτιστή

Αλλά το ψυγείο φαίνεται να καταναλώνει 140 milliamps, κρίνοντας από το αυτοκόλλητο πάνω του, οπότε το KT315 δεν θα λειτουργήσει εδώ, σύμφωνα με τις προδιαγραφές είναι μόνο μέχρι εκατό, οπότε πήρα το KT815A. Ανεβαίνουν μέχρι και μιάμιση χιλιάδες milliamps και θα είναι αρκετά. Υπάρχουν και άλλες επιλογές, απλά προσπαθώ πάντα να χρησιμοποιώ αυτό που έχω πολλά, ίσως εσύ πχ να έχεις κάποιο άλλο τρανζίστορ για το ψυγείο, αν τραβάει μέχρι 20 βολτ και μέχρι 150 μιλιαμπέρ - βάλε το, αν n-p-n, τότε απλώς κοιτάξτε το pinout για τα πόδια και αν είναι p-n-p, τότε πρέπει να αλλάξετε λίγο το κύκλωμα, αλλά σε αυτήν την περίπτωση δεν είναι όλα σημαντικά. Αλλά υπάρχει μια ακόμη απόχρωση εδώ…

Έχετε ακούσει ποτέ ένα πιο δροσερό τρίξιμο; Όχι, όχι από περιστροφή, απλά τρίξιμο; Ούτε εγώ το άκουσα, αλλά ήμουν τυχερός εδώ. Και όλα αυτά επειδή το Arduino ενδιάμεσες τιμέςΟι τάσεις εξόδου (περισσότερες από μηδέν, αλλά μικρότερες από πέντε) δημιουργούνται χρησιμοποιώντας PWM, δηλαδή, αυτές είναι γρήγορες διακυμάνσεις τάσης, ο ίδιος ο διαμορφωτής πλάτους παλμού λειτουργεί ορισμένη συχνότητακαι τα τρανζίστορ, όπως γνωρίζετε, ξέρουν επίσης πώς να λειτουργούν σε καθορισμένες συχνότητες, επομένως αυτοί οι παλμοί μεταδίδονται μέσω του τρανζίστορ στο ψυγείο και, λόγω της αρχιτεκτονικής του, αρχίζει να τρίζει. Δεν θα υπεισέλθω σε λεπτομέρειες, αφού δεν τα γνωρίζω ο ίδιος, αλλά όλα αυτά μπορούν να αντιμετωπιστούν συνδέοντας έναν αγωγό 100 mF με ένα συν στη βάση και τα μειονεκτήματα στον εκπομπό αυτού του τρανζίστορ. Η τάση εκεί είναι έως και 5 βολτ, επομένως ο συμπυκνωτής μπορεί να ρυθμιστεί σε τουλάχιστον 6,3 βολτ. Αυτό είναι όλο, το τρίξιμο θα εξαφανιστεί και δεν θα υπάρχει τίποτα απολύτως!

Ο αριθμός της επαφής PWM με την οποία ελέγχεται το ψυγείο ρυθμίζεται από την ακόλουθη παράμετρο:

// Έξοδος για έλεγχο ανεμιστήρα
byte fanPin = 6;

Οι ταχύτητες του από μηδέν (0V) έως 255 (5V) σε σχέση με τα επίπεδα ισχύος ορίζονται από την ακόλουθη διάταξη:

// Ρυθμίσεις ταχύτητας ανεμιστήρα
byte fanSpeeds=(0,0,80,90,100,110,120,180,255);

Και η ίδια η ρύθμιση αυτών των ταχυτήτων προδιαγράφεται στις διαδικασίες αύξησης και μείωσης ισχύος:

analogWrite(fanPin,fanSpeeds);

Παρεμπιπτόντως, εδώ είναι μια πιο προσεκτική ματιά στο ρελέ με το ψυγείο:

Περαιτέρω εργασία στον μπροστινό πίνακα

Αλλά ας προχωρήσουμε. Εδώ δοκίμασα ήδη την ασφάλεια στη θέση της στη νέα θήκη - η παλιά υποτίθεται ότι είχε πολλές τάσεις, αν και στην πραγματικότητα χρησιμοποιήθηκε μόνο μία, και ένα κομμάτι κόπηκε από αυτήν, και αυτό είναι σαν καινούργιο, 220 βολτ, από τις προμήθειες του πατέρα μου. Λοιπόν, τοποθέτησα το ίδιο κάτω LED και το κόλλησα με την ίδια κόλλα.

Επιτέλους, ήρθε η ώρα να συναρμολογήσετε και να τοποθετήσετε το μπροστινό πάνελ στη θέση του! Όπως μπορείτε να δείτε, όλα τα καλώδια έχουν ήδη κολληθεί, ακόμα και το Krenka πέντε βολτ προεξέχει στο κάτω μέρος του πλαισίου, βιδώνονται αποστάτες στο σώμα για να μετακινήσετε λίγο το πάνελ (το έχω ήδη μιλήσει για αυτό), γιατί πριν ήταν κολλημένο κοντά στο σώμα. Όπως καταλαβαίνετε, σε πολλά σημεία έβαλα τα καλώδια σε περιβλήματα για να μην ξεφτίσει ή να κοντύνει τίποτα πουθενά. Τα 12 βολτ προς το Krenka προέρχονται απευθείας από τη γέφυρα διόδου, με ένα καλώδιο ανώτερης κατηγορίας από ένα απλό συνεστραμμένο ζεύγος. Το μείον συνδέεται απευθείας με το κοινό μείον, αλλά το συν συνδέεται μέσω μιας διόδου, διαφορετικά ο Vasya Pupkin θα αντιστρέψει την πολικότητα κατά τη σύνδεση της μπαταρίας και αυτό είναι όλο, finita la comedy, επανακολλήστε τα μισά από τα καμένα εξαρτήματα! Και έτσι μπορείς να είσαι ήρεμος.

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

Εγκατάσταση του ελεγκτή Atmega328P με πλεξούδα και άλλα στοιχεία

Μέχρι εκείνη τη στιγμή, στη μισή από αυτές τις ίδιες πλάκες στερέωσης, είχα ήδη τοποθετήσει τη μερίδα του λέοντος από τα υπόλοιπα εξαρτήματα - μια υποδοχή για ένα μικροκύκλωμα, χαλαζία, αγωγούς, ένα τρανζίστορ για ένα ψυγείο κ.λπ. και ούτω καθεξής.:

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

Μέχρι εκείνη τη στιγμή, ο μπροστινός πίνακας είχε ήδη εγκατασταθεί τελικά στη θέση τιμής του και το Krenka πέντε volt βιδώθηκε στη θήκη πίσω από το πάνελ μέσω μιας θερμοαγώγιμης μονωτικής φλάντζας και ενός πλαστικού ένθετου για τη βίδα - χάρη σε αυτό , το μικροκύκλωμα θα ψύχεται αξιόπιστα μέσω της τεράστιας μεταλλικής θήκης, χωρίς να συνδέεται ηλεκτρικά με αυτό.

Τελική διαμόρφωση των παραμέτρων της συσκευής

Εδώ μπορείτε ήδη να δείτε πώς λειτουργεί το μισοσυναρμολογημένο σύστημα, αλλά και πάλι, μέχρι στιγμής μόνο από το τροφοδοτικό, επειδή στο σχέδιό μου η πρίζα για την ενεργοποίηση της μπαταρίας συνδέεται την τελευταία στιγμή. Λοιπόν, έγινε έτσι, τι να κάνουμε...

Μετά την ενεργοποίησή του, ανακαλύφθηκε ότι σε υψηλό ρεύμα, όταν το αμπερόμετρο σβήνει η κλίμακα, ο φορτιστής βλέπει μια τάση 0,5-0,8 βολτ μεγαλύτερη από αυτή που είναι στην πραγματικότητα στη μπαταρία αυτή τη στιγμή. Η δοκιμή έδειξε ότι μισό βολτ χάθηκε στα καλώδια, οπότε τα αντικατέστησα με καλύτερα, με μεγαλύτερη διατομή και τα κόλλησα σε ένα κρύο βύσμα που ήταν πολύ κατάλληλο για το συνολικό σχέδιο της συσκευής. Αυτό έλυσε το πρόβλημα, αλλά όχι 100 τοις εκατό - στα υψηλά ρεύματα κάποια διαφορά παρέμενε ακόμα. Αλλά σκέφτηκα ότι αυτό δεν ήταν ένα σφάλμα, αλλά ένα χαρακτηριστικό, γιατί δεν έχει νόημα να φορτίζετε την μπαταρία με τόσο υψηλά ρεύματα - αφήστε το να λειτουργήσει ως κάποιο είδος περιοριστικού παράγοντα!

Εδώ, παρεμπιπτόντως, η φόρτιση της μπαταρίας του μπαμπά είναι σε πλήρη εξέλιξη, αυτό φαίνεται στο αμπερόμετρο. Είναι αλήθεια ότι ο λαμπτήρας 220 βολτ αποδείχθηκε αρκετά αμυδρός και στις φωτογραφίες είναι σχεδόν αδύνατο να δει κανείς ότι είναι αναμμένος. Αλλά καίει, πιστέψτε με!

Ο φορτιστής είναι έτοιμος!

Ακολουθεί η κάτω όψη της συσκευής. Αρχικά, σχεδίαζα να σφραγίσω ολόκληρο το κενό μεταξύ της θήκης και του πίνακα, αλλά μετά άλλαξα γνώμη - καλύτερα να το αφήσω να αερίζεται!

Θέα από την αριστερή πλευρά. Λοιπόν, ή από τα δεξιά - εξαρτάται από το πώς το βλέπεις, συγχωρείς το λογοπαίγνιο.

Λοιπόν, αυτό είναι από ψηλά. Εδώ μπορείτε να δείτε ότι κόλλησα το πάνελ στο προεξέχον μέρος του αμπερόμετρου - αποδείχθηκε ότι ήταν ένα μεγάλο τρίτο σημείο στήριξης, διαφορετικά το πάνελ κάθισε κάπως ασταθή. Και έτσι όλα είναι υπέροχα, αξιόπιστα και όμορφα! Παρεμπιπτόντως, φανταστείτε αν αντί για κρύσταλλο χρησιμοποιούσα ένα κανονικό Moment, και μέσα από το κενό θα ήταν ορατό όλο αυτό το ανοιχτό κίτρινο χάλι. Φουουουκ! 😳

Και, φυσικά, η πίσω όψη. Τοποθέτησα μια όμορφη σχάρα στον ανεμιστήρα που προστατεύει τα δάχτυλα και άλλα άκρα ανθρώπων και ζώων από τραυματισμούς. Και εδώ μπορείτε να δείτε το νέο καλώδιο ρεύματος, το οποίο μετά τη φόρτιση βιδώνει βολικά στο ψυγείο και δεν ενοχλεί κανέναν!

Παρεμπιπτόντως, μετά τη συναρμολόγηση και τη δοκιμή της συσκευής, έπρεπε να την αποσυναρμολογήσω ξανά για να λαδώσω αυτό το καταραμένο ψυγείο, γιατί δεν το λίπανσα αμέσως, υπήρχε τέτοια σκέψη;;;

Αυτό είναι το πρώτο μου έργο σε έναν προγραμματιζόμενο μικροελεγκτή. Πέρασα σχεδόν ένα μήνα δουλεύοντας πάνω σε αυτό τα βράδια. Έκανα ακόμη και ένα διάλειμμα μιας εβδομάδας γιατί το βαρέθηκα, αυτή η δουλειά είναι τόσο βαρετή ή κάτι τέτοιο. Αλλά είμαι χαρούμενος. Είμαι ευχαριστημένος με την εμπειρία, είμαι χαρούμενος που μπόρεσα να τελειώσω αυτή τη δουλειά, είμαι χαρούμενος που πλέον έχω έναν εξαιρετικό αυτόματο φορτιστή της κατηγορίας "set it and ξέχασέ το". Και χαίρομαι που όταν οι φίλοι ή οι γνωστοί μου ρωτούν αν έχω φορτιστή για την μπαταρία τους, θα τους τον παραδώσω και θα τους πω περήφανα ότι ήμουν εγώ που έφτιαξα αυτό το υπέροχο πράγμα!

Πριν από αρκετά χρόνια, έθεσα στον εαυτό μου το καθήκον να αναπτύξω ένα σύνολο φθηνών συσκευών που θα επέτρεπαν στους τυφλούς να προσαρμοστούν καλύτερα στον κόσμο γύρω μας. Μέχρι σήμερα, μαζί με μια ομάδα ομοϊδεατών, έχω καταφέρει να υλοποιήσω αρκετά έργα.

Σε αυτό το άρθρο θέλω να μιλήσω για το εξάρτημα υπερήχων για το μπαστούνι και το μπρελόκ υπερήχων - πλήρεις συσκευές που συναρμολογούνται από φθηνές, διαθέσιμες μονάδες.

Ένα εξάρτημα μπαστούνι με υπερήχους και ένα μπρελόκ υπερήχων είναι συσκευές για τυφλούς που προειδοποιούν για εμπόδια που βρίσκονται πάνω από το επίπεδο στο οποίο μπορούν να ανιχνευθούν χρησιμοποιώντας ένα κανονικό μπαστούνι. Τέτοια εμπόδια μπορεί να είναι αυτοκίνητα υψηλής ιππασίας, εμπόδια, ψηλοί φράχτες. Το εξάρτημα υπερήχων είναι προσαρτημένο σε ένα κανονικό μπαστούνι και το μπρελόκ υπερήχων κρεμιέται στο λαιμό ή μεταφέρεται στο χέρι σαν φακός.

Η λειτουργία των συσκευών βασίζεται στην ανάκλαση υπερηχητικών κυμάτων από εμπόδια. Μετρώντας τη διαφορά χρόνου μεταξύ της στιγμής που δημιουργείται ο παλμός και της στιγμής λήψης του ανακλώμενου σήματος ηχούς, μπορεί να προσδιοριστεί η απόσταση από το εμπόδιο.

Για την ανάπτυξη συσκευών, είναι απαραίτητο να επιλέξετε έναν αισθητήρα για τη μέτρηση της απόστασης, έναν πίνακα ελέγχου και μια συσκευή σηματοδότησης, να επιλέξετε μπαταρίες, μια μέθοδο φόρτισής τους και κατάλληλα περιβλήματα.

Αισθητήρας υπερήχων

Για τη μέτρηση της απόστασης από ένα εμπόδιο, δοκιμάστηκαν δύο συσκευές:
  • Συμβατή μονάδα υπερήχων HC-SR04 με Arduino
  • Αισθητήρες στάθμευσης αυτοκινήτων HO 3800
Και οι δύο συσκευές λειτουργούν με την ίδια αρχή. Οι διαφορές έγκεινται στο μοτίβο κατεύθυνσης των αισθητήρων, στο μέγιστο εύρος ανίχνευσης εμποδίων και στο σχεδιασμό.
Σύγκριση παραμέτρων αισθητήρα:

Κατά τη διάρκεια των δοκιμών, αποδείχθηκε ότι οι μονάδες HC-SR04 έχουν ελαφρώς χειρότερη ικανότητα να ανιχνεύουν εμπόδια και να λειτουργούν σε δύσκολες κλιματολογικές συνθήκες (κρύο).

Και οι δύο αισθητήρες, παρά τις διαφορές τους, μπορούν να χρησιμοποιηθούν σε προσάρτηση ζαχαροκάλαμου υπερήχων ως μέσο μέτρησης της απόστασης από ένα εμπόδιο, επομένως η κύρια παράμετρος για εμάς κατά την επιλογή ενός αισθητήρα ήταν η τιμή. Καταλήξαμε στον φθηνότερο αισθητήρα HC-SR04.

Πίνακας ελέγχου

Ως πίνακας ελέγχου επιλέχθηκε η πλατφόρμα Arduino. Στην περίπτωσή μας, οι πιο εφαρμόσιμες πλακέτες είναι οι μινιατούρες εκδόσεις: Arduino Mini, Arduino Nano ή Arduino ProΜίνι. Γενικά, μπορεί να χρησιμοποιηθεί οποιοσδήποτε άλλος ελεγκτής που παρέχει παρόμοιες δυνατότητες.

Μπαταρίες

Για την παροχή ρεύματος στη συσκευή, συνιστάται η χρήση στοιχείων μπαταρίας ιόντων λιθίου (Li-ion) ή νικελίου-υδριδίου μετάλλου (Ni-Mh).

Κατά τη λειτουργία σε κανονικές κλιματικές συνθήκες, είναι λογικό να χρησιμοποιείτε μπαταρίες Li-ion, οι οποίες έχουν τα ακόλουθα πλεονεκτήματα σε σύγκριση με το Ni-Mh:

  • ευκολία υλοποίησης του κυκλώματος φόρτισης
  • διαθεσιμότητα έτοιμων μονάδων φόρτισης
  • υψηλότερη τάση εξόδου
  • πολλαπλούς συνολικές διαστάσειςκαι δοχεία
Σε χαμηλές θερμοκρασίες, είναι προτιμότερο να χρησιμοποιείτε μπαταρίες Ni-Mh.

Η τάση στην έξοδο μιας μπαταρίας Ni-Mh (1,0 -1,4 V) δεν είναι αρκετή για τη λειτουργία της συσκευής. Για να αποκτήσουμε τάση 5 V (απαραίτητη για τη λειτουργία τόσο του Arduino όσο και του αισθητήρα στάθμευσης), εκτός από τις μπαταρίες, θα χρησιμοποιήσουμε έναν μετατροπέα DC-DC ενίσχυσης.

Για τη λειτουργία των μετατροπέων DC-DC που έχουμε επιλέξει, είναι απαραίτητο να παρέχεται τάση εισόδου 0,9-6,0 V. Για να αποκτήσετε την απαιτούμενη τάση εξόδου, θα μπορούσατε να χρησιμοποιήσετε ένα στοιχείο Ni-Mh με τάση 1,2 βολτ. Ωστόσο, καθώς μειώνεται η τάση εισόδου, μειώνεται και η χωρητικότητα φορτίου του μετατροπέα, άρα για σταθερή λειτουργίαΣυνιστάται να τροφοδοτείτε τη συσκευή με τουλάχιστον 2 V στην είσοδο του μετατροπέα (δύο στοιχεία Ni-Mh 1,2 V το καθένα ή ένα στοιχείο Li-ion με τάση 3,7 V). Σημειώστε ότι υπάρχουν μετατροπείς DC-DC για τους οποίους η τάση εισόδου 1,2 V δεν αρκεί.

Φόρτιση μπαταριών

Για Μπαταρίες Li-ionΥπάρχουν πολλές έτοιμες φθηνές μονάδες με ένδειξη λήξης χρέωσης.

Στην περίπτωση των μπαταριών Ni-Mh, όλα είναι πιο περίπλοκα. Δεν έχουμε βρει έτοιμες ενσωματωμένες λύσεις στην αγορά αυτή τη στιγμή. Για να φορτίσετε μπαταρίες Ni-Mh, μπορείτε να χρησιμοποιήσετε εξειδικευμένους εξωτερικούς φορτιστές ή να δημιουργήσετε το δικό σας κύκλωμα φόρτισης.

Ένας τρόπος φόρτισης μιας κυψέλης Ni-Mh είναι σειριακή σύνδεσημε μια μπαταρία δύο γραμμικών σταθεροποιητών LM317 (ή παρόμοιο): ο πρώτος - σε λειτουργία περιορισμού ρεύματος, ο δεύτερος - σε λειτουργία περιορισμού τάσης.

Η τάση εισόδου ενός τέτοιου κυκλώματος είναι 7,0-7,5 V. Ελλείψει ψύξης των σταθεροποιητών, δεν συνιστάται η υπέρβαση αυτής της τάσης. Η τάση σε κάθε μπαταρία Ni-Mh κατά τη φόρτιση θα πρέπει να είναι περίπου 1,45 V (τάση μιας πλήρως φορτισμένης κυψέλης Ni-Mh). Για να αποφευχθεί η υπερθέρμανση και η αστοχία των μικροκυκλωμάτων, το ρεύμα φόρτισης της μπαταρίας δεν πρέπει να υπερβαίνει τα 100 mA και μπορεί να αυξηθεί στα 200 mA όταν χρησιμοποιείτε κατάλληλα καλοριφέρ.

Το πλεονέκτημα αυτού του συστήματος φόρτισης είναι ότι δεν υπάρχει ανάγκη ελέγχου της κατάστασης φόρτισης: όταν επιτευχθεί η απαιτούμενη τάση στο στοιχείο, το ρεύμα θα πέσει αυτόματα στο ασφαλές ελάχιστο.

Τρομάζω

Ανάλογα με την επιλογή του καναλιού προειδοποίησης (ακουστικό ή απτικό), επιλέγεται ένας ενεργοποιητής - ένας βομβητής ή ένας κινητήρας δόνησης. Επιπλέον, μπορείτε να συνδυάσετε και τις δύο μεθόδους ειδοποίησης, δίνοντας στον χρήστη τη δυνατότητα εναλλαγής μεταξύ τους.

Κατά τη διάρκεια δοκιμών πρωτοτύπων, ανακαλύψαμε ότι είναι πιο βολικό να μεταδίδουμε πληροφορίες σχετικά με την εγγύτητα ενός εμποδίου μέσω δόνησης, επειδή σε αυτή την περίπτωση δεν ασχολείται με κάτι πολύ σημαντικό για τυφλό άτομοκανάλι ήχου. Γι' αυτό όλα τα σχεδιασμένα και συναρμολογημένα προϊόντα μας χρησιμοποιούν κραδασμούς για να προειδοποιούν για εμπόδια. Η ένταση της δόνησης είναι ανάλογη της απόστασης από το εμπόδιο.

Πλαίσιο

Δεν μπορέσαμε να βρούμε ένα βολικό περίβλημα για τη σύνδεση του ζαχαροκάλαμου υπερήχων μεταξύ των περιβλημάτων μαζικής παραγωγής. Για να δοκιμάσουμε τη συσκευή, χρησιμοποιήσαμε μια 3D εκτυπωμένη πλαστική θήκη ABS. Για την εκτύπωση της θήκης σε εκτυπωτή 3D, αναπτύξαμε το ακόλουθο τρισδιάστατο μοντέλο:

Αποτέλεσμα δοκιμής πρωτοτύπων

Κατά τη διαδικασία ανάπτυξης, συγκεντρώθηκαν περισσότερες από 12 επιλογές προϊόντων. Κάθε νέο προϊόν εξαλείφει τις ελλείψεις των προηγούμενων: ​​κατά τη διαδικασία ανάπτυξης μειώσαμε τις διαστάσεις και το βάρος του προϊόντος, επιλέξαμε έναν αισθητήρα υπερήχων που μας ικανοποιούσε τόσο σε τιμή όσο και σε τεχνικά χαρακτηριστικά, εγκαταλείψαμε τη χρήση ενός καναλιού ήχου και βελτιστοποιήσαμε τη λειτουργία αλγόριθμος των συσκευών. Μαζί με τους τυφλούς (Bortnikov P.V., Shalintsev V.A.), πραγματοποιήθηκαν δοκιμές όλων των συναρμολογημένων προϊόντων. Ως αποτέλεσμα, λάβαμε το τελικό δείγμα.

Παρακάτω είναι ένα σχηματικό ηλεκτρικό διάγραμμα της ανεπτυγμένης συσκευής:

Όταν αποσυναρμολογηθεί, το μπρελόκ υπερήχων λαιμού μοιάζει με αυτό:

Όλα τα εξαρτήματα που χρησιμοποιήθηκαν στη συναρμολόγηση, εκτός από το τρισδιάστατο εκτυπωμένο περίβλημα για το εξάρτημα μπαστούνι, αγοράστηκαν μέσω του AliExpress:

  1. Αισθητήρας υπερήχων HC-SR04.
  2. Πίνακας ελέγχου Adruino Pro Mini.
  3. Επαναφορτιζόμενη μπαταρία 3,7 V 300 mAh.
  4. Μετατροπέας τάσης 0,9V ~ 5V σε 5V 600 mA.
  5. Μονάδα φόρτισης AC/DC 220V έως 5 V 1 A.
  6. Φορτιστής LA-520W.
  7. Συναγερμός: κινητήρας δόνησης για κινητό τηλέφωνο 4x10mm DC 3V.
  8. Κουμπί PB-22E60.
  9. Στέγαση Gainta G1906 (για μπρελόκ).
  10. Τρανζίστορ: bss138/bcr108 ή οπτοζεύκτης CPC1230N.
Η εμφάνιση και οι τιμές (συμπεριλαμβανομένης της παράδοσης από την Κίνα) των εξαρτημάτων που χρησιμοποιούνται για τη συναρμολόγηση της κεφαλής υπερήχων στο μπαστούνι φαίνονται στο σχήμα:

Από τα εξαρτήματα που χρησιμοποιούνται κατά τη συναρμολόγηση, η μεγαλύτερη συνεισφορά στο κόστος της συσκευής προέρχεται από το 3D εκτυπωμένο περίβλημα.

Η εμφάνιση και οι τιμές (συμπεριλαμβανομένης της παράδοσης από την Κίνα) των εξαρτημάτων που χρησιμοποιούνται για τη συναρμολόγηση του μπρελόκ υπερήχων φαίνονται στο σχήμα:

Στο μέλλον, μπορείτε να αναπτύξετε μια βάση για το σώμα Gainta G1906 και να χρησιμοποιήσετε μια συσκευή με τέτοιο σώμα ως εξάρτημα για μπαστούνι.

Ένας από τους τρόπους μείωσης του κόστους των συσκευών είναι η εξοικονόμηση κόστους εργασίας και του κόστους παράδοσης εξαρτημάτων συσκευών στη Ρωσία, με την ανάπτυξη της παραγωγής απευθείας στην Κίνα.

Οι συσκευές που έχουμε αναπτύξει έχουν τα ακόλουθα χαρακτηριστικά:

Μετά τη διεξαγωγή προκαταρκτικών δοκιμών των συσκευών, αναγκαστήκαμε να περιορίσουμε το εύρος ανίχνευσης εμποδίων στο 1,5 μέτρο, προκειμένου να αποφευχθεί η άσκοπη ενεργοποίηση κατά τη χρήση των συσκευών σε περιβάλλον με συνωστισμό. Στο συνεχής αλλαγήΤο επίπεδο δόνησης είναι πιο δύσκολο να προσδιοριστεί η προσέγγιση ενός εμποδίου, επομένως με βάση τα αποτελέσματα των προκαταρκτικών δοκιμών, καταλήξαμε στο τρία επίπεδαδονήσεις.
Εμφάνιση του προσαρτήματος υπερήχων στο μπαστούνι:

Εμφάνιση του μπρελόκ λαιμού:

Ένα τρισδιάστατο μοντέλο του προσαρτήματος ζαχαροκάλαμου υπερήχων και ο πηγαίος κώδικας υλικολογισμικού για το Adruino είναι διαθέσιμα για λήψη στη διεύθυνση

Ελεγκτής Arduino PWM ηλιακή φόρτιση
Πώς να φτιάξετε έναν πολύ μικρό, απλό και φθηνό ελεγκτή ηλιακής φόρτισης PWM με το Arduino Pro Mini για ρυθμίσεις εκτός δικτύου 12V. Μέγεθος πλακέτα τυπωμένου κυκλώματοςταιριάζει με το μέγεθος της μίνι πλακέτας Pro, ώστε να μπορούν να στερεωθούν μεταξύ τους. Το PCB σχεδιάζει για μια γενική πρωτότυπη πλακέτα.

Σύνδεση και χρήση αυτού του ελεγκτή Arduino ηλιακό φορτίοπολύ απλό - υπάρχουν 2 καλώδια εισόδου από τον πίνακα ηλιακούς συλλέκτες(+ και -) και 2 έξοδοι οδηγούν σε μπαταρία μολύβδου-οξέος. Η βάση του ηλιακού πάνελ και οι μπαταρίες συνδέονται μεταξύ τους. Οποιοδήποτε φορτίο πρέπει να συνδεθεί απευθείας στους ακροδέκτες της μπαταρίας και ο ελεγκτής φόρτισης θα χειριστεί αυτόματα τα υπόλοιπα.

Το Arduino μετρά τακτικά την τάση της μπαταρίας μολύβδου οξέος σύμφωνα με μια συγκεκριμένη τιμή, αλλάζει το MOSFET για να φορτίσει την μπαταρία από το ηλιακό πάνελ και απενεργοποιεί το MOSFET όταν η μπαταρία είναι πλήρως φορτισμένη. Όταν το φορτίο αντλεί ισχύ από την μπαταρία, ο ελεγκτής ανιχνεύει την πτώση τάσης και αμέσως αρχίζει να φορτίζει ξανά την μπαταρία. Κατά τη διάρκεια της νύχτας, όταν το ηλιακό πάνελ σταματά να παράγει, ο ελεγκτής περιμένει έως ότου το πάνελ αρχίσει να εκπέμπει ξανά.


Απαιτείται θετικό καλώδιο στο ηλιακό πάνελ δίοδος προστασίαςΤο Schottky εγκαθίσταται απευθείας στο καλώδιο (τυλιγμένο σε θερμοσυστελλόμενο σωλήνα). Αυτό δεν περιλαμβάνεται στο κύριο PCB, καθώς αυτό διευκολύνει την αντικατάστασή του και ταυτόχρονα την ψύξη του. Μπορείτε εύκολα να κάνετε την πλακέτα λίγο μακρύτερη για να ταιριάζει σε διαφορετικό τύπο διόδου.

Περιγραφή κυκλώματος και λειτουργίας:

Η λειτουργία βασίζεται στο τρανζίστορ MOS N-καναλιού IRF3205 Ψηλή πλευράαλυσίδες. Αυτό απαιτεί τάση πύλης μεγαλύτερη από 12 V για να ενεργοποιηθεί σωστά το MOSFET. Προκειμένου να εξαλειφθεί η ανάγκη εξωτερικό πρόγραμμα οδήγησης MOSFET, κινείται από μια αντλία φόρτισης που δημιουργήθηκε με διόδους, 2 πυκνωτές και δύο ακροδέκτες εξόδου Arduino PWM (3 και 11). Ο ακροδέκτης A1 μετρά την τάση της μπαταρίας και ο ακροδέκτης 9 ελέγχει τον κύκλο ON/OFF του MOSFET. Η ενσωματωμένη λυχνία LED Arduino Pro Mini που είναι συνδεδεμένη στον ακροδέκτη 13 χρησιμοποιείται για να δείξει τον τρέχοντα κύκλο του σήματος PWM.

Ο ρυθμιστής τάσης και όλοι οι πυκνωτές γύρω (C6, C5 και C4) θα μπορούσαν να εξαλειφθούν καθώς υπάρχει ρυθμιστής που περιλαμβάνεται στο Arduino Pro Mini. Ωστόσο, επειδή χρησιμοποιούσα μια φθηνή πλακέτα κλώνου, δεν ήθελα να βασιστώ στην ικανότητά της να υποστηρίζει υψηλότερες τάσεις από 12 V για μεγαλύτερες χρονικές περιόδους. Το LP2950 είναι πολύ φθηνό και αποδοτικό έως και 30 βολτ, οπότε αξίζει να το έχετε στο σκάφος ούτως ή άλλως.


Λίστα ανταλλακτικών: Ρυθμιστής χαμηλής τάσης LP2950ACZ-5.0 Τρανζίστορ 2N3904 2N3906 x 2 N-channel MOSFET IRF3205 Αντιστάσεις 82K (1%) 20K (1%) 220K x3 (0,4W είναι αρκετό) 4KW1 είναι αρκετό 4K7 x4 Diode. P6KE33CA 90SQ035 (ή οποιοδήποτε παρόμοιο σχήμα παράστασης 35V ελάχιστο 9A) πυκνωτές 47n / 50V x2 κεραμικό 220p / 100V κεραμικό 1m / 50V (1000NF) κεραμικό 4M7 / 10V Tantal dance

Το κύκλωμα και ο κωδικός για αυτόν τον ελεγκτή φόρτισης είναι του Julian Ilett, είναι ο εγκέφαλος πίσω από αυτό το έξυπνο πράγμα. Όλα αυτά είναι απλώς εξελιγμένη τεκμηρίωση και κατάλληλο σχέδιο PCB για να ταιριάζει απόλυτα με την πλακέτα Arduino Pro Mini. Μοιράζεται ένα βίντεο με έναν πιο αποτελεσματικό ρυθμιστή φόρτισης Arduino MPPT, αλλά η κατασκευή του είναι πολύ πιο περίπλοκη και το έργο δεν έχει ακόμη ολοκληρωθεί. Εάν μπορείτε να βελτιώσετε τον κώδικα ή το σχέδιο με οποιονδήποτε τρόπο, μοιραστείτε τις βελτιώσεις σας στα σχόλια.



Η μαγνητική επαγωγή είναι μια τεχνολογία που θυμάστε πιθανώς από το μάθημα της φυσικής του γυμνασίου. Για ασύρματη μετάδοσηενέργειας θα χρειαστείτε δύο πηνία: ένα πηνίο πομπού και ένα πηνίο δέκτη. Το εναλλασσόμενο ρεύμα στο πηνίο του πομπού δημιουργεί ένα μαγνητικό πεδίο, το οποίο προκαλεί μια τάση στο πηνίο του δέκτη. Αυτή η τάση μπορεί να χρησιμοποιηθεί για τροφοδοσία κινητή συσκευήή για να φορτίσετε την μπαταρία.


Όχι λιγότερο σημαντικά στοιχεία θα είναι τα επαγωγικά, τα οποία μπορείτε να φτιάξετε με τα χέρια σας. Αυτά τα απλά πηνία τυλίγονται από χάλκινα σύρματα και ονομάζονται πηνία πυρήνα αέρα. Η δημιουργία μιας τέτοιας περιέλιξης για το σκοπό μας είναι πολύ απλή. Βρείτε έναν στρογγυλό κύλινδρο με διάμετρο περίπου 5 εκατοστά και τυλίξτε το σύρμα γύρω του έτσι ώστε κάθε στροφή να μην επικαλύπτει άλλη στροφή, αλλά ταυτόχρονα να είναι όσο το δυνατόν πιο κοντά στην άλλη στροφή. Ένας στρογγυλός κύλινδρος μπορεί να είναι, για παράδειγμα, ένας σωλήνας PVC. Ίσως χρειαστεί να χρησιμοποιήσετε κολλητική ταινία ή ταινία σε 2-3 σημεία για να διατηρήσετε τη δομή σταθερή.


Εκτός από το Arduino και τα πηνία, θα χρειαστούμε: ένα τρανζίστορ NPN τύπου 2N3055, μία γέφυρα διόδου 1Α (σύνολο διόδου, έχουν τέσσερις ακροδέκτες), ένα LED, μία αντίσταση 100 ohm, δύο πυκνωτές 47 nF, μπαταρία 9 V τροφοδοτήστε το Arduino , και επίσης κατά προτίμηση δύο πλακέτες για πρωτότυπο. Το διάγραμμα για τη σύνδεση των εξαρτημάτων για τη δημιουργία μιας συσκευής ασύρματης μετάδοσης δεδομένων φαίνεται στην παρακάτω εικόνα.



Το κύκλωμα μπορεί να ελεγχθεί χρησιμοποιώντας τον απλό κώδικα Arduino παρακάτω.


void setup() ( pinMode(13,OUTPUT); ) void loop() ( digitalWrite(13,HIGH); delay(0.5); digitalWrite(13,LOW); delay(0.5); )

Ωστόσο, μια απλή συσκευή ασύρματης μεταφοράς ενέργειας μπορεί να κατασκευαστεί χωρίς Arduino. Βασικά, μπορούμε να χρησιμοποιήσουμε μόνο ένα τρανζίστορ 2N2222. Συνδέστε τον ακροδέκτη της βάσης του στο πρώτο άκρο του πηνίου και τον συλλέκτη του στο άλλο άκρο του πηνίου. Η ακίδα του πομπού είναι συνδεδεμένη με την μπαταρία. Ως αποτέλεσμα, ένας τόσο απλός σχεδιασμός μπορεί να μοιάζει με αυτό:




   Σας ευχαριστούμε για το ενδιαφέρον σας πληροφοριακό έργοδικτυακός τόπος.
   Αν θέλετε ενδιαφέρον και χρήσιμα υλικάέβγαινε πιο συχνά και υπήρχε λιγότερη διαφήμιση,
   Μπορείτε να υποστηρίξετε το έργο μας δωρίζοντας οποιοδήποτε ποσό για την ανάπτυξή του.

Ένα Arduino και το προστιθέμενο κύκλωμα φόρτισής του μπορούν να χρησιμοποιηθούν για την παρακολούθηση και τον έλεγχο της φόρτισης των μπαταριών NiMH, ως εξής:

Ολοκληρωμένη συσκευή

Οι επαναφορτιζόμενες μπαταρίες είναι με υπέροχο τρόπογια να τροφοδοτήσετε τα φορητά ηλεκτρονικά σας. Μπορούν να σας εξοικονομήσουν πολλά χρήματα όταν σωστή φόρτιση. Για να αξιοποιήσετε στο έπακρο μπαταρίες, πρέπει να χρεωθούν σωστά. Αυτό σημαίνει ότι χρειάζεστε έναν καλό φορτιστή. Μπορείτε να ξοδέψετε πολλά χρήματα αγοράζοντας έναν έτοιμο φορτιστή ή μπορείτε να διασκεδάσετε φτιάχνοντας έναν μόνοι σας. Σε αυτό το άρθρο θα δούμε πώς μπορείτε να δημιουργήσετε έναν φορτιστή που ελέγχεται από το Arduino.

Πρώτον, είναι σημαντικό να σημειωθεί ότι δεν υπάρχει καθολική μέθοδοςφορτιστή που θα ήταν κατάλληλος για όλες τις μπαταρίες. Διαφορετικοί τύποι μπαταριών χρησιμοποιούν διαφορετικές χημικές διεργασίες για να λειτουργήσουν. Σαν άποτέλεσμα, ΔΙΑΦΟΡΕΤΙΚΟΙ ΤΥΠΟΙΟι μπαταρίες πρέπει να φορτίζονται διαφορετικά. Δεν μπορούμε να καλύψουμε όλους τους τύπους μπαταριών και τις μεθόδους φόρτισης σε αυτό το άρθρο. Έτσι, για λόγους απλότητας, θα επικεντρωθούμε στον πιο κοινό τύπο μπαταρίας AA, την μπαταρία Nickel Metal Hydride (NiMH).

αξεσουάρ

Λίστα εξαρτημάτων από αριστερά προς τα δεξιά:

  • ισχυρή αντίσταση 10 Ohm (τουλάχιστον 5 watt).
  • αντίσταση 1 MOhm;
  • πυκνωτής 1 μF;
  • Τρανζίστορ MOSFET IRF510;
  • αισθητήρας θερμοκρασίας TMP36;
  • Τροφοδοτικό 5 βολτ?

Πώς να φορτίσετε τις μπαταρίες NiMH AA

Η αύξηση του ρυθμού φόρτισης αυξάνει τον κίνδυνο βλάβης της μπαταρίας.

Υπάρχουν πολλοί τρόποι για να φορτίσετε τις μπαταρίες NiMH. Η μέθοδος που χρησιμοποιείτε εξαρτάται κυρίως από το πόσο γρήγορα θέλετε να φορτίσετε την μπαταρία σας. Ο ρυθμός φόρτισης μετριέται σε σχέση με τη χωρητικότητα της μπαταρίας. Εάν η μπαταρία σας έχει χωρητικότητα 2500 mAh και τη φορτίζετε στα 2500 mA, τότε τη φορτίζετε με ρυθμό 1C. Εάν φορτίζετε την ίδια μπαταρία στα 250 mA, τότε τη φορτίζετε με ρυθμό C/10.

Στη διάρκεια γρήγορη φόρτισημπαταρία (σε ταχύτητες πάνω από C/10), πρέπει να παρακολουθείτε προσεκτικά την τάση και τη θερμοκρασία της μπαταρίας για να αποφύγετε την υπερφόρτισή της. Αυτό μπορεί να βλάψει σοβαρά την μπαταρία. Ωστόσο, όταν φορτίζετε την μπαταρία σας αργά (με ρυθμό χαμηλότερο από C/10), είναι πολύ λιγότερο πιθανό να καταστρέψετε την μπαταρία εάν την υπερφορτίσετε κατά λάθος. Επομένως, οι μέθοδοι αργής φόρτισης θεωρούνται γενικά πιο ασφαλείς και θα σας βοηθήσουν να αυξήσετε τη διάρκεια ζωής της μπαταρίας. Επομένως, στον σπιτικό φορτιστή μας θα χρησιμοποιήσουμε μια χρέωση φόρτισης C/10.

Κύκλωμα φόρτισης

Για αυτόν τον φορτιστή, η βάση είναι ένα κύκλωμα για τον έλεγχο της τροφοδοσίας με χρησιμοποιώντας Arduino. Το κύκλωμα τροφοδοτείται από μια πηγή 5 volt, για παράδειγμα, από έναν προσαρμογέα εναλλασσόμενο ρεύμαή μονάδα υπολογιστήθρέψη. Τα περισσότερα USBθύρες ακατάλληλες για αυτού του έργουλόγω των σημερινών περιορισμών. Η πηγή 5V φορτίζει την μπαταρία μέσω μιας ισχυρής αντίστασης 10 Ohm και ισχυρό MOSFETτρανζίστορ. Το τρανζίστορ MOSFET ρυθμίζει την ποσότητα του ρεύματος που ρέει μέσω της μπαταρίας. Η αντίσταση προστίθεται ως ένας απλός τρόπος ελέγχου του ρεύματος. Η παρακολούθηση της ποσότητας ρεύματος γίνεται συνδέοντας κάθε ακροδέκτη αντίστασης στους αναλογικούς ακροδέκτες εισόδου του Arduino και μετρώντας την τάση σε κάθε πλευρά. Τρανζίστορ MOSFET ελεγχόμενο από έξοδο PWM Καρφίτσα Arduino. Οι παλμοί του σήματος διαμόρφωσης πλάτους παλμού εξομαλύνονται DC τάσηφίλτρο σε αντίσταση 1 MΩ και πυκνωτή 1 μF. Αυτό το κύκλωμα επιτρέπει στο Arduino να παρακολουθεί και να ελέγχει το ρεύμα που διαρρέει την μπαταρία.


αισθητήρας θερμοκρασίας

Ο αισθητήρας θερμοκρασίας χρησιμοποιείται για την αποφυγή υπερφόρτισης της μπαταρίας και την ασφάλεια.

Ως πρόσθετη προφύλαξη, έχει προστεθεί ένας αισθητήρας θερμοκρασίας TMP36 στον φορτιστή για την παρακολούθηση της θερμοκρασίας της μπαταρίας. Αυτός ο αισθητήρας παράγει μια τάση που ποικίλλει γραμμικά με τη θερμοκρασία. Επομένως, σε αντίθεση με τα θερμίστορ, δεν απαιτεί βαθμονόμηση ή ζυγοστάθμιση. Ο αισθητήρας είναι εγκατεστημένος σε μια τρυπημένη οπή στο σώμα της θήκης της μπαταρίας και είναι κολλημένος στην οπή έτσι ώστε να πιέζει την μπαταρία όταν τοποθετείται στη θήκη. Οι ακροδέκτες του αισθητήρα συνδέονται στον δίαυλο 5V, στη θήκη και στον ακροδέκτη αναλογικής εισόδου του Arduino.

Υποδοχή μπαταρίας ΑΑ πριν και μετά την τοποθέτηση στο breadboard

Κώδικας


Ο κώδικας για αυτό το έργο είναι αρκετά απλός. Μεταβλητές στην αρχή πηγαίος κώδικαςσας επιτρέπει να διαμορφώσετε τον φορτιστή εισάγοντας τη χωρητικότητα της μπαταρίας και την ακριβή αντίσταση της αντίστασης υψηλής ισχύος. Προστέθηκαν επίσης μεταβλητές ασφαλούς ορίου. Η μέγιστη επιτρεπόμενη τάση μπαταρίας έχει ρυθμιστεί στα 1,6 βολτ. Η μέγιστη θερμοκρασία της μπαταρίας έχει ρυθμιστεί στους 35 βαθμούς Κελσίου. Ο μέγιστος χρόνος φόρτισης έχει οριστεί στις 13 ώρες. Εάν ξεπεραστεί κάποιο από αυτά τα όρια ασφαλείας, ο φορτιστής απενεργοποιείται.

Στο σώμα του προγράμματος μπορείτε να δείτε ότι το σύστημα μετρά συνεχώς την τάση στους ακροδέκτες μιας ισχυρής αντίστασης. Αυτό χρησιμοποιείται για τον υπολογισμό της τάσης στην μπαταρία και του ρεύματος που τη διαρρέει. Το ρεύμα συγκρίνεται με την τιμή στόχο, η οποία είναι C/10. Εάν το υπολογιζόμενο ρεύμα διαφέρει από τιμή στόχουπερισσότερο από 10 mA, το σύστημα προσαρμόζει αυτόματα την τιμή εξόδου για να τη διορθώσει.

Το Arduino χρησιμοποιεί μια σειριακή διεπαφή για να εμφανίσει όλα τα τρέχοντα δεδομένα. Εάν θέλετε να παρακολουθείτε τη λειτουργία του φορτιστή σας, μπορείτε να συνδέσετε το Arduino στη θύρα USB του υπολογιστή, αλλά αυτό δεν είναι απαραίτητο αφού το Arduino τροφοδοτείται από την πηγή τάσης 5V του φορτιστή.

Χωρητικότητα μπαταρίας Int = 2500; // Τιμή χωρητικότητας μπαταρίας σε mAh αντίσταση επίπλευσης = 10,0; // μετρημένη αντίσταση της ισχυρής αντίστασης int cutoffVoltage = 1600; // μέγιστη τάση μπαταρίας (σε mV) που δεν πρέπει να ξεπεραστεί. // μέγιστη θερμοκρασία μπαταρίας που δεν πρέπει να ξεπερνιέται (σε ​​βαθμούς C) //διακοπή διακοπής floatTemperatureF = 95; // μέγιστη θερμοκρασία μπαταρίας που δεν πρέπει να ξεπεραστεί (σε βαθμούς F) long cutoffTime = 46800000; // ο μέγιστος χρόνος φόρτισης είναι 13 ώρες, ο οποίος δεν θα πρέπει να υπερβαίνεται int outputPin = 9; // το καλώδιο σήματος εξόδου είναι συνδεδεμένο στην ψηφιακή ακίδα 9 int outputValue = 150; // τιμή του σήματος PWM εξόδου int analogPinOne = 0; // ο πρώτος αισθητήρας τάσης είναι συνδεδεμένος στην αναλογική ακίδα 0 float valueProbeOne = 0; // μεταβλητή για την αποθήκευση της τιμής στο analogPinOne float voltageProbeOne = 0; // υπολογισμένη τάση στο analogPinOne int analogPinTwo = 1; // ο δεύτερος αισθητήρας τάσης είναι συνδεδεμένος στην αναλογική ακίδα 1 float valueProbeTwo = 0; // μεταβλητή για την αποθήκευση της τιμής στο analogPinTwo float voltageProbeTwo = 0; // υπολογισμένη τάση στο analogPinTwo int analogPinThree = 2; // ο τρίτος αισθητήρας τάσης είναι συνδεδεμένος στην αναλογική ακίδα 2 float valueProbeThree = 0; // μεταβλητή για αποθήκευση της τιμής στο analogPinThree float tmp36Voltage = 0; // υπολογισμένη τάση σε αναλογικήPinThree float θερμοκρασίαC = 0; //υπολογισμένη θερμοκρασία αισθητήρα σε βαθμούς C //θερμοκρασία πλωτήραF = 0; // υπολογισμένη θερμοκρασία αισθητήρα σε βαθμούς F float voltageDifference = 0; // διαφορά μεταξύ τάσεων σε analogPinOne και analogPinTwo float μπαταρίαΤάση = 0; // υπολογισμένη τάση μπαταρίας ρεύμα πλεύσης = 0; // υπολογισμένο ρεύμα που διαρρέει το φορτίο σε (mA) float targetCurrent = μπαταρία Χωρητικότητα / 10; // Το στοχευόμενο ρεύμα εξόδου (σε mA) έχει ρυθμιστεί σε // C/10 ή 1/10 της χωρητικότητας της μπαταρίας ρεύμα πλεύσης Σφάλμα = 0; // διαφορά μεταξύ στόχου και πραγματικών ρευμάτων (σε mA) void setup() ( Serial.begin(9600); // setup σειριακή διεπαφή pinMode(outputPin, OUTPUT); // ορίστε την ακίδα ως έξοδο ) void loop() ( analogWrite(outputPin, outputValue); // γράψτε την τιμή εξόδου στην ακίδα εξόδου Serial.print("Output:"); // εμφάνιση των τιμών εξόδου για παρακολούθηση στον υπολογιστή Serial.println (outputValue); valueProbeOne = analogRead(analogPinOne); // διαβάστε την τιμή εισόδου στον πρώτο αισθητήρα voltageProbeOne = (valueProbeOne*5000)/1023; // υπολογίστε την τάση στον πρώτο αισθητήρα σε χιλιοστόβολα Serial. print("Voltage Probe One (mV): "); // εμφάνιση της τάσης στον πρώτο αισθητήρα Serial.println(voltageProbeOne); valueProbeTwo = analogRead(analogPinTwo); // ανάγνωση της τιμής εισόδου στον δεύτερο αισθητήρα voltageProbeTwo = (valueProbeTwo *5000)/1023; // υπολογίστε την τάση στο δεύτερο αισθητήρα σε χιλιοστόβολτα Serial.print("Voltage Probe Two (mV): "); // εμφάνιση της τάσης στον δεύτερο αισθητήρα Serial.println(voltageProbeTwo); μπαταρίαΤάση = 5000 - voltageProbeTwo; // υπολογίστε την τάση στην μπαταρία Serial.print("Τάση μπαταρίας ( mV): "); // εμφάνιση τάσης μπαταρίας Serial.println(batteryVoltage); ρεύμα = (voltageProbeTwo - voltageProbeOne) / αντίσταση; // Υπολογίστε το ρεύμα φόρτισης Serial.print("Target Current (mA): "); // εμφάνιση του τρέχοντος στόχου Serial.println(targetCurrent); Serial.print("Ρεύμα μπαταρίας (mA): "); // εμφάνιση του τρέχοντος Serial.println(current); τρέχονΣφάλμα = targetCurrent - τρέχον; // διαφορά μεταξύ στόχου και μετρούμενων ρευμάτων Serial.print("Τρέχον σφάλμα (mA): "); // εμφάνιση τρέχοντος σφάλματος ρύθμισης Serial.println(currentError); valueProbeThree = analogRead(analogPinThree); // διαβάστε την τιμή εισόδου του τρίτου αισθητήρα, tmp36Voltage = valueProbeThree * 5.0; // μετατροπή του σε τάση tmp36Voltage /= 1024.0; θερμοκρασίαC = (tmp36Τάση - 0,5) * 100 ; // μετατροπή βασισμένη σε εξάρτηση 10 mV ανά βαθμό με μετατόπιση 500 mV // ((τάση - 500 mV) πολλαπλασιαζόμενη επί 100) Serial.print("Θερμοκρασία (βαθμοί C) "); // εμφάνιση θερμοκρασίας σε βαθμούς Κελσίου Serial.println(temperatureC); /* θερμοκρασία F = (θερμοκρασίαC * 9,0 / 5,0) + 32,0; //μετατροπή σε βαθμούς Φαρενάιτ Serial.print("Θερμοκρασία (βαθμοί F)"); Serial.println(temperatureF); */ Serial.println(); // πρόσθετες κενές γραμμές για ευκολότερη ανάγνωση των δεδομένων κατά τον εντοπισμό σφαλμάτων Serial.println(); if(abs(currentError) > 10) // εάν το τρέχον σφάλμα ρύθμισης είναι αρκετά μεγάλο, τότε ρυθμίστε την τάση εξόδου ( outputValue = outputValue + currentError / 10; if(outputValue< 1) // выходное значение никогда не может быть ниже 0 { outputValue = 0; } if(outputValue >254) // η τιμή εξόδου δεν μπορεί ποτέ να είναι μεγαλύτερη από 255 (outputValue = 255; ) analogWrite(outputPin, outputValue); // γράψτε νέα τιμή εξόδου ) εάν (θερμοκρασία C > Θερμοκρασία αποκοπής C) // σταματήσει τη φόρτιση εάν η θερμοκρασία της μπαταρίας υπερβαίνει το ασφαλές όριο (Τιμή εξόδου = 0; Σειριακή.εκτύπωση ("Υπέρβαση μέγιστης θερμοκρασίας"); σταματήστε τη φόρτιση εάν η θερμοκρασία της μπαταρίας υπερβεί το ασφαλές όριο (outputValue = 0; ) */ if(batteryVoltage > cutoffVoltage) // σταματήστε τη φόρτιση εάν η τάση της μπαταρίας υπερβεί το ασφαλές όριο (outputValue = 0; Serial.print ("Max Voltage Exceeded" ); ) if(millis() > cutoffTime) // διακοπή φόρτισης εάν ο χρόνος φόρτισης έχει υπερβεί το όριο ( outputValue = 0; Serial.print("Max Charge Time Exceeded"); ) Delay(10000); // καθυστέρηση 10 δευτερόλεπτα πριν από την επόμενη επανάληψη του βρόχου)

Μπορείτε να βρείτε μια έκδοση του πηγαίου κώδικα με δυνατότητα λήψης στον παρακάτω σύνδεσμο.