Inhaltsverzeichnis:

Programmierbarer 8-Kanal-Timer - Gunook
Programmierbarer 8-Kanal-Timer - Gunook

Video: Programmierbarer 8-Kanal-Timer - Gunook

Video: Programmierbarer 8-Kanal-Timer - Gunook
Video: 5V-36V Timer Modul Trigger Zyklusverzögerung Zeitschaltuhr Ein und Aus schalten Mosfet mit LED DSP 2024, Juli
Anonim
8-Kanal programmierbarer Timer
8-Kanal programmierbarer Timer
8-Kanal programmierbarer Timer
8-Kanal programmierbarer Timer
8-Kanal programmierbarer Timer
8-Kanal programmierbarer Timer

Einführung

Ich verwende seit 1993 die PIC-Mikrocontroller-Reihe von Microchip für meine Projekte und habe meine gesamte Programmierung in Assemblersprache mit der Microchip MPLab IDE durchgeführt. Meine Projekte reichten von einfachen Ampeln und blinkenden LEDs über USB-Joystick-Schnittstellen für R/C-Modelle bis hin zu Schaltgeräte-Analisern für die Industrie. Die Entwicklung dauerte viele Tage und manchmal Tausende von Zeilen Assembler-Code.

Nachdem ich Matrix Multimedia Flowcode 4 Professional erhalten hatte, stand ich der Software ziemlich skeptisch gegenüber. Es sah zu einfach aus, um es zu glauben. Ich beschloss, es auszuprobieren und testete alle verschiedenen Komponentenmakros, alle mit großem Erfolg. Das Beste an Flowcode war, dass einfache Projekte in einer einzigen Nacht codiert werden konnten. Nachdem ich mit dem I²C und einer DS1307-Echtzeituhr gespielt hatte, entschied ich mich, den 8-Kanal-Timer mit Flowcode zu entwerfen. Da es sich nicht um ein kleines und einfaches Projekt handelt, dachte ich, dass dies ein großartiges Projekt sein würde, um mir Flowcode beizubringen.

Auswahl eines Mikroprozessors und anderer Komponenten

Aufgrund der Anzahl der benötigten I/O-Pins war klar, dass ein 40-Pin-Gerät benötigt wird. Der PIC 18F4520 wurde hauptsächlich wegen seines 32K Programmspeichers und 1536 Bytes Datenspeicher gewählt. Alle verwendeten Komponenten sind Standard-Durchsteckvorrichtungen, die es ermöglichen, die Schaltung bei Bedarf auf einer Vero-Platine aufzubauen. Dies half auch bei der Entwicklung auf einem Steckbrett.

Schritt 1: Projektziele

Projektziele
Projektziele

Ziele

- Genaue Zeitmessung, mit Batterie-Backup.

- Alle Programme und Daten bleiben auch nach Stromausfall erhalten.

- Einfache Benutzeroberfläche.

- Flexibilität bei der Programmierung.

Zeitmessung

Wenn Sie in einem Gebiet leben, das anfällig für Stromausfälle ist, reichen die standardmäßigen 50/60 Hz von den Stromleitungen für eine genaue Zeitmessung nicht aus. Eine Echtzeituhr war unerlässlich, und nachdem ich mehrere RTC-Chips getestet hatte, entschied ich mich aufgrund seiner einfachen Oszillator- und Batterie-Backup-Konfiguration für den DS1307. Eine recht genaue Zeitmessung wurde mit nur einem 32,768-kHz-Quarz erreicht, der mit dem DS1307 verbunden war. Die Genauigkeit war innerhalb von 2 Sekunden über einen 2-monatigen Testzeitraum mit 4 verschiedenen Kristallfabrikaten.

Vorratsdatenspeicherung

Alle Zeitprogrammdaten müssen auch bei Stromausfall erhalten bleiben. Bei bis zu 100 verschiedenen Programmen und diversen Konfigurationsdaten wurde klar, dass die 256 Bytes Onboard-EEPROM des PIC nicht groß genug sein werden. Ein 24LC256 I²C EEPROM wird verwendet, um alle Programmierinformationen zu speichern.

