In acest exemplu vom folosi tranzistorul MOS-FET impreuna cu un buton pentru a aprinde si stinge un led.
Pentru a face acest lucru vom folosi intreruperile oferite de catre Arduino.
Butonul se va conecta la pinul digital 2 si va avea un rezistor PULL-DOWN de 10KiloOhmi.
Celelalte conexiuni raman neschimbate, acestea fiind cele din articolul anterior.
Sketchul folosit este cel de mai jos:
int mosfet = 3;
int buton = 2;
long timp_debounce = 50;
volatile unsigned long ultima_micro;
void setup() {
pinMode(mosfet, OUTPUT);
pinMode(buton, INPUT);
digitalWrite(mosfet, HIGH);
attachInterrupt(digitalPinToInterrupt(buton), debounceApasare, RISING);
}
void loop() {
}
void debounceApasare() {
if((long)(micros() - ultima_micro) >= timp_debounce * 1000) {
butonApasat();
ultima_micro = micros();
}
}
void butonApasat() {
int buf = digitalRead(mosfet);
if (buf == 0) {
digitalWrite(mosfet, HIGH);
} else {
digitalWrite(mosfet, LOW);
}
}
Vom modifica sketchul in asa fel incat ledul sa fie aprins initial pentru o perioada de 3 secunde apoi se va stinge automat. Ulterior la fiecare apasare de buton ledul se va aprinde iarasi pentru aceeasi perioada de 3 secunde.
Codul modificat se poate vedea mai jos:
int mosfet = 3;
int buton = 2;
long timp_debounce = 50;
volatile unsigned long ultima_micro;
int perioada = 3000;
unsigned long timpAcum = 0;
void setup() {
pinMode(mosfet, OUTPUT);
pinMode(buton, INPUT);
digitalWrite(mosfet, HIGH);
attachInterrupt(digitalPinToInterrupt(buton), debounceApasare, RISING);
}
void loop() {
while (millis() > timpAcum + perioada) {
timpAcum = millis();
digitalWrite(mosfet, LOW);
}
}
void debounceApasare() {
if((long)(micros() - ultima_micro) >= timp_debounce * 1000) {
butonApasat();
ultima_micro = micros();
}
}
int butonApasat() {
int buf = digitalRead(mosfet);
if (buf == 0) {
digitalWrite(mosfet, HIGH);
} else {
digitalWrite(mosfet, LOW);
}
timpAcum = millis();
return timpAcum;
}
Un video cu montajele in functiune se poate vedea mai jos: