Тёмный
No video :(

ARDUINO BASICS #16 - INTERRUPTS für Timer und Taster verwenden 

SmartHome yourself
Подписаться 29 тыс.
Просмотров 14 тыс.
50% 1

An Tag 16 der Arduino-Basics Reihe erkläre ich, wie man mit Hilfe von Interrupts Zeitgesteuerte Events triggern oder einen Pin auf Statusänderungen überwachen kann, ohne Zeit, bzw. den Pin im Sketch abfragen zu müssen.
ACHTUNG!!!
Für alle die nicht die LEDs aus dem Adventskalender verwenden, Ihr müsst noch Vorwiderstände an den LEDs anschließen (wie im Schaltplan aus der Videobeschreibung zu sehen ist).
Die LEDs im Video besitzen einen integrierten Vorwiderstand!
----------------
Arduino-Basics ist eine Video-Serie, in der ich auf Neulinge im Bereich Arduino ausgerichtet die Grundlagen der Programmierung erklären möchte. Vielleicht ist aber auch das ein oder andere interessante für die erfahreneren Maker unter Euch dabei. Schaut doch einfach mal rein.
Da die meisten Tutorials sich eher auf den technischen Aspekt der Arduino-Projekte beziehen, habe ich als Software-Entwickler meinen Fokus in dieser Reihe eher auf die Software und Programmierung gelegt.
----------------
Das Sketch und den Schaltplan zum Video findet Ihr unter folgendem Link:
smarthomeyours...
----------------
Folgende Komponenten benötigt Ihr zum nachbauen der Schaltung im Video:
Arduino Nano: amzn.to/2qIIqHO *
Steckbrett: amzn.to/2PlYGc1 *
Jumper-Wire: amzn.to/2pkhCNE *
LED-Set incl. Widerständen: amzn.to/2Jp0RYI *
Micro-Taster: amzn.to/2OF8Tyt *
--
Ihr möchtet meine Arbeit unterstützen?
Stöbert einfach mal durch meine Amazon Empfehlungen:
www.amazon.de/... *
Oder schaut in meinem Fan-Shop vorbei:
shop.spreadshi...
Wenn Ihr etwas von Ebay oder Amazon bestellt, nutzt dafür gerne meine Affiliate-Links:
Ebay-Partner-Link: ebay.us/7RBSKn *
Amazon-Partner-Link: amzn.to/2O7Z1x3 *
Oder spendet einen frei wählbaren Betrag unter:
streamlabs.com...
oder
paypal.me/Sche...
--
Kommt gerne auch auf unserem Discord vorbei:
/ discord
--
Mein Video-Zubehör:
Kamera: Panasonic Lumix DMC-G81MEG-K (amzn.to/2UoafPp)*
Andoer SGC-598 Kondensator-Mikrofon (amzn.to/2RPZ19B)*
Zoom H2n Audio-Recorder (amzn.to/3kZGZMa)*
Hauser 200W ESL + Durchlicht Schirm Weiß (amzn.to/2HyYtjx)*
2x Neewer LED-Panel (amzn.to/3cH8NBO)*
SD-Karten: SanDisk Extreme PRO 128GB SDXC Class 10 U3 (amzn.to/2CMaxrV)*
Adobe Premiere/Photoshop Elements 2020 (amzn.to/2MMimU6)*
--
* Bei allen Amazon Links handelt es sich um Affiliate-Links. Heißt für jeden Kauf über die Links erhalte ich eine kleine Provision. Ihr bezahlt natürlich weiterhin den selben Preis wie sonst auch.
Vielen Dank für eure Unterstützung!

Опубликовано:

 

28 авг 2024

Поделиться:

Ссылка:

Скачать:

Готовим ссылку...

Добавить в:

Мой плейлист
Посмотреть позже
Комментарии : 20   
@moonwakler
@moonwakler 4 года назад
Sehr interessantes Video für mich. Interrupt kann ich in einem meiner nächsten Projekte gebrauchen. Habs in meinen Büchern schon durchgelesen, nicht so recht kapiert, aber auch nichz vertieft, da ich es noch nicht benötige. Es wird von Tag zu Tag interessanter.
@sensai2006
@sensai2006 4 года назад
👍 Ich nehme als Beispiel immer gerne den Regenmesser von einer Wetterstation. Da der Sketch mit der Abfrage der anderen Sensoren beschäftigt ist, muss er aber zu jedem Zeitpunkt fähig sein, dass auslösen der Regenwippe zu detektieren. Ich weiß ja nie ob es gerade regnet, oder wann die Wippe voll ist und eine Regenmengenmessung beendet ist. Das _muss_ immer funktionieren. Kommt der Luftdruck mal paar Sekunden später, ist dies nicht weiter schlimm. So genau weiß ich das mit dem RAM auch nicht mehr. Ich meine das hätte etwas mit dem Speichermanagement von größeren Variablen zu tun. Die werden IMO dann segmentiert abgelegt und im Flash dann teilweise überschrieben. Das passiert im RAM nicht. Das Bootlogo für mein OLED liegt bspw. im RAM, genau so wie der 256Bit RSA key. Beides lief nicht, erst nach auslagern ins RAM.
@Klimafutzi
@Klimafutzi 3 месяца назад
"volatile" erzwingt, dass der Wert immer im RAM liegt und nicht in einem CPU Register. Das könnte durch einen Interrupt einen anderen Wert bekommen, wenn man den Wert in der Loop (außerhalb der Interrupt Routine) liest. Deswegen müssen alle Werte die durch Interrupts beschrieben werden mit volatile gekennzeichnet werden. Es kommt sogar noch schlimmer: Wenn der Wert größer als ein Byte ist (z.B. int), dann kann die Interrupt Routine diesen Wert nur byteweise speichern (der Arduino ist ein 8-Bit Prozessor, der kann max 1 Byte pro Maschinenbefehl lesen und schreiben). Beim Lesen aus der Loop kann man dann fehlerhafte Werte bekommen, weil beim auslesen eventuell ein Byte durch den Interrupt noch nicht geschrieben wurde. Daher muss man in so einem Fall mit "ATOMIC_BLOCK" arbeiten. Innerhalb des so markierten Code-Bereichs kommen dann keine Interrupts durch und der Integer Wert kann vollständig und damit immer korrekt gelesen werden. Da der ATOMIC_BLOCK Interrupts ausschaltet, muss der Code in diesem Block so kurz wie möglich sein.
@foldi001
@foldi001 4 месяца назад
Eigentlich würde man das englisch aussprechen, da sich diese und die meisten Programmiersprachen (ich kenne zumindest keine deutsche Programmiersprache) vom Englischen herleiten lassen. Dann würde es "wolle_teil" ausgesprochen werden. Zu "volatile" muss man eigentlich nur wissen, dass der Compiler die wegoptimieren würde, wenn das nicht dabei steht. Da es sich hier um einen "flüchtigen Wert" handelt. Das kann eine Variable sein, die nur gelesen wird oder aber auch von innen und außen geändert werden kann. Der Compiler liest das und denkt sich "Was soll der Mist? Da ist für mich kein klarer Wert zu erkennen, also schmeiß ich das raus."
@saschazapf5232
@saschazapf5232 3 года назад
Mir ist klar das ich da keine großen Ausgaben über Serielle Schnittstelle machen sollte. Wie sieht es aber mit einer kleiner Schliefe aus die den Status von 5 oder 6 Druckknöpfen über einen 4051 Demultiplexer einliest. Ist das OK vom Zeitaufwand?
@Smarthomeyourself
@Smarthomeyourself 3 года назад
War nicht nur in der Interrupt Methode der serial println n problem? Sollte in der loop Methode passen. Ne extra Schleife brauchst du doch garnicht oder?
@saschazapf5232
@saschazapf5232 3 года назад
@@Smarthomeyourself Für die 5 Buttons teilweise mit unterschiedlichem Zweck werde ich wahrscheinlich keine Schleife machen. Ging mir Grundsätzlich nur darum wie viel machen in diesem Interrupt machen kann. Ob die Beschränkung, mal von der Seriellen Kommunikation die selbstverständlich nicht geht abgesehen , irgendwo definiert ist. Wenn es nicht Hardwaremäßig limitiert ist und ich als Programmierer weiß was ich mache und was im Hintergrund abläuft, dann könnte ich als auch im Interrupt durch Timer 50 Potentiometer und Knöpfe über Demux' einlesen und dann in der eigentlichen Hauptschleife die Aktionen die aus den Zuständen passieren ausführen.
@Smarthomeyourself
@Smarthomeyourself 3 года назад
@@saschazapf5232wo das Limit liegt muss man wohl ausprobieren. So weit hab ich das noch nicht ausgereizt. Aber prinzipiell sollten die Interrupts so wenig wie möglich tun. Das ermitteln der Werte kann ja quasi konsequent erfolgen und bei trigger durch Interrupt werden die zuletzt gelesenen verarbeitet.
@saschazapf5232
@saschazapf5232 3 года назад
@@Smarthomeyourself Für die paar Knöpfe würde evtl. ja auch die Technik aus Arduino Basics #17 mit den Zwischenwiderständen gut funktionieren. Das wäre dann noch um einiges kürzer und ich könnte mein Projekt mit dem Attiny85 noch ein wenig kleiner machen. Denn dann reichen die Pins aus. Und danke für Deine schnelle Antwort.
@Smarthomeyourself
@Smarthomeyourself 3 года назад
@@saschazapf5232 solange du die Knöpfe nicht parallel nutzen möchtest sondern immer nur einen gleichzeitig wäre das eine möglichkeit.
@farukalioglu6736
@farukalioglu6736 3 года назад
Sehr gutes Video. Ich muss ebenfalls einen Interrupt in meinem Projekt benutzen, nur soll ich bei mir die Zählrichtung toggeln. Ein Zähler wird mit der jeweiligen Zählrichtung alle 150ms um 2 hoch- oder runtergezählt. Beispielsweise soll die Zählrichtung (+2) zu (-2) geändert werden sobald ein Taster gedrückt wurde und andersherum. Haben sie vielleicht eine Idee wie man das in dem Interrupt hinkriegt.
@Smarthomeyourself
@Smarthomeyourself 3 года назад
Dann brauchst du nur eine globale variable um die Richtung zu merken und die setzt du in der Interrupt Methode um. Zähler läuft im loop mit delay(150) und fragt die variable ab ob er rauf oder runter zählt. Das wäre es auch schon :)
@farukalioglu6736
@farukalioglu6736 3 года назад
@@Smarthomeyourself Vielen Dank. Also ich deklariere dann bspw. eine Variable:volatile unsigned int Zaehlrichtung = +2; Im Interrupt wird es zu: Zaehlrichtung=!Zaehlrichtung; und im loop wäre das: if (Zaehlrichtung==2+){ zaehler = zaehler+Zaehlrichtung; } Habe ich das so richtig verstanden? Danke für die Hilfe.
@Smarthomeyourself
@Smarthomeyourself 3 года назад
@@farukalioglu6736 fast. aber ich würde da du eh nur 2 Stati brauchst boolean nehmen. Ist einfacher abzufragen. Also entweder du hast n int und merkst dir immer +2 oder -2 (das + brauchst du da ja nicht schreiben, und schon gar nicht hinter der zahl. Ich würde mir aber eher nur die richtung im boolean merken (oder byte) und dementsprechend dann +2 oder -2 rechnen also so was wie const unsigned int INTERRUPT_PIN = 2; volatile boolean forward = true; int zaehler = 0; void setup(){ attachInterrupt(digitalPinToInterrupt(INTERRUPT_PIN), interruptMethode, RISING); } void loop() { zaehler += forward ? 2 : -2; } void interruptMethode() { forward = !forward; }
@farukalioglu6736
@farukalioglu6736 3 года назад
@@Smarthomeyourself Vielen Dank für die Hilfe. VG
@sipe9316
@sipe9316 2 года назад
Wie macht man es ,sodass die Lampe eine bestimmte Zeit lang leuchtet?
@Smarthomeyourself
@Smarthomeyourself 2 года назад
Z. B. Einschalten, mit delay (oder schöner mit ner while schleife) warten und dann abschalten.
@EmbSys
@EmbSys 3 года назад
Mein Hinweis zu "volatile": Der Compiler hat beim Übersetzen unseres Programms die Möglichkeit, zu optimieren. Dabei legt er gerne Variablen in Register, statt ins RAM, denn auf Register kann der Prozessor viel schneller zugreifen. Oder der Compiler kürzt anderweitig ab, weil er der Meinung ist, die Variable könne sich eh nicht ändern. Bei Interrupts wäre das ein Problem, da auch die Interrupt Service Routine auf die selben Variablen zugreifen wird. Daher sage ich mit volatile: "Bei dieser Variable bitte nicht optimieren!"
@geraldbrito7930
@geraldbrito7930 4 года назад
Video
Далее
[How2] Digitaler Zähler
10:24
Просмотров 33 тыс.
ЛОВИМ НОВЫХ МОНСТРОВ В LETHAL COMPANY
2:42:22
How to Use Arduino Interrupts The Easy Way
33:28
Просмотров 82 тыс.
Interrupts RICHTIG angewendet! | #EdisTechlab
11:48
Просмотров 6 тыс.
Pin Change Interruptions ISR | PCINT | Arduino101
14:19
Level Up Your Arduino Code: Timer Interrupts
17:22
Просмотров 228 тыс.
ЛОВИМ НОВЫХ МОНСТРОВ В LETHAL COMPANY
2:42:22