Einfache Benutzeroberfläche

Die Benutzeroberfläche besteht aus nur 2 Elementen, einem 16 x 4-zeiligen LCD-Display mit LED-Hintergrundbeleuchtung und einer 4 x 3-Tastatur. Alle Programmierungen können mit dem Drücken von nur wenigen Tasten durchgeführt werden. Ergänzungen zur Schnittstelle sind ein hörbarer Piezo-Summer und eine visuell blinkende LCD-Hintergrundbeleuchtung.

Schritt 2: Programmierflexibilität

Flexibilität bei der Programmierung
Flexibilität bei der Programmierung

Um genügend Programmflexibilität zu gewährleisten, verfügt der Timer über 100 individuell einstellbare Programme. Für jedes Programm können Einschaltzeit, Ausschaltzeit, Ausgangskanäle und Wochentag eingestellt werden. Jedes Programm hat drei Modi:

- Auto: Einschaltzeit, Ausschaltzeit, Ausgangskanal und Wochentag werden eingestellt.

- Aus: Das einzelne Programm kann deaktiviert werden, ohne die Einstellungen zu löschen. Um das Programm wieder zu aktivieren, Wählen Sie einfach einen anderen Modus aus.

- Tag/Nacht: Einschaltzeit, Ausschaltzeit, Ausgangskanal und Wochentag werden eingestellt. Funktioniert genauso wie der Auto-Modus, wird aber

Schalten Sie die Ausgänge nur zwischen den Ein- und Aus-Zeiten ein, wenn es dunkel ist. Dies ermöglicht auch die volle Tag/Nacht-Steuerung

als zusätzliche Flexibilität, das Licht bei Sonnenuntergang ein- und bei Sonnenaufgang auszuschalten.

Beispiel 1: Schaltet das Licht nach 20:00 Uhr ein und bei Sonnenaufgang aus.:

Am: 20:00, Aus:12:00, Beispiel 2: Schaltet das Licht bei Sonnenuntergang ein und um 23:00 Uhr aus.

Am: 12:00

Aus: 23:00

Beispiel 3: Schaltet das Licht bei Sonnenuntergang ein und bei Sonnenaufgang aus.

Am: 12:01

Aus: 12:00

Zusätzliche Optionen verfügbar, die alle unabhängig von den 100 Ein/Aus-Programmen arbeiten.

Programmkanäle aktiv: Anstatt mehrere Programme auszuschalten, können einzelne Ausgabekanäle deaktiviert werden, ohne dass die Programme geändert werden müssen.

Hilfseingänge: Es stehen zwei digitale Eingänge zur Verfügung, mit denen bestimmte Ausgangskanäle für eine bestimmte Zeit eingeschaltet werden können. Es kann zum Beispiel verwendet werden, um bestimmte Lichter einzuschalten, wenn man spät in der Nacht nach Hause kommt, wenn eine Taste auf einer Fernbedienung gedrückt wird, oder um andere Lichter einzuschalten, wenn der Hausalarm ausgelöst wird.

Hilfsausgänge: Zwei zusätzliche Ausgänge (neben den 8 Ausgangskanälen) stehen zur Verfügung. Sie können so programmiert werden, dass sie sich mit bestimmten Ausgangskanälen oder mit den digitalen Eingängen einschalten. In meiner Installation habe ich die Ausgänge 6-8, die meine Bewässerung steuern, die mit 24 V arbeitet. Ich benutze die Kanäle 6-8, um einen der Hilfsausgänge einzuschalten, um eine 24V-Stromversorgung für das Bewässerungssystem einzuschalten.

Manual On: Im Hauptbildschirm können die Tasten 1-8 verwendet werden, um Kanäle manuell ein- oder auszuschalten.

Schritt 3: Hardware

Hardware
Hardware

