Wiring, C++, C, Java, ...
Pravidla fóra
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
-
zixie
- Příspěvky: 2
- Registrován: 27 črc 2022, 14:14
- Reputation: 0
Příspěvek
od zixie » 27 črc 2022, 14:27
Ahoj,
rád bych se zeptal. Mám menší projekt s časovačem a doba stisknutí tlačítka, aby se resetovala časomíra je delší než bych si představoval, jde o cca 1s a já bych potřeboval okamžitý reset při stisku tlačítka. Existuje nějaký způsob, aby Arduino zareagovalo ihned po stisku tlačítka?
Díky.
Zde je můj program:
Kód: Vybrat vše
// Display TM1637
// Library
#include <Arduino.h>
#include <TM1637Display.h>
//setting numbers of pins for connecting with Arduino
#define CLK 3
#define DIO 4
//variable of button for reset timer and power supply for sensor
int Button1 = 2;
int Sensor = 8;
//instance of display from library TM1637
TM1637Display displej(CLK, DIO);
void setup() {
pinMode(Button1,INPUT_PULLUP);
pinMode(Sensor,OUTPUT);
// setting of brightness 8-15
displej.setBrightness(12);
}
// Reset function
void(*resetFunc) (void) = 0;
void loop()
{
//create a variable "vypis" for saving information about individual symbols
uint8_t vypis[] = { 0, 0, 0, 0 };
long cas = millis()/1000;
//recalculate minutes and seconds
vypis[0] = displej.encodeDigit((cas/60)/10);
vypis[1] = displej.encodeDigit((cas/60)%10);
vypis[2] = displej.encodeDigit((cas%60)/10);
vypis[3] = displej.encodeDigit((cas%60)%10);
//writing information on display
displej.setSegments(vypis);
delay(500);
//function of colon between numbers
// is necessary to add 1 to value 128
vypis[1] = vypis[1]+128;
displej.setSegments(vypis);
delay(500);
// Reset condition
if(digitalRead(Button1) == LOW)
{
digitalWrite(Sensor , HIGH); //Power supply of sensor
resetFunc();
}
}
-
peterple
- Příspěvky: 156
- Registrován: 22 zář 2021, 20:20
- Reputation: 0
Příspěvek
od peterple » 27 črc 2022, 21:34
Ľahko sa to dá aj bez prerušenia. Zásadné je nepoužívať delay, ale millis. Tu máš máličko upravný príklad samotného Arduina
BlinkWithoutDelay. Miesto vypisovania displeja blikám ledkou. A tú tvoju reset fičúru som si tam zapoznámkoval. Ma to takú jednu malú chybku ale to asi zbadáš a dá sa to ľahko napraviť.
Kód: Vybrat vše
const int ledPin = LED_BUILTIN;// the number of the LED pin
int vypisStav = 0;
unsigned long vypisaneVcase = 0;
const long interval = 500;
void setup() {
// set the digital pin as output:
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LOW);
}
void loop() {
unsigned long teraz = millis();
if (teraz - vypisaneVcase >= interval) {
vypisaneVcase = teraz;
if (vypisStav){
digitalWrite(ledPin, HIGH); // prvy vypis
} else {
digitalWrite(ledPin, LOW); // druhy vypis
}
vypisStav ^= 1;
}
// if(digitalRead(Button1) == LOW)
// {
// digitalWrite(Sensor , HIGH); //Power supply of sensor
// resetFunc();
//
// }
}
-
martinius96
- Příspěvky: 579
- Registrován: 01 srp 2017, 19:29
- Reputation: 0
- Bydliště: Poprad
-
Kontaktovat uživatele:
Příspěvek
od martinius96 » 28 črc 2022, 21:34
Neskúmal som tvoj program, ale vidím tam ako zbytočnosť napríklad:
Kód: Vybrat vše
digitalWrite(Sensor , HIGH); //Power supply of sensor
Pred reštartom dosky dáš na pin Sensor HIGH a chceš aby ti tam tento stav ostal aj po reštarte dosky, lebo si GPIO nenastavil na inú (počitatočnú) úroveň? Po prvom stlačení tlačidla bude ten výstup nastavený na HIGH navždy, až pokým neodpojíš a nepripojíš napájanie. Nepasuje mi tam to použitie...
No a čo sa týka kódu, tak ako napísal kiRRow, využiješ externé prerušenie, ktoré bude reagovať na FALLING hranu, keďže využívaš INPUT_PULLUP:
Kód: Vybrat vše
// Display TM1637
// Library
#include <Arduino.h>
#include <TM1637Display.h>
//setting numbers of pins for connecting with Arduino
#define CLK 3
#define DIO 4
//variable of button for reset timer and power supply for sensor
const int Button1 = 2;
const int Sensor = 8;
//instance of display from library TM1637
TM1637Display displej(CLK, DIO);
void setup() {
pinMode(Button1, INPUT_PULLUP);
pinMode(Sensor, OUTPUT);
// setting of brightness 8-15
displej.setBrightness(12);
attachInterrupt(digitalPinToInterrupt(Button1), resetFunc, FALLING); // attach interrupt handler to input pin.
sei();
//UŽ TERAZ TI REŠTARTUJE DOSKU AK STLACIS TLACIDLO ESTE AJ PRED LOOP()
}
// Reset function
void(*resetFunc) (void) = 0;
void loop()
{
//create a variable "vypis" for saving information about individual symbols
uint8_t vypis[] = { 0, 0, 0, 0 };
unsigned long cas = millis() / 1000;
//recalculate minutes and seconds
vypis[0] = displej.encodeDigit((cas / 60) / 10);
vypis[1] = displej.encodeDigit((cas / 60) % 10);
vypis[2] = displej.encodeDigit((cas % 60) / 10);
vypis[3] = displej.encodeDigit((cas % 60) % 10);
//writing information on display
displej.setSegments(vypis);
delay(500);
//function of colon between numbers
// is necessary to add 1 to value 128
vypis[1] = vypis[1] + 128;
displej.setSegments(vypis);
delay(500);
}
-
zixie
- Příspěvky: 2
- Registrován: 27 črc 2022, 14:14
- Reputation: 0
Příspěvek
od zixie » 29 črc 2022, 08:43
Každá odpověď mi moc pomohla, děkuji.
Co se týče té podmínky, ano udělal jsem to nešikovně, protože jsem potřeboval na sensor neustálých 5V spolu s podminkou else, kterou jsem tady nedával. Každopádně spraveno
Kdo je online
Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 3 hosti