blikanie len niekolko krat
Re: blikanie len niekolko krat
Program ako tak chápem ,len som nevedel čo je to samotné if (b) vďaka za vysvetlenie .A neexistuje nejaký návod kde by to bolo takto vysvetlené že samotné b je b 1 count--; je mínus ja by som logicky to - dal len jedno a potom by som sa čudoval že to nejde. viem že = nastaví a == porovná ale proste nejaký návod kde je to takto jednoducho vysvetlené všetky tie znamienka najlepšie po sk/cz ak o niečom viete.
- pavel1tu
- Příspěvky: 2054
- Registrován: 26 říj 2017, 08:28
- Reputation: 0
- Bydliště: Trutnov
- Kontaktovat uživatele:
Re: blikanie len niekolko krat
Zdar,Sperhak píše: ↑21 črc 2018, 18:02Zdravím potreboval by som vyriešiť niečo takéto. Majme nejaký program v nom sa zmení d na 0 alebo 1 a zakaždým by som potreboval keď sa zmení d na nejakú hodnotu aby 3x blikla ledka v t intervaloch,s delayom to viem ale chcel by som to bez delay zatial mám niečo takéto to ale ledka bliká donemoty ak je d 1
Chcel by som aby pri 0 blikla 3x a pri 1 napr 5x v takom 100ms intervale vedely by ste ma nasmerovať?
prakticky ve všech složitějších projektech používám TaskScheduler.h
- umí provádět TASK(část programu) jednou za čas
- umí provádět TASK , když se něco splní
- každý TASK jde zapnout/vypnout kdykoliv od podmínky
- umí TASK po zapnutí, pak ho vypne
a spoustu dalšího ....
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"
Pavel1TU
"Správně napsaný kod lze číst jako knihu"
Re: blikanie len niekolko krat
@Sperhak koukni na arduino.cz. Tam se dá stáhnout kniha. Nebo si ji můžeš koupit. Myslím, že pro začátečníka dobrý. Jinak tím, čím se programuje Arduino je obyčejný Cčko s knihovnou Arduino, která ti usnadní spoustu věcí.
@pavel1tu Sám jsem v jednom programu použil Tasker ( http://joysfera.blogspot.com/2015/03/ta ... duinu.html ). Funguje v podstatě podobně. Možná má míň funkcí oproti tomu tvýmu.
@pavel1tu Sám jsem v jednom programu použil Tasker ( http://joysfera.blogspot.com/2015/03/ta ... duinu.html ). Funguje v podstatě podobně. Možná má míň funkcí oproti tomu tvýmu.
Re: blikanie len niekolko krat
Pro mne je nejschůdnější cesta jak začít třeba zrovna s arduinem najít nějaký jednodušší funkční sketch nebo raději dva. Prostuduji a zjišťuji postupně co k čemu je tzn. funkci obsažených příkazů,zkusmo udělám pár droných změn a když mi ty změny začnou fungovat, přepíšu to co se mi nezdá optimální a přidám k tomu další další funkce, kdy se za pochodu seznamuji s dalšími příkazy.
Tady jsem psal o prvním seznámeni s arduinem. https://www.arduino-forum.cz/viewtopic. ... 3281#p3281
To už se mi osvědčilo i v jiných případech.
Tady jsem psal o prvním seznámeni s arduinem. https://www.arduino-forum.cz/viewtopic. ... 3281#p3281
To už se mi osvědčilo i v jiných případech.
Re: blikanie len niekolko krat
rejze69 : V podstate aj ja to tak robím že sa učím už z postavených projektov nejak s toho pozliepam svoj.Len ťažké je nájsť si tú správnu cestu lebo každý to robí ináč a každému to funguje len čo je dobre napísané čo nie.Zatial ma to moc netrápi lebo robím jednoduché veci ale,ked budem musieť šetriť pamäť alebo výkon tak už to budem potrebovať
Re: blikanie len niekolko krat
To ne. Já to přepsal jen pro pochopení pravidel. Druhý projekt https://www.arduino-forum.cz/viewtopic.php?f=38&t=1316 si už dělám bez slepování po svém. To slepování není dobrá cesta, protože z vlastní hlavy to mnohem líp navazuje na další kusy kódu. Vlastně je potřeba si z toho vzít spíš jen pravidla než stavební díly.
- pavel1tu
- Příspěvky: 2054
- Registrován: 26 říj 2017, 08:28
- Reputation: 0
- Bydliště: Trutnov
- Kontaktovat uživatele:
Re: blikanie len niekolko krat
SOUHLASrejze69 píše: ↑22 črc 2018, 16:56To ne. Já to přepsal jen pro pochopení pravidel. Druhý projekt https://www.arduino-forum.cz/viewtopic.php?f=38&t=1316 si už dělám bez slepování po svém. To slepování není dobrá cesta, protože z vlastní hlavy to mnohem líp navazuje na další kusy kódu. Vlastně je potřeba si z toho vzít spíš jen pravidla než stavební díly.
já z příkladů, nebo z nějakého projektu "prozkoumám" jak daná část co potřebuji funguje a poté co to pochopím, to zakomponuji do čistého projektu.
PS: moje kody jsou z 50% komentáře (píši i odkud jsem danou část použil, 2 TASKy mám jen na ladění, poté co je povolím v menu ... atd.)
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"
Pavel1TU
"Správně napsaný kod lze číst jako knihu"
Re: blikanie len niekolko krat
Tak som to skompletoval s mojim alarmom kde to chcem použiť a nefunguje to. Lámem si nad tým hlavu a neviem na nič prísť samostatne to blikanie funguje keď sa prepína tlačidlom funkcia b . Aj alarm mi funguje až do kým som nenapísal do tejto podmienky if (b == 1 && count1 == 6) ten count vtedy to začne blbnúť. Ked stlačím tlačidlo prvý krát tak sa nastaví count1 = 18 a b = 1 ale count1 sa drží na 18 a nejde ďalej (odsledoval som si to na serialy) ked stlačím tlačidlo druhý krát tak sa b nastaví na 0 count začne odpočítavať a ledka blikať počas tohto arduino nereaguje na tlačidlo. Kde by mohol biť problém? Je toho už na arduino veľa a nestíha to?
Kód: Vybrat vše
#include <avr/sleep.h>
#include <SoftwareSerial.h>
unsigned long cas_0_5s = 500;
unsigned long cas_1s = 1000;
unsigned long cas_4s = 6000;
unsigned long cas_5s = 5000;
unsigned long cas_23s = 23000;
unsigned long time55 = 0;
unsigned long time5 = 0;
unsigned long ledka_cas = 0;
int dvere = 2;
int vypnutie = 3;
int tlacidlo = 4;
int sim900power = 5;
int kontrolka = 13;
SoftwareSerial SIM900(7, 8);//7 je RX 8 je TX
int pir = 9;
int buttonState; //nejnovější hodnota načtená ze vstupního pinu
int lastButtonState = LOW; // předchozí hodnota načtení ze vstupního pinu
long lastDebounceTime = 0; // čas posledního změny výstupního pinu
long debounceDelay = 50; // 4as po ktor7 sa mus9 dr6at tla4idlo
int sleepStatus = 0; // variable to store a request for sleep
int count = 0; // counter
int a; //pomocna premenna pre volanie
int b;//pomocna premenna pre sleep mode aby prepinal medzi pinmi 2 a 3
int c;// pomocne premenna pre
unsigned long currentMillis;
unsigned long currentMillis1;
unsigned long aktualny_cas;
unsigned long lastTime; //proměnná s uloženým časem posledního vyvolání funkce
unsigned long presentTime; //proměnná pro aktuální čas
bool ledState; //aktuální stav LEDky
byte lastd; //tato proměnná se hlídá
byte count1; //kolikrát má LEDka bliknout
int pirStav = HIGH;
void setup()
{
Serial.begin(9600);
pinMode(dvere, INPUT_PULLUP);
pinMode(vypnutie, INPUT_PULLUP);
pinMode(tlacidlo, INPUT);
pinMode(pir, OUTPUT);
pinMode(kontrolka, OUTPUT);
pinMode(sim900power, OUTPUT);
a = 0; // nastavi aby volanie prebiehalo odzaciatku
b = 0;
c = 0;
count1 = 0;
pirStav = HIGH;
}
void loop() {
// currentMillis1 = millis();
button();
ledka();
Serial.print(count1);
Serial.print("\n");
Serial.print(b);
Serial.print("\n");
if (a == 8 && b == 0 ) { // zaruci ze po prebudeni (pin2) sa musi dokoncit volanie aby sa mohol uspat a==8
delay(15000);//cas na opustenie priestoru //taktiez sluzi nato aby sa dal alarm aktivovat a deaktivovat tlacidlom b==0
a = 0; // nastavi aby volanie prebiehalo odzaciatku
c = 0; // dovolí volat
sleepNow(); //uspí sa
}
//ked sa podrzi tlacidlo 3s zmeni sa b a tym sa prepne v sleep mode interupt na pinoch 2 a 3
// a tym sa alarm bud aktivuje alebo deaktivuje
if (b == 1 && count1 == 6) { //sluzi na vypnutie alarmu pomocou tlacidla currentMillis1 - time5 > cas_1s &&
// time5 = currentMillis1;
a = 8;
c = 1; //zakaze volanie
count1 = 0;
digitalWrite(sim900power, LOW); //vypne modul
sleepNow(); //uspí sa
}
if (b == 0 && c == 0) { //zaruci ze nezacne volat ked je alarm vypnuty alebo ked sa aktivoval a caka sa na opustenie priestoru
delay(500);
volaj();
}
}
void wakeUpNow() { // here the interrupt is handled after wakeup
}
void sleepNow() // here we put the arduino to sleep
{
if (b == 0) {
set_sleep_mode(SLEEP_MODE_PWR_DOWN); // sleep mode is set here
sleep_enable(); // enables the sleep bit in the mcucr register
// so sleep is possible. just a safety pin
attachInterrupt(0, wakeUpNow, LOW); // use interrupt 0 (pin 2) and run function
// wakeUpNow when pin 2 gets LOW
sleep_mode(); // here the device is actually put to sleep!!
// THE PROGRAM CONTINUES FROM HERE AFTER WAKING UP
sleep_disable(); // first thing after waking from sleep:
// disable sleep...
detachInterrupt(0); // disables interrupt 0 on pin 2 so the
// wakeUpNow code will not be executed
// during normal running time.
}
if (b == 1) {
set_sleep_mode(SLEEP_MODE_PWR_DOWN); // sleep mode is set here
sleep_enable(); // enables the sleep bit in the mcucr register
attachInterrupt(1, wakeUpNow, LOW); // use interrupt 0 (pin 3) and run function
// wakeUpNow when pin 2 gets LOW
sleep_mode(); // here the device is actually put to sleep!!
// THE PROGRAM CONTINUES FROM HERE AFTER WAKING UP
sleep_disable(); // first thing after waking from sleep:
// disable sleep...
detachInterrupt(1); // disables interrupt 0 on pin 3 so the
// wakeUpNow code will not be executed
// during normal running time.
}
}
void volaj() {
currentMillis = millis();
if (a == 8 or a == 0) {
a = 1;
digitalWrite(sim900power, LOW);
}
if (currentMillis - time55 > cas_1s && a == 1) { //po 1s zapne modul a zapne seriovu komunikaciu
time55 = currentMillis;
digitalWrite(sim900power, HIGH); //zapne modul
SIM900.begin(19200); //zapne serial
a = 2;
}
if (currentMillis - time55 > cas_5s && a == 2) { //po 5s napíse heslo
time55 = currentMillis;
SIM900.println("AT+CPIN="); // napis heslo
a = 3;
}
if (currentMillis - time55 > cas_4s && a == 3) { //po 4s zavolá na číslo
time55 = currentMillis;
SIM900.println("ATD + ;"); // zavolaj na cislo
a = 4;
}
if (currentMillis - time55 > cas_23s && a == 4) { //po 23s ukončí hovor
time55 = currentMillis;
SIM900.println("ATH"); // ukonci hovor
a = 5;
}
if (currentMillis - time55 > cas_1s && a == 5) { //po 1s zavolá na číslo
time55 = currentMillis;
SIM900.println("ATD + ;");// zavolaj na cislo
a = 6;
}
if (currentMillis - time55 > cas_23s && a == 6) { //po 23s ukončí hovor
time55 = currentMillis;
SIM900.println("ATH"); // ukonci hovor
a = 7;
}
if (currentMillis - time55 > cas_0_5s && a == 7) { //po pol s vypne modul
time55 = currentMillis;
digitalWrite(sim900power, LOW); //vypne modul
a = 8;
c = 1;
}
}
void button() {
int reading = digitalRead(tlacidlo);// Stav spínača priradí do premennej reading
if (reading != lastButtonState) { // Pokud se spínač změnil kvůli šumu nebo stlačení:
lastDebounceTime = millis(); // upravte proměnou lastDebounceTime
}
if ((millis() - lastDebounceTime) > debounceDelay) { // Ať už je načtená hodnota jakákoliv, byla tam déle než debounce prodleva,
if (reading != buttonState) { // Pokud se stav tlačítka změnil:
buttonState = reading;
if (buttonState == HIGH) { // LED přepněte pouze když je nový stav tlačítka označen jako HIGH
pirStav = !pirStav;
b = !b;
}
}
}
digitalWrite(pir, pirStav);
lastButtonState = reading; // načtené hodnoty uložte. V příští smyčce bude označeno jako lastButtonState:
}
void ledka() {
presentTime = millis(); //uložení aktuálního času do proměnné
if (presentTime - lastTime >= 250) {
//toto se spouští každých 250 ms
lastTime = presentTime;
ledState = !ledState; //blikání s proměnnou v intervalu 50 ms
if (count1 > 6) {
digitalWrite(kontrolka, ledState);
count1--;
}
else {
digitalWrite(kontrolka, LOW);
}
}
if (b != lastd) {
//proběhla změna stavu
ledState = true; //zapnu Ledku
if (b) {
count1 = 18; //nastav počet bliknutí na 5 (je nutné zadat dvojnásobek 1 bliknutí = jednou svítí, pak zas ne)
}
else {
count1 = 14; //nastav počet bliknutí na 3
}
}
}
Re: blikanie len niekolko krat
Koukám na to na mobilu, tak nevidim dobře souvislosti. Otázka je odkud voláš void button() a jestli se volá i při odpočtu. Možná to tou částí při odpočtu vůbec neorobíhá.
Re: blikanie len niekolko krat
button je hneď prvý v hlavnom loope tak teoreticky by s tým nemal biť problém.Ale skúsim sa nato zamerať kedže nič iné ma nenapadá.
Kdo je online
Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 22 hostů