Netzteil: Das Netzteil besteht aus einem Gleichrichter, einem Glättungskondensator und einer 1 Ampere Sicherung zum Überlastungsschutz. Diese Versorgung wird dann durch einen Regler 7812 und 7805 geregelt. Die 12-V-Versorgung wird zum Ansteuern der Ausgangsrelais verwendet, und alle anderen Schaltkreise werden von der 5-V-Versorgung gespeist. Da der Regler 7805 an den Ausgang des Reglers 7812 angeschlossen ist, muss der Gesamtstrom durch den Regler 7812 auf 1 Ampere begrenzt werden. Es empfiehlt sich, diese Regler auf einem geeigneten Kühlkörper zu montieren.

I²C-Bus: Obwohl Flowcode eine Hardware-I²C-Steuerung ermöglicht, habe ich mich für die Software-I²C-Konfiguration entschieden. Dies ermöglicht eine flexiblere Pinbelegung. Obwohl langsamer (50 kHz), bietet er im Vergleich zum Hardware-I²C-Bus immer noch eine hervorragende Leistung. Sowohl DS1307 als auch 24LC256 sind an diesen I²C-Bus angeschlossen.

Echtzeituhr (DS1307): Während des Startvorgangs werden die RTC-Register 0 und 7 gelesen, um festzustellen, ob sie gültige Zeit- und Konfigurationsdaten enthalten. Sobald die Einrichtung korrekt ist, wird die RTC-Zeit gelesen und die Zeit in den PIC geladen. Dies ist das einzige Mal, dass die Zeit von der RTC gelesen wird. Nach dem Start liegt an Pin 7 der RTC ein 1-Hz-Impuls an. Dieses 1-Hz-Signal wird an RB0/INT0 angeschlossen und über eine Interrupt-Service-Routine wird die PIC-Zeit jede Sekunde aktualisiert.

Externes EEPROM: Alle Programmdaten und Optionen werden auf dem externen EEPROM gespeichert. Die EEPROM-Daten werden beim Start geladen und eine Kopie der Daten wird im PIC-Speicher gespeichert. EEPROM-Daten werden nur aktualisiert, wenn Programmeinstellungen geändert werden.

Tag/Nacht-Sensor: Als Tag/Nacht-Sensor wird ein standardmäßiger lichtabhängiger Widerstand (LDR) verwendet. Da LDRs in vielen Formen und Varianten erhältlich sind, alle mit unterschiedlichen Widerstandswerten unter den gleichen Lichtbedingungen, habe ich einen analogen Eingangskanal verwendet, um die Lichtstärke zu lesen. Die Tages- und Nachtstufen sind einstellbar und ermöglichen eine gewisse Flexibilität für verschiedene Sensoren. Um eine gewisse Hysterese einzurichten, können individuelle Werte für Tag und Nacht eingestellt werden. Der Status ändert sich nur, wenn die Lichtstärke länger als 60 Sekunden unter dem Tag- oder über den Nacht-Sollwerten liegt.

LCD-Display: 4-zeiliges, 16-stelliges Display wird verwendet, da nicht alle Daten auf einem 2-zeiligen Display angezeigt werden können. Das Projekt enthält einige benutzerdefinierte Zeichen, die im Makro LCD_Custom_Char definiert sind.

Hilfseingänge: Beide Eingänge sind mit einem NPN-Transistor gepuffert. Am Stecker sind auch +12V und 0V verfügbar, was flexiblere Verbindungen zu externen Anschlüssen ermöglicht. Als Beispiel kann ein Fernbedienungsempfänger an die Versorgung angeschlossen werden.

Ausgänge: Alle Ausgänge sind durch ein 12V-Relais vom Stromkreis galvanisch getrennt. Die verwendeten Relais sind für 250 V AC bei 10 Ampere ausgelegt. Die Schließer- und Öffnerkontakte werden an den Klemmen herausgeführt.

Tastatur: Die verwendete Tastatur ist eine 3 x 4 Matrixtastatur und wird an PORTB:2..7 angeschlossen.

Schritt 4: Tastaturunterbrechungen

Tastenfeldunterbrechungen
Tastenfeldunterbrechungen
Tastenfeldunterbrechungen
Tastenfeldunterbrechungen
Tastenfeldunterbrechungen
Tastenfeldunterbrechungen

Ich wollte den PORTB Interrupt on Change Interrupt bei jedem Tastendruck verwenden. Dazu musste in Flowcode ein benutzerdefinierter Interrupt erstellt werden, um sicherzustellen, dass die PORTB-Richtung und die Daten vor und nach jedem Tastenfeld-Interrupt korrekt eingerichtet sind. Jedes Mal, wenn eine Taste gedrückt oder losgelassen wird, wird ein Interrupt generiert. Die Interrupt-Routine reagiert nur, wenn eine Taste gedrückt wird.

BENUTZERDEFINIERTE UNTERBRECHUNG

Code aktivieren

portb = 0b00001110;trisb = 0b11110001;

intcon. RBIE = 1;

intcon2. RBIP = 1;

intcon2. RBPU = 1;

rcon. IPEN = 0;

Handlercode

if (intcon & (1 << RBIF))

{ FCM_%n();

portb = 0b00001110;

trisb = 0b11110001;

wreg= portb;

clear_bit(intcon, RBIF);

}

Probleme gefunden

Während eines Interrupts muss die Interrupt-Service-Routine unter KEINEN Bedingungen jedes andere Makro aufrufen, das irgendwo im Rest des Programms verwendet werden könnte. Dies führt schließlich zu Stack-Überlaufproblemen, da der Interrupt gleichzeitig mit dem Hauptprogramm im selben Unterprogramm auftreten kann. Dies wird von Flowcode auch als SCHWERER FEHLER erkannt, wenn der Code kompiliert wird.

Im Custom-Code des Keypads unter GetKeyPadNumber gibt es einen solchen Aufruf des Delay_us-Makros, der einen Stack-Überlauf verursacht. Um dies zu umgehen, habe ich den Befehl Delay_us(10) entfernt und durch 25 Zeilen "wreg = porta;" ersetzt. Befehle. Dieser Befehl liest PORTA und legt seinen Wert in das W-Register, nur um eine gewisse Verzögerung zu erhalten. Dieser Befehl wird zu einem einzigen Befehl kompiliert, ähnlich dem Assembler movf porta, 0. Für den im Projekt verwendeten 10-MHz-Takt beträgt jeder Befehl 400 ns, und um eine Verzögerung von 10 us zu erhalten, brauchte ich 25 dieser Befehle.

Beachten Sie in der zweiten Zeile von Abbildung 3: GetKeypadNumber Custom Code, dass der ursprüngliche Befehl delay_us(10) mit „//“deaktiviert wurde. Darunter habe ich meine 25 "wreg = porta;" hinzugefügt. Befehle, um eine neue 10us-Verzögerung zu erhalten. Ohne Aufrufe von Makros im benutzerdefinierten Code Keypad_ReadKeypadNumber kann das Keypad-Makro jetzt innerhalb einer Interrupt-Serviceroutine verwendet werden.

Es ist zu beachten, dass die Komponenten Flowcode Keypad und eBlocks nicht die Standard-Pull-up-Widerstände an den Eingangsleitungen verwenden. Stattdessen werden 100K-Pulldown-Widerstände verwendet. Aufgrund einiger Störungen, die während der Entwicklung auf der Tastatur festgestellt wurden, wurden alle 100K-Widerstände durch 10K und alle 10K-Widerstände durch 1K5 ersetzt. Die Tastatur wurde getestet, um mit Kabeln von 200 mm korrekt zu funktionieren.

Schritt 5: Verwenden des Timers

Verwenden des Timers
Verwenden des Timers
Verwenden des Timers
Verwenden des Timers
Verwenden des Timers
Verwenden des Timers

Alle Bildschirme sind so eingerichtet, dass sie dem Benutzer alle erforderlichen Informationen anzeigen, um schnelle Änderungen an den Einstellungen vorzunehmen. Zeile 4 dient der Navigation durch die Menüs und Programmoptionen. Im Normalbetrieb stehen insgesamt 22 Bildschirme zur Verfügung.

ZEILE 1: Zeit und Status

