blikanie len niekolko krat

Sperhak
Příspěvky: 46
Registrován: 22 čer 2018, 19:49
Reputation: 0

Re: blikanie len niekolko krat

Příspěvek od Sperhak » 22 črc 2018, 11:39

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.

Uživatelský avatar
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

Příspěvek od pavel1tu » 22 črc 2018, 11:45

Sperhak píše:
21 črc 2018, 18:02
Zdraví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ť?
Zdar,
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"

petan
Příspěvky: 358
Registrován: 23 črc 2017, 10:19
Reputation: 0
Kontaktovat uživatele:

Re: blikanie len niekolko krat

Příspěvek od petan » 22 črc 2018, 11:53

@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.

rejze69
Příspěvky: 174
Registrován: 02 dub 2018, 18:56
Reputation: 0

Re: blikanie len niekolko krat

Příspěvek od rejze69 » 22 črc 2018, 15:24

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.

Sperhak
Příspěvky: 46
Registrován: 22 čer 2018, 19:49
Reputation: 0

Re: blikanie len niekolko krat

Příspěvek od Sperhak » 22 črc 2018, 16:05

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ť

rejze69
Příspěvky: 174
Registrován: 02 dub 2018, 18:56
Reputation: 0

Re: blikanie len niekolko krat

Příspěvek od rejze69 » 22 črc 2018, 16:56

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.

Uživatelský avatar
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

Příspěvek od pavel1tu » 23 črc 2018, 07:18

rejze69 píše:
22 črc 2018, 16:56
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.
SOUHLAS

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"

Sperhak
Příspěvky: 46
Registrován: 22 čer 2018, 19:49
Reputation: 0

Re: blikanie len niekolko krat

Příspěvek od Sperhak » 24 črc 2018, 10:19

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
    }
  }
}

rejze69
Příspěvky: 174
Registrován: 02 dub 2018, 18:56
Reputation: 0

Re: blikanie len niekolko krat

Příspěvek od rejze69 » 24 črc 2018, 13:50

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á.

Sperhak
Příspěvky: 46
Registrován: 22 čer 2018, 19:49
Reputation: 0

Re: blikanie len niekolko krat

Příspěvek od Sperhak » 24 črc 2018, 15:21

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á.

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 3 hosti