uspání arduina nano
Úvodní stránka › Fórum › Vaše projekty › Arduino › uspání arduina nano
Označeno štítky: a
- 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 11 měsíci.
-
AutorPříspěvky
-
5.4.2017 v 21:57 #11022michal09Úč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);
}7.4.2017 v 21:14 #11059posjirkaÚčastníkkdyž 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 ..7.4.2017 v 21:53 #11061michal09ÚčastníkVý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:26Trochu 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);
}7.4.2017 v 22:17 #11062posjirkaÚčastníkzkušenosti s tím nemale ale našel jsem ještě toto:
http://www.zive.cz/clanky/pojdme-programovat-elektroniku-rtc-hodiny-aneb-kdyz-arduino-vi-kolik-je-opravdu-hodin/sc-3-a-184666/default.aspx7.4.2017 v 22:55 #11063michal09ÚčastníkDíky, to je více méně. Zkusím pokud se mi podaří stáhnout ty knihovny, jelikož DS knihovnu používám jinou.
10.4.2017 v 12:48 #11085caciÚčastníkTento 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ěkujiSerial.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 mA10.4.2017 v 17:11 #11088michal09ÚčastníkInterní 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.
23.3.2020 v 15:35 #16871Borec59b6ÚčastníkArduino nano dokáže mít mnohem menší spotřenu cca 5uA. koukněte se na článek Arduino nano 5uA
15.11.2020 v 13:44 #181454CopteraÚčastníkten 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:
-
AutorPříspěvky
- Pro reakci na toto téma se musíte přihlásit.