Zeigt den aktuellen Tag und die aktuelle Uhrzeit an, gefolgt von Statussymbolen:

A – Zeigt an, dass Aux Input A getriggert wurde und der Timer für Aux Input A läuft.

B – Zeigt an, dass Aux Input B getriggert wurde und der Timer für Aux Input B läuft.

C – Zeigt an, dass der Aux-Ausgang C eingeschaltet ist.

D – Zeigt an, dass der Aux-Ausgang D eingeschaltet ist.

} – Tag/Nacht-Sensorstatus. Falls vorhanden, bedeutet es, dass es Nacht ist.

ZEILE 2: Programmausgänge

Zeigt die Kanäle an, die von den verschiedenen Programmen eingeschaltet wurden. Kanäle werden in ihren Ausgangsnummern angezeigt und ein „-“zeigt an, dass der jeweilige Ausgang nicht eingeschaltet ist. Kanäle, die unter „Programmausgänge aktiv“deaktiviert wurden, werden hier weiterhin angezeigt, aber die Real-Ausgänge werden nicht gesetzt.

ZEILE 3: Reale Ausgänge

Zeigt an, welche Kanäle von den verschiedenen Programmen, den Aux-Eingängen A und B oder den vom Benutzer eingestellten manuellen Ausgängen eingeschaltet werden. Durch Drücken von 0 werden alle manuell aktivierten Ausgänge wieder ausgeschaltet und die Timer der Aux-Ausgänge A und B zurückgesetzt.

ZEILE 4: Menü- und Tastenoptionen (in allen Menüs)

Zeigt die Funktion der Tasten „*“und „#“an.

Der mittlere Teil zeigt an, welche Zifferntasten (0-9) für den ausgewählten Bildschirm aktiv sind.

Der Eingangsstatus von Aux Input A & B wird auch durch ein Open- oder Closed-Schaltersymbol angezeigt.

Ausgänge können manuell durch Drücken der entsprechenden Taste auf der Tastatur ein- und ausgeschaltet werden.

In den Menüs werden die Stern- und Raute-Tasten verwendet, um durch die verschiedenen Programmoptionen zu navigieren. Mit den Tasten 0-9 werden die Optionen eingestellt. Wenn mehrere Optionen auf einem einzigen Bildschirm oder Programmiermenü verfügbar sind, wird die Raute-Taste verwendet, um durch die verschiedenen Optionen zu blättern. Die aktuell ausgewählte Option wird immer durch das Zeichen „>“auf der linken Seite des Bildschirms angezeigt.

0-9 Zeitwerte eingeben

1-8 Kanalauswahl ändern

14 36 Durchlaufen von Programmen, 1-Schritt zurück, 4-Schritt zurück 10 Programme, 3-Schritt vor, 6-Schritt vor 10

Programme

1-7 Wochentage einstellen. 1=Sonntag, 2=Montag, 3=Dienstag, 4=Mittwoch, 5=Donnerstag, 6=Freitag, 7=Samstag

0 Löschen Sie im Hauptbildschirm alle manuellen Überschreibungen und Timer für Eingang A und Eingang B. In anderen Menüs, Änderungen

ausgewählte Optionen

# Im Hauptbildschirm werden alle manuellen Übersteuerungen, Timer für Eingang A und Eingang B sowie Programmausgänge deaktiviert, bis

die nächste Veranstaltung.

* und 1 Starten Sie den Timer neu

* und 2 Alle Programme und Optionen löschen, Einstellungen auf Standard zurücksetzen.

* und 3 Timer in Standby schalten. Um den Timer wieder einzuschalten, drücken Sie eine beliebige Taste.

Bei falschen Eingaben eines beliebigen Zeitwerts blinkt die LCD-Hintergrundbeleuchtung 5 Mal, um einen Fehler anzuzeigen. Gleichzeitig ertönt der Summer. Die Befehle Exit und Next funktionieren nur, wenn die aktuelle Eingabe korrekt ist.

LCD-Rücklicht

Bei der ersten Inbetriebnahme wird die LCD-Hintergrundbeleuchtung für 3 Minuten eingeschaltet, es sei denn:

