Brille le sketch sans delay ()

Bonjour à tous et bienvenue sur notre post d'aujourd'hui. Aujourd'hui, il s'agit d'un Sketch probablement tout le monde connaît, et certainement déjà plusieurs Fois, sur ses Microcontrôleurs à télécharger: le Sketch Blink.

J'ai moi-même Sketch jamais beaucoup d'Attention, et utilisez-le uniquement pour vérifier si un Module du tout un Signe de vie de lui-même.

L'Utilisation de delay(1000) dans le Sketch Blink mais présente un gros Inconvénient: le Microcontrôleur est en attente à la Place d'une Seconde (1000 ms), et peut être le Temps de rien faire d'autre. C'est donc pendant le Délai n'est pas possible, une deuxième allume brièvement et à nouveau de changer.

Le problème se pose aussi quand on est sur un Projet travaille chez le pendant le Clignotement de l'État d'une broche à interroger, par exemple pour vérifier si un Commutateur est enfoncé. Si un Bouton-pression au cours du Délai enfoncée, et avant la Fin du Délai a été relâché, le Microcontrôleur rien avec.

Nous prenons suivantes petite des Bouts de Code, par Exemple:

  void setup() {

  pinMode(3, SORTIE);   pinMode(4, SORTIE);   pinMode(8, INPUT);
}

void loop() {   if (digitalRead(8) == HIGH){     digitalWrite(4, !digitalRead(4)); // active / Désactive la LED sur la broche 4/arrêt   }   digitalWrite(3, HIGH); // LED sur la Broche 3 DE   delay(1000); // Pause   digitalWrite(3, LOW); // LED sur la Broche 3 DE   delay(1000); // Pause
}  

Au Début de la "void loop()Boucle, nous pouvons lire l'État du Bouton à la Broche 8 de. Si ce HAUT est par digitalWrite sur la Broche 4 de la Valeur de la Broche 4 vice-versa.

Ensuite, nous allons activer la Broche 3 de HAUT, attendez une Seconde, Shalten le code Pin de nouveau sur LOW, et en attente d'une Seconde.

Maintenant, si nous pendant les deux Delays l', appuyez sur ce Bouton se passe rien. Ce n'est que lorsque le Bouton enfoncé pendant la digitalRead(8) est appelée, nous nous tournons sur la deuxième LED, respectivement.

Problématique a été, par exemple, lors de l'installation d'Alarme qui nous avons Récemment dans le Blog de l'avoir présenté. Un Capteur de mouvement a déclenché là l'Alarme. Maintenant, si vous avez devant l'Appareil d'état, et de saisir le Code de sécurité voulu, a toujours été de nouveau l'Alarme se déclenche, ce qui entraîne une Pause lors de la Saisie a mené.

Il est donc recommandé de les delay (), Fonction de renoncer.

Une Solution possible serait-il, par exemple, le Retard de 100 ms ou encore moins de réduire, et à chaque Passage d'un Compteur haut de compter. Si cette puis atteint une Valeur donnée a, si on le met à 0 et allume la LED.

Tout le Travail, nous pouvons, Grâce à la millis() Fonction économisez. La Fonction millis() renvoie le Nombre de Millisecondes écoulées depuis le Démarrage du Programme en cours se sont écoulés. Le Chiffre est d'environ 50 Jours est remise à 0.

Pour cette Valeur dans une Variable pour stocker de Type "unsigned long" de l'être. Cela permet à un Nombre compris entre0 et 4 294 967 295.

Dans notre Exemple, nous allons créer une Variable avec le Nom "previousMillis" et de créer une Variable de Type "const" dans laquelle nous avons l'Intervalle de 1000 ms à définir.

Lors de la traversée de "void loop ()", nous devons la Sortie de milis() dans la Variable "currentMillis" à partir de. Ensuite, vérifie si depuis le dernier Passage de 1000 ms se sont écoulées. Si oui, la Valeur de previousMillis de currentMillis écrasé, et le VOYANT s'allume ou éteint.

 

unsigned long previousMillis = 0; // stocke la Date de la dernière commuté a été
const long interval = 1000; // Longueur de la Pause en ms

void setup() {   pinMode(3, OUTPUT); // LED 1   pinMode(4, OUTPUT); // LED 2   pinMode(8, INPUT);  // Bouton
}

void loop() {   if (digitalRead(8) == HIGH){     digitalWrite(4, !digitalRead(4)); // active / Désactive la LED sur la broche 4/arrêt   }
 unsigned long currentMillis = millis(); // Heure actuelle dans currentMillis enregistré   if (currentMillis - previousMillis >= interval) { // Si plus de 1000 ms se sont écoulées      previousMillis = currentMillis; // Date de la dernière Diffusion, il est précisé    digitalWrite(3, !digitalRead(3)); // la LED est éteinte à   }
}

 

Maintenant, nous pouvons la deuxième LED avec le Bouton, indépendamment de ce que la première LED de puissance.

Ceux qui le tout maintenant construits, et le Code, vous constaterez que la Boucle autant de fois passer, que c'est un bouton-Poussoir n'est pas facile, la deuxième LED à allumer.

Nous devons ici sur la Touche rebonds (de l'Angl. debouncing), mais c'est un Sujet pour un autre article du Blog.

J'espère aujourd'hui, Contribution Vous a montré comment il peut être facile de millis() de travailler.

Nous vous remercions de l'Intérêt croissant et les Commentaires de ces dernières Semaines, et nous nous séparons, jusqu'au matin.

Votre Marc Neumann

 

 

 

 

 

Logiciel de base

2 commentaires

W. Parschfeld

W. Parschfeld

Alternativ wäre eine parallele Programmierung zu empfehlen – kann für viele zufälligen parallele Ereignisse benutz werden: z.B. Analog-Uhr auf graf. Display, Abfrage verschiedener Steuerimpulse, Kommunikation über I2C etc. (z.B. vom WiFi-Modul), laden von SD-Card… Gute Erfahrungungen habe ich mit der Bibliothek TimedAction gemacht …

A. Deppe

A. Deppe

Im Prinzip eine gute Idee – allerdings gibt es genau für dieses Problem (wenigstens für die MKR’s) die “scheduler” Funktion. Zusammen mit dem Scheduler macht die Delay (und Yield) Funktion dann wieder absolut Sinn , denn Delay legt die entsprechende Funktion in der Delay angewendet wird für den Delay Zeitraum schlafen und gib die Rechenzeit für andere “geschedulte” Funktionen frei. Das ist erheblich effizienter und ermöglicht multitasking.

Noch eine Bemerkung zu dem angeschnittenen Thema “Alarmanlage”: Wenn man Eingaben sicher verarbeiten will, ist es meistens eine gute Idee das Interupt handling dafür zu bemühen. Ich würde versuchenden die void loop so klein wie möglich zu halten und da nur das Interupt handling drin zu realisieren. Die eigentliche Verarbeitung würde ich in eigene Funktionen auslagern. Das ist nicht nur übersichtlicher sondern auch Speicher effizienter, weil die Funktionen/Variablen nur zur Laufzeit instanziert werden.

Auch hier kann der Scheduler helfen – um z.B. Ein- und Ausgabe zu deserialisieren.

Laisser un commentaire

Tous les commentaires sont modérés avant d'être publiés

Messages de blogs recommandés

  1. Installez maintenant ESP32 via l'administrateur de la carte
  2. Lüftersteuerung Raspberry Pi
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1
  4. ESP32 - das Multitalent
  5. OTA-Over the Air-ESP Programmation par WiFi