Close

uspání arduina nano

Úvodní stránka Fórum Vaše projekty Arduino uspání arduina nano

Označeno štítky: 

  • Toto téma obsahuje celkem 8 odpovědí. Do diskuze (5 diskutujících) se naposledy zapojil uživatel 4Coptera a poslední změna proběhla před 3 roky a 4 měsíci.
Aktuálně je na stránce zobrazeno 9 příspěvků - 1. až 9. (celkem z 9)
  • Autor
    Příspěvky
  • #11022
    michal09
    Účastník

    Zdravím všechny, kteří se zajímají o arduino.
    Rád bych požádal zkušenější programátory o radu a o pomoc s chybou v kódu. Nedaří se mi arduino nano uspat. Uspání je pro mě nutné abych ho mohl napájet z baterie, nicméně někde v kódu dělám chybu a za boha nemohu zjistit kde, tak se obracím na Vás o radu. Níže přikládám můj kód. Tento kód slouší pro odlazení chyb, kdy se snažím aby se každýou 20 sekundu v minutě arduino probudilo a vypsalo něco na serial monitor a pak šlo zase do hajan. Později místo textu bude posílat info o teplotě přes 433Mhz vysíláč. předem děkuji za případnou radu.

    #include <Wire.h>
    #include <DS3231.h> // DS3231 MASTER
    #include <avr/sleep.h>

    int wakePin =2;
    int i = 1;
    boolean sleep = false;

    DS3231 clock;
    RTCDateTime t;

    void setup() {
    Serial.begin(9600);
    clock.begin();
    pinMode(wakePin, INPUT_PULLUP);

    clock.armAlarm1(false);
    clock.clearAlarm1();
    clock.setAlarm1(0,0,0,20,DS3231_MATCH_S);

    // Manual (YYYY, MM, DD, HH, II, SS
    // clock.setDateTime(2017, 4, 13, 19, 21, 00);

    }

    void alarmIsr(){
    sleep_disable();
    sleep = false;
    Serial.print(„Probudil jsem se“);
    detachInterrupt(0);
    }

    void sleepNow(){
    sleep_enable();
    sleep = true;
    set_sleep_mode(SLEEP_MODE_PWR_DOWN);
    attachInterrupt(0,alarmIsr,CHANGE);
    sleep_mode();
    if(sleep)
    sleep_disable();
    Serial.print(„Muj kod obsahující infomaci o teplotě“);
    delay(1000);
    }

    void loop() {
    delay(100);
    t = clock.getDateTime();
    Serial.println(clock.dateFormat(„d/m/Y H:i:s“, t));
    Serial.println(i);
    i++;
    sleepNow();
    delay(900);
    }

    #11059
    posjirka
    Účastník

    když jsem to porovnal s examplem:
    http://arduino8.webnode.cz/news/lekce-27-adruino-a-napajeni-z-baterie-aneb-jak-uspat-arduino/
    tak máš řešení úplně jinak. Třeba pořadí příkazů ve sleepNow(), v režimu SLEEP_MODE_PWR_DOWN je interní časovač mrtvý a nelze se na něj odkazovat, nechápu princip attachInterrupt(0,alarmIsr,CHANGE); v kodu.
    Spíš napiš co chceš aby to dělalo a můžeme se na to podívat ..

    #11061
    michal09
    Účastník

    Výsledkem by mělo být, že mi arduino změří venkovní teplotu ca každých 10 minut a odešle pře vysílač 433MHZ a půjde zase spát. Jelikož za oknem nemám zásuvku, tak bude arduino napájeno z baterie a proto nutnost uspání. Nicméně moje kroky jsou postupné, tzn, nejprve si chci odladit kód pro uspání a následně přidat odesílání přes vysíláč 433Mhz.
    V kódu jsem našel již také chybu a také jsem našel na youtubu dobrý zdroj na uspání arduina, ale ani to mi nefunguje:

    Na serial monitoru se mi objeví následující:
    07/04/2017 20:33:17
    Woke up
    Woke up
    07/04/2017 20:33:18
    Woke up
    Woke up
    07/04/2017 20:33:19
    Woke up
    alarm zpusten
    Woke up
    Woke up
    vstup do spanku
    Woke up
    07/04/2017 20:33:22
    07/04/2017 20:33:23
    07/04/2017 20:33:24
    07/04/2017 20:33:25
    07/04/2017 20:33:26
    07/04/2017 20:33:27
    07/04/2017 20:33:28
    07/04/2017 20:33:29
    07/04/2017 20:33:30
    07/04/2017 20:33:31
    07/04/2017 20:33:32
    07/04/2017 20:33:33
    07/04/2017 20:33:34
    07/04/2017 20:33:35
    07/04/2017 20:33:36
    07/04/2017 20:33:37
    07/04/2017 20:33:38
    07/04/2017 20:33:39
    07/04/2017 20:33:40
    07/04/2017 20:33:41
    07/04/2017 20:33:42
    07/04/2017 20:33:43
    07/04/2017 20:33:44
    07/04/2017 20:33:45
    07/04/2017 20:33:46
    07/04/2017 20:33:47
    07/04/2017 20:33:48
    07/04/2017 20:33:49
    07/04/2017 20:33:50
    07/04/2017 20:33:51
    07/04/2017 20:33:52
    07/04/2017 20:33:53
    07/04/2017 20:33:54
    07/04/2017 20:33:55
    07/04/2017 20:33:56
    07/04/2017 20:33:57
    07/04/2017 20:33:58
    07/04/2017 20:33:59
    07/04/2017 20:34:00
    07/04/2017 20:34:01
    07/04/2017 20:34:02
    07/04/2017 20:34:03
    07/04/2017 20:34:04
    07/04/2017 20:34:05
    07/04/2017 20:34:06
    07/04/2017 20:34:07
    07/04/2017 20:34:08
    07/04/2017 20:34:09
    07/04/2017 20:34:10
    07/04/2017 20:34:11
    07/04/2017 20:34:12
    07/04/2017 20:34:13
    07/04/2017 20:34:14
    07/04/2017 20:34:15
    07/04/2017 20:34:16
    07/04/2017 20:34:17
    07/04/2017 20:34:18
    07/04/2017 20:34:19
    07/04/2017 20:34:20
    alarm zpusten
    vstup do spanku
    Woke up
    Woke up
    07/04/2017 20:34:22
    07/04/2017 20:34:23
    07/04/2017 20:34:24
    07/04/2017 20:34:25
    07/04/2017 20:34:26

    Trochu mi to přijde, jako by mi na ten pin 2 co mi má probouzet arduino ze spánku pořád něco posílalo bez ohledu na nastavený alarm.
    Na pin 2 jsem přivedl přímo SQW z DS3231, tak jako je to v tom odkazu na youtubu, ale když změřím napětí mezi GND a SQW, tak zjistím, že z SQW mi vlastně lezou pulzy, což by mě mohlo neustále zapína arduino bez ohledu na nastavený alarm.
    Původně mi ještě napadl rezistor mezi pinem 2 a SQW, ale to nepomohlo. Více méně mi stačí poradit jak rozchodit program co je na youtubu a měl bych vystaráno.

    kód z youtubu:
    #include <DS3231.h>
    #include <avr/sleep.h>
    #include <Wire.h>

    int wakePin = 2;
    int led = 13;

    DS3231 clock;
    RTCDateTime t;

    void setup() {
    Serial.begin(9600);
    Serial.println(„initislizace“);
    clock.begin();
    pinMode(wakePin, INPUT_PULLUP);
    pinMode(led,OUTPUT);

    clock.armAlarm1(false);
    clock.clearAlarm1();
    clock.setAlarm1(0,0,0,20,DS3231_MATCH_S);
    attachInterrupt(0,wakeUpNow,CHANGE);
    CheckAlarms();
    }

    void CheckAlarms(){
    RTCAlarmTime a1;
    RTCAlarmTime a2;
    if(clock.isArmed1()){
    a1 = clock.getAlarm1();
    Serial.print(„Alarm1 je nastaven“);
    switch(clock.getAlarmType1()){
    case DS3231_MATCH_S:
    Serial.print(„when second match: „);
    Serial.println(clock.dateFormat(„_ _:_:s“,a1));
    delay(100);
    break;
    default:
    Serial.println(„nezname nastaveni RTC“);
    break;
    }

    }
    }

    void wakeUpNow(){
    Serial.println(„Woke up“);
    delay(300);
    }

    void sleepNow(){
    set_sleep_mode(SLEEP_MODE_PWR_DOWN);
    sleep_enable();
    attachInterrupt(0,wakeUpNow,CHANGE);
    sleep_mode();

    sleep_disable();
    detachInterrupt(0);
    }

    void loop() {
    t = clock.getDateTime();
    Serial.println(clock.dateFormat(„d/m/Y H:i:s“, t));
    delay(100);

    if (clock.isAlarm1()){
    Serial.println(„alarm zpusten“);
    digitalWrite(led,HIGH);
    delay(1000);
    digitalWrite(led,LOW);
    Serial.println(„vstup do spanku“);
    delay(100);
    sleepNow();
    }

    delay(900);
    }

    #11062
    posjirka
    Účastník
    #11063
    michal09
    Účastník

    Díky, to je více méně. Zkusím pokud se mi podaří stáhnout ty knihovny, jelikož DS knihovnu používám jinou.

    #11085
    caci
    Účastník

    Tento jednoduchý kód úspěšně používám už dlouho, ale nevím zda interní timer je schopen vzbudit. Dej mi echo jak to dopadlo prosím na cacany@iclona.cz .
    Děkuji

    Serial.println(„Jdu haji!“); //BACHA ty uvozovky se blbě zobrazí
    delay(100);
    set_sleep_mode(SLEEP_MODE_PWR_DOWN);
    sleep_enable();
    sleep_mode(); //tady se uspí, spotřeba 5,2 mA pořád moc na baterii
    // tady se vzbudí, ale mám otestováno pouze externí přerušení
    sleep_disable(); // spotřeba 14 mA

    #11088
    michal09
    Účastník

    Interní timer by dokázal arduino vzbudit, ale bohužel není přesný a je mopžné ho nastavit jen na max. 8s což je v mém případě hrozně málo. Z toho důvodu jsem chtěl použít DS3231 jako interrup impuls. Problém jsem nakonec dokázal odstranit díky foru na arduino.cc. Při napájení z baterie 3,7V se ve sleep modu dostanu na ca 4mA po odstranění indikační diody na RTC. Nyní ještě odstraním diodu na desce arduina nano a snad to snížím ještě dolů. Každopádně lze arduino uspat tak, že má odběr jen pár micro ampéry, když procesor pracuje na 8 nebo 16 Mhz.

    #16871
    Borec59b6
    Účastník

    Arduino nano dokáže mít mnohem menší spotřenu cca 5uA. koukněte se na článek Arduino nano 5uA

    #18145
    4Coptera
    Účastník

    ten web byl přesunut – Arduino nano 5uA – new

    Jsem autor zdrojového webu – freehosting je problematický
    proto radši obsah článku vložím i sem.

    Navrhoval jsem aplikaci napájenou z 1xlion. Aby jsem co nejvíce šetřil lion hledal jsem cestu jak co nejvíce zmenšit odběr v neaktivní době – v době spánku. Použil jsem knihovnu Low Power od rocketscreamu.
    Spotřeba klesla z řádu mA na stovky uA. Dalšímu snížení bránil čip CH340. Abych ještě více snížil spánkový proud a přesto zachoval možnost měnit software pomocí CH340, začal jsem s pokusy. Zvolil jsem arduino s částečně zničenými pájecími ploškami – synovo pokusy : ( Nejprve jsem odpájel plusové napájení čipu CH340, ale výsledek se nedostavil – čip byl zřejmě napájen i z jiných nožiček. Tak jsem pokus opakoval s odpojením země (groundu) CH340. Tady se výsledky dostavily – odběr Arduina Nano poklesl pod měřící schopnost mého multimetru.

    A teď jak na to

    1. odstranění Power Led
    2. odstranění linearního regulatoru 1117
    3. odpojit pin 1 (ground) CH340
    4. připojit pin 1 CH340 na switch – pin 1 CH340 a ground
    5. Zapnout power down – library Low Power by rocketscream

    – switch mezi pin 1 CH340 a groundem rozepnut – odběrový proud 5-6uA – není možno použít USB

    – switch mezi pin 1 CH340 a groundem sepnut – proud vzroste – ale je možno používat USB na nanu

    Attachments:
Aktuálně je na stránce zobrazeno 9 příspěvků - 1. až 9. (celkem z 9)
  • Pro reakci na toto téma se musíte přihlásit.