- Es liegt ein Hardwarefehler vor (EEPROM oder RTC nicht gefunden)

- Zeit nicht in der RTC eingestellt

Die LCD-Hintergrundbeleuchtung wird bei jeder Benutzereingabe auf dem Tastenfeld erneut für 3 Minuten eingeschaltet. Wenn die LCD-Hintergrundbeleuchtung ausgeschaltet ist, schaltet jeder Tastaturbefehl zuerst die LCD-Hintergrundbeleuchtung ein und ignoriert die gedrückte Taste. Dadurch wird sichergestellt, dass der Benutzer die LCD-Anzeige lesen kann, bevor er die Tastatur verwendet. Die LCD-Hintergrundbeleuchtung wird auch für 5 Sekunden eingeschaltet, wenn Aux Input A oder Aux Input B aktiviert ist.

Schritt 6: Menü-Screenshots

Menü-Screenshots
Menü-Screenshots
Menü-Screenshots
Menü-Screenshots
Menü-Screenshots
Menü-Screenshots

Über die Tastatur kann jede der Optionen einfach programmiert werden. Die Bilder geben einige Informationen darüber, was jeder Bildschirm tut.

Schritt 7: Design des Systems

Aufbau des Systems
Aufbau des Systems

Alle Entwicklung und Tests wurden auf Steckbrett durchgeführt. Wenn ich mir alle Abschnitte des Systems ansehe, habe ich das System in drei Module unterteilt. Diese Entscheidung war hauptsächlich auf die PCB-Größenbeschränkungen (80 x 100 mm) der kostenlosen Version von Eagle zurückzuführen.

Modul 1 - Stromversorgung

Modul 2 - CPU-Platine

Modul 3 - Relaisplatine

Ich entschied, dass alle Komponenten leicht erhältlich sein müssen und dass ich keine SMD-Komponenten verwenden wollte.

Lassen Sie uns jeden von ihnen durchgehen.

Schritt 8: Netzteil

Energieversorgung
Energieversorgung
Energieversorgung
Energieversorgung
Energieversorgung
Energieversorgung
Energieversorgung
Energieversorgung

Die Stromversorgung ist unkompliziert und versorgt die CPU- und Relaisplatinen mit 12V und 5V.

Ich habe die Spannungsregler auf anständige Kühlkörper montiert und auch überbewertete Kondensatoren für die Versorgung verwendet.

Schritt 9: CPU-Platine

CPU-Platine
CPU-Platine
CPU-Platine
CPU-Platine
CPU-Platine
CPU-Platine
CPU-Platine
CPU-Platine

Alle Komponenten außer LCD-Bildschirm, Tastatur und Relais sind auf der CPU-Platine montiert.

Es wurden Klemmenblöcke hinzugefügt, um die Verbindungen zwischen der Versorgung, zwei digitalen Eingängen und dem Lichtsensor zu vereinfachen.

Kopfstifte/Buchsen sorgen für einfache Verbindungen zum LCD-Bildschirm und zur Tastatur.

Für die Ausgänge zu den Relais habe ich den ULN2803 verwendet. Es enthält bereits alle erforderlichen Treiberwiderstände und Flyback-Dioden. Dadurch wurde sichergestellt, dass die CPU-Platine weiterhin mit der kostenlosen Version von Eagle hergestellt werden kann. Die Relais sind an die beiden ULN2803 angeschlossen. Der untere ULN2803 wird für die 8 Ausgänge und der obere ULN2803 für die beiden Hilfsausgänge verwendet. Jeder Hilfsausgang hat vier Transistoren. Die Verbindungen zu den Relais erfolgen ebenfalls über Stiftleisten/Buchsen.

Der PIC 18F4520 wurde mit einer Programmierbuchse ausgestattet, um eine einfache Programmierung über den PicKit 3 Programmierer zu ermöglichen.

HINWEIS:

