Eines de l'usuari

Eines del lloc


tutorials:arduino:00_arduino_basic:01_no_delay

BLINK sense delay

El delay() es molt fàcil de programar però atura el programa principal. Mentre fa el delay() no comprova ni les entrades, ni podem fer altra temporització mentre fen la primera. Per això no podem fer anar dos leds intermitents amb dues velocitats diferents.

Per fer el BLINK sense delays necessitem:

  • Variables
  • Condicional
  • funció millis()

Variables

Normalment a qualsevol programa l'ús de variables es imprescindible. Les variables cal definir-les abans d'utilitzar-les així el microcontrolador guardarà ja espai a la memòria per utilitzar-la. Així que la estructura del programa es:

  1. definicio de variables
  2. setup()
  3. loop()
// definicio de variables
int comptador=0

// setup
setup (){

}

// loop bucle infinit
void loop(){

}

Cal definir el tipus de variable per reservar una quantitat de momoria justa:

tipus Bytes memoria a reservar Posibles valors
int 2 -32768 a 32767
unsigned int 2 0 a 65535
long 4 -2147483648 a 2147483647
unsigned long 4 4294967295
float 4 -3.4028235E+38 a 3.4028235E+38
byte 1 0 a 255
char 1 -128 a 127
string array de chars
void cap valor

Condicional if...else

El estament o instrucció if fa una comparació, si aquesta es compleix executa el que hi ha despres entre { … } si no es compliex la condició no executa { … } i segueix el programa, es a dir:

 if(condicio){
 //...  instruccions si es compleix la condició
 }

Si no es compleix la condició però abans ds serguir executat el codi normalment volem que executi altres instruccions utilitzarem el else

 if(condicio){
// ... instruccions si es compleix la condició
} 
else {
// ... instruccions que cal executar després de que la condició no es compleixi
// i abans de seguir el programa 
}

Exemple de variables i condicional.

Definim una variable i li donem un valor, si el valor es major de 100 el led estarà en marxa si no (else) estarà parat:

int x= 80;

void setup(){
pinMode(5, OUTPUT);
}

void loop(){
if (x >= 100) digitalWrite(5, HIGH);
if (x < 100) digitalWrite(5, LOW);
}

Amb else podem simplificar, else vol dir si no es compleix primera condició fes el següent i després seguix el programa.

8-O Exercici 1: Fer el mateix programa que abans però amb else

Si només hi ha una instrucció no cal posar { }
int x= 80;

void setup(){
pinMode(5, OUTPUT);
}

void loop(){

if (x >= 100) {
digitalWrite(5, HIGH);}

else  {
digitalWrite(5, LOW);
}

}

Aquest es el exemple de blink sense delay que hi ha mateix IDE d'Arduino:

const int ledPin =  13;
int ledState = LOW;
unsigned long previousMillis = 0;
const long interval = 1000;          

void setup() {
  pinMode(ledPin, OUTPUT);
}

void loop() {
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;

    if (ledState == LOW) {
      ledState = HIGH;
    } else {
      ledState = LOW;
    }
    digitalWrite(ledPin, ledState);
  }
}

8-O Exercici 2: Fer que dos leds(pins 7 i 8) tinguin fos temporitzacions diferents 1000ms i 50ms

timerOne

Sembla que ja he trobat una llibreria que pot facilitar el tema. He trobat aquest firmware que converteix Arduino amb un PLC http://soapboxautomation.com/, i utilitza el timerOne. Que es pot instal·lar des de el gestor de llibreires i aquest es el exemple del blink que funciona per interrupcions i el programa principal compta les intermitències.

bilnk_interrupt_timerOne.pde
#include <TimerOne.h>
 
// This example uses the timer interrupt to blink an LED
// and also demonstrates how to share a variable between
// the interrupt and the main program.
 
 
const int led = LED_BUILTIN;  // the pin with a LED
 
void setup(void)
{
  pinMode(led, OUTPUT);
  Timer1.initialize(150000);
  Timer1.attachInterrupt(blinkLED); // blinkLED to run every 0.15 seconds
  Serial.begin(9600);
}
 
 
// The interrupt will blink the LED, and keep
// track of how many times it has blinked.
int ledState = LOW;
volatile unsigned long blinkCount = 0; // use volatile for shared variables
 
void blinkLED(void)
{
  if (ledState == LOW) {
    ledState = HIGH;
    blinkCount = blinkCount + 1;  // increase when LED turns on
  } else {
    ledState = LOW;
  }
  digitalWrite(led, ledState);
}
 
 
// The main program will print the blink count
// to the Arduino Serial Monitor
void loop(void)
{
  unsigned long blinkCopy;  // holds a copy of the blinkCount
 
  // to read a variable which the interrupt code writes, we
  // must temporarily disable interrupts, to be sure it will
  // not change while we are reading.  To minimize the time
  // with interrupts off, just quickly make a copy, and then
  // use the copy while allowing the interrupt to keep working.
  noInterrupts();
  blinkCopy = blinkCount;
  interrupts();
 
  Serial.print("blinkCount = ");
  Serial.println(blinkCopy);
  delay(100);
}
tutorials/arduino/00_arduino_basic/01_no_delay.txt · Darrera modificació: 2019/01/17 00:34 per crevert