Sie werden feststellen, dass die Platine einen zusätzlichen 8-Pin-IC enthält. Der obere IC ist ein PIC 12F675 und an einen digitalen Eingang angeschlossen. Dies wurde während des PCB-Designs hinzugefügt. Dies erleichtert die Vorverarbeitung des digitalen Eingangs. In meiner Anwendung ist einer der digitalen Eingänge mit meiner Alarmanlage verbunden. Wenn der Alarm ertönt, werden in meinem Haus bestimmte Lichter eingeschaltet. Das Scharf- und Unscharfschalten meiner Alarmanlage gibt verschiedene Pieptöne auf der Sirene. Durch die Verwendung des PIC 12F675 kann ich jetzt zwischen Scharf/Unscharf und einem echten Alarm unterscheiden. Der 12F675 ist zusätzlich mit einer Programmierbuchse ausgestattet.

Ich habe auch einen I2C-Port über Header-Pin / -Buchse vorgesehen. Dies wird sich später bei den Relaisplatinen als nützlich erweisen.

Die Platine enthält einige Jumper, die vor dem Bestücken der IC-Sockel angelötet werden sollten.

Schritt 10: Flowcode-Schlussfolgerung

Fazit zum Flowcode
Fazit zum Flowcode
Fazit zum Flowcode
Fazit zum Flowcode
Fazit zum Flowcode
Fazit zum Flowcode

Da ich es gewohnt bin, in der Assemblierung auf Registerebene zu arbeiten, war es manchmal schwierig und frustrierend, die Komponentenmakros zu verwenden. Dies lag hauptsächlich an meiner mangelnden Kenntnis der Programmierstruktur von Flowcode. Die einzigen Stellen, an denen ich die C- oder ASM-Blöcke verwendet habe, bestand darin, Ausgänge innerhalb einer Interrupt-Routine und in der Do_KeyPressed-Routine einzuschalten, um die Tastaturunterbrechung zu deaktivieren / zu aktivieren. Der PIC wird auch unter Verwendung eines ASM-Blocks in SLEEP versetzt, wenn das EEPROM oder RTC nicht gefunden wird.

Hilfestellungen zur Verwendung der verschiedenen I²C-Befehle finden Sie alle in den Flowcode-Hilfedateien. Es ist erforderlich, genau zu wissen, wie die verschiedenen I²C-Geräte funktionieren, bevor die Befehle erfolgreich verwendet werden können. Um eine Schaltung zu entwerfen, muss der Designer alle relevanten Datenblätter zur Verfügung haben. Dies ist kein Manko von Flowcode.

Flowcode hat sich wirklich bewährt und ist sehr empfehlenswert für Personen, die mit der Microchip-Reihe von Mikroprozessoren arbeiten möchten.

Flowcode-Programmierung und Konfiguration für den PIC wurden gemäß den Bildern eingestellt

Schritt 11: Optionale I2C-Relaisplatine

Optionale I2C-Relaisplatine
Optionale I2C-Relaisplatine
Optionale I2C-Relaisplatine
Optionale I2C-Relaisplatine
Optionale I2C-Relaisplatine
Optionale I2C-Relaisplatine

Die CPU-Platine hat bereits Header-Anschlüsse für 16 Relais. Diese Ausgänge sind Open-Collector-Transistoren über die beiden ULN2803-Chips. Dies kann verwendet werden, um die Relais direkt mit Strom zu versorgen.

Nach den ersten Tests des Systems gefielen mir nicht alle Drähte zwischen der CPU-Platine und den Relais. Da ich einen I2C-Port auf der CPU-Platine eingebaut habe, beschloss ich, die Relaisplatine so zu gestalten, dass sie an den I2C-Port angeschlossen wird. Mit einem 16-Kanal-MCP23017-I/O-Port-Expander-Chip und einem ULN2803-Transistor-Array habe ich die Verbindungen zwischen der CPU und den Relais auf 4 Drähte reduziert.

Da ich 16 Relais nicht auf einer 80 x 100 mm Platine unterbringen konnte, beschloss ich, zwei Platinen zu bauen. Jeder MCP23017 verwendet nur 8 seiner 16 Ports. Board 1 verwaltet die 8 Ausgänge und Board 2 die beiden Hilfsausgänge. Der einzige Unterschied auf den Boards sind die Adressen der einzelnen Boards. Dies wird einfach mit einem Mini-Jumper eingestellt. Jedes Board verfügt über Anschlüsse, um das andere Board mit Strom und I2C-Daten zu versorgen.

HINWEIS:

Bei Bedarf sieht die Software nur ein Board vor, das alle 16 Ports nutzen kann. Alle Ausgangsrelaisdaten sind auf der ersten Platine verfügbar.

Da die Schaltung optional und sehr einfach ist, habe ich keinen Schaltplan erstellt. Wenn genügend Nachfrage besteht, kann ich es später hinzufügen.

Schritt 12: Optionale HF-Verbindung

Optionale HF-Verbindung
Optionale HF-Verbindung
Optionale HF-Verbindung
Optionale HF-Verbindung
Optionale HF-Verbindung
Optionale HF-Verbindung

Nach Abschluss des Projekts wurde mir schnell klar, dass ich viele 220-V-AC-Kabel zum Timer ziehen muss. Ich entwickelte eine HF-Verbindung mit Standard-315-MHz-Modulen, die es ermöglichten, den Timer in einem Schrank und die Relaisplatinen im Dach in der Nähe der 220-V-Verkabelung zu platzieren.

Der Link verwendet einen AtMega328P mit 16 MHz. Die Software für Sender und Empfänger ist gleich und der Modus wird über einen Mini-Jumper ausgewählt.

Sender

Der Sender wird einfach in den I2C-Port der CPU eingesteckt. Es ist keine zusätzliche Einrichtung erforderlich, da der AtMega328P auf die gleichen Daten wie die I2C-Relaisplatinen hört.

Die Daten werden einmal pro Sekunde am I2C-Port aktualisiert und der Sender sendet diese Informationen über die HF-Verbindung. Sollte der Sender etwa 30 Sekunden lang keine I2C-Daten empfangen, sendet der Sender kontinuierlich Daten, um alle Relais an die Empfängereinheit auszuschalten.

Die Stromversorgung des Sendermoduls kann mit einem Mini-Jumper auf der Platine zwischen 12V und 5V gewählt werden. Ich betreibe meinen Sender mit 12V.

Empfänger

Der Empfänger lauscht auf codierte Daten vom Sender und platziert die Daten auf einem I2C-Port. Die Relaisplatine wird einfach in diesen Port eingesteckt und funktioniert genauso, wie sie in die CPU-Platine eingesteckt wurde.

Sollte der Empfänger 30 Sekunden lang keine gültigen Daten empfangen, sendet der Empfänger kontinuierlich Daten über den I2C-Port, um alle Relais auf den Relaisplatinen auszuschalten.

Schema

Eines Tages, wenn die Nachfrage besteht. Die Arduino-Skizze enthält alle erforderlichen Informationen, um die Schaltung ohne Schaltplan aufzubauen.

Bereich

In meiner Installation sind Sender und Empfänger etwa 10 Meter voneinander entfernt. Der Timer befindet sich in einem Schrank und die Relaiseinheit oben an der Decke.

Schritt 13: Endprodukt

Endprodukt
Endprodukt
Endprodukt
Endprodukt
Endprodukt
Endprodukt

Die Haupteinheit wurde in eine alte Projektbox eingebaut. Es enthält Folgendes:

- 220V/12V Transformator

- Stromversorgungsplatine

- CPU-Platine

- LCD Bildschirm

- Tastatur

- RF-Link-Sender

- Zusätzliche Empfängereinheit für die Heimfernbedienung, damit ich das Licht über die Fernbedienung ein- und ausschalten kann

Die Relaiseinheit besteht aus:

- 220V/12V Transformator

- Stromversorgungsplatine

- RF-Link-Empfänger

- 2 x I2C-Relaisplatinen

Alle Boards wurden mit den gleichen Abmessungen entworfen, so dass sie mit 3 mm Abstandshaltern einfach übereinander gestapelt werden können.

Empfohlen: