Arduinobol onallo NYAKra

Nyákkészítés fortélyai a tervezéstől a maratott panelig....
Avatar
Robert
Elektronbűvölő
Hozzászólások: 9908
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

Re: Arduinobol onallo NYAKra

HozzászólásSzerző: Robert » 2016. december 13. kedd, 13:41

Szóval tápkérdés?

- napelemes udvari lámpa és abban berakva a holmi? Sleep/ watchdog v. timer kombinációval?
- Envelop / ReadyGo akku használat
- sallangokat kidobni! Ideértve a LED, felesleges ellenállásosztós fotoellenállást (lábról kapcsold be, amikor mérsz/érzékelsz. De ha kell tegyél be PINdiódát. Önmaga ad feszültséget megvilágírásra. De ha van napelem, akkor az is méri a megvilágítást :). A felhúzóellenállások, kimeneti lábak lekapcsolása. A nRF is fogyaszt, azt is tedd sleep-be. Feléledés után init legyen. Az a biztos....


A 8 MHz ProMini drága? Készen van, 3.3V rendszer. Felesleges az 5V, mert csak fűt és nem teljesítménycentrikus a feladatod. Bár érthető lenne, ha >10.000 szériáról beszélnénk:)....
http://www.tavir.hu - a gazda :)

szempo
Újonc
Újonc
Hozzászólások: 14
Csatlakozott: 2016. március 31. csütörtök, 11:14

Re: Arduinobol onallo NYAKra

HozzászólásSzerző: szempo » 2016. december 13. kedd, 14:00

kapu48 köszönöm a hozzásózólást 15 percenként mérek már időközben én is kisodortam ezt :)

csabeszq igen igen addig a lowpower.h library -ttaláltma amivel kísérleteztem.

Ezen az oldalon https://openhomeautomation.net/arduino-battery/ nyomultam és ez alapján raktam össze egy bareduinot de nekem nem hozta azikat az értékeket mint amit ő ott mért.Nagy drága mérőműszerem sincs szóval alég sokszor futok -1-re mérésko. És bocsánat de a felét nem értem amit írtál "MCU" és társai.

Robert
Neked is köszönöm a választ napelemet is szereztem és hozzá töltő áramkört ebay:ről...
A jelzett akkukat megnézem nem ismerem őket.
A sallangos bekezdésből sajnos a ledet értem.
- hogyan lehet a lábról bekapcsolni és ki? mert ez kellene nekem ne fogyasszon semmi ha nincs használva.

arduino pro miniből akartam venni 3.3v 8mhz de amit kaptam azon minden fel van sorolva 3.3v,5v 16mhz,8mhz ebay-es klón lap.

Avatar
csabeszq
Bitfaragó
Hozzászólások: 670
Csatlakozott: 2012. szeptember 5. szerda, 6:00

Re: Arduinobol onallo NYAKra

HozzászólásSzerző: csabeszq » 2016. december 13. kedd, 15:02

Próbáld ki, hogy visszaveszed a frekvenciát. A 8 MHz sok lehet.

Kód: Egész kijelölése

CLKPR=0x80;
CLKPR=8; // ez 256-os osztásnak felel meg (2^8), 31.25 kHz-n fogsz ketyegni


Az Atmega328P sebességét dinamikusan lehet változtatni (lásd fenn). A CLKPR=0x80 jelzi, hogy frekvenciát állítasz, utána 4 órajelcikluson belül be kell írni a frekvencia osztást (CLKPR=8).

Érdemes megnézni, hogy csökken-e a fogyasztás 3.3V-on alacsony frekvenciával. Amikor persze kell kakaó, akkor ugyanezzel a módszerrel felpörgetheted.

Emellett van sleep módja is a chipnek, amikor épp nem csinálsz semmit.

Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3231
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

Re: Arduinobol onallo NYAKra

HozzászólásSzerző: kapu48 » 2016. december 13. kedd, 16:06


vargham
Pákabűvész
Hozzászólások: 239
Csatlakozott: 2014. január 8. szerda, 8:32
Kapcsolat:

Re: Arduinobol onallo NYAKra

HozzászólásSzerző: vargham » 2016. december 13. kedd, 17:19

Készítettem egy kapcsolást, amivel az MCU le tudja kapcsolni a tápot még a DC-DC előtt, tehát kikapcsolt állapotban közel 0 a fogyasztása.
5V:
https://circuits.io/circuits/3352039-soft-power-v3-with-5v-logic
3,3V:
https://circuits.io/circuits/3499588-soft-power-v3-with-3v3-logic

Ezt a kapcsolást vettem alapul hozzá:
http://www.directdirt.com/2014/09/simple-soft-latching-power-switch/

Egy hordozható ATmega programmerben használjuk, ami ISP-n felismeri a célt, feltölti rá a hex-et, és kikapcsol. Követelmény volt, hogy 0 legyen az áramfelvétele kikapcsolt állapotban, az MCU el tudja venni a tápot, és az is, hogy bekapcsolt állapotban detektálni tudja a gomb újbóli lenyomását. A megépített áramkörben DC-DC konvertert használok, de az nem volt a szimulátorban, azért van helyette 7805.

Fontos, hogy minden fogyasztó csak a kapcsolt részről kapjon tápot, legyen az szenzor, vagy akár csak egy feszültségosztó.

Ha raksz mellé egy ilyet:
http://www.ti.com/lit/ds/symlink/tpl5010.pdf
Akkor beprogramozhatod, hogy néha (100ms és 2 óra között) húzza meg a tápot. Az MCU bekapcsol, mér, elmenti a mérést, majd lekapcsolja a tápot.
A TPL5010 fogyasztása 35 nA, ezt nem tudod megúszni.

szempo
Újonc
Újonc
Hozzászólások: 14
Csatlakozott: 2016. március 31. csütörtök, 11:14

Re: Arduinobol onallo NYAKra

HozzászólásSzerző: szempo » 2016. december 14. szerda, 10:06

csabeszq: ez tetszik mondhatni egyszerűbb számomra mint a lentebbi "dolgok"

kapu48: köszönöm e elég sokáig nézem a képet de sajnos nem minden világos rajta, még egy kicsit googlezok hátha megértem.

vargham: ez valamivel beszédesebb számomra csak azt nem értem hovakellen illesztenem az atmeg chipet. Ja és köszönöm, hogy szántálrá időt.
Ha jól értem az atmega le tudja kapcsolni/ és fel high/low a dolgokat ami rá van kötve.

vargham
Pákabűvész
Hozzászólások: 239
Csatlakozott: 2014. január 8. szerda, 8:32
Kapcsolat:

Re: Arduinobol onallo NYAKra

HozzászólásSzerző: vargham » 2016. december 14. szerda, 14:52

Az OFF (MCU) jelű gombra nincsen szükséged. Az MCU OFF nevű multiméter pozitív (piros) bemenetének helyére kell raknod az Arduino egyik lábát (output), és magasban tartanod, amíg bekapcsolva kell maradnia. Lehúzod földre, amikor ki akarod kapcsolni.

Az ON / ACTION jelű gomb helyett kell bekötnöd a watchdog / timer IC-t. A tőle jobbra lévő komponensekre (NPN, dióda, stb) nem is lesz szükséged.

A kapcsolásban lévő ellenállások 9Volt/5Volt, illetve 9Volt/3,3Volt kombinációra lettek méretezve. Ha más feszültségszinteket használsz, akkor utána kell igazítani.

szempo
Újonc
Újonc
Hozzászólások: 14
Csatlakozott: 2016. március 31. csütörtök, 11:14

Re: Arduinobol onallo NYAKra

HozzászólásSzerző: szempo » 2016. december 15. csütörtök, 7:17

Köszönöm!

Nem mondanám, hogy mindent értek de a szimulátor nagyon sokat segít az átlátásban! Köszönöm még egyszer. Nem kizárt, hogy zaklatlak még párszor.

vargham
Pákabűvész
Hozzászólások: 239
Csatlakozott: 2014. január 8. szerda, 8:32
Kapcsolat:

Re: Arduinobol onallo NYAKra

HozzászólásSzerző: vargham » 2016. december 15. csütörtök, 9:01

Nem mondanám, hogy mindent értek de a szimulátor nagyon sokat segít az átlátásban!

Hasonlóan vagyok ezzel én is.

Fontos megjegyzések:
POWER_PIN: Az MCU OFF nevű multiméter pozitív (piros) bemenetének helyére.
BUTTON_PIN: Ha szükséges, itt lehet detektálni a power gomb ismételt megnyomását (active HIGH). Az MCU button nevű multiméter helyére kell bekötni.

Kód: Egész kijelölése

#define POWER_PIN 7
#define BUTTON_PIN 8
#define AUTO_POWER_OFF_TIMEOUT 5000

unsigned long lastActionTimestamp = 0;

void powerOff()
{
   while(1) digitalWrite(POWER_PIN, LOW);
}

void checkAutoPowerOff()
{
   if (lastActionTimestamp + AUTO_POWER_OFF_TIMEOUT < millis()) powerOff();
}

void checkButton()
{
   if (digitalRead(BUTTON_PIN)) lastActionTimestamp = millis();
}

void setup()
{
   //Ha ez a rész kimarad, akkor az MCU nem tudja magát lekapcsolni, újraindul.
   
   //POWER_PIN kimenet, ez egyértelmű
   pinMode(POWER_PIN, OUTPUT);
   
   //Az MCU megpróbálja elvenni a tápot saját maga alól.
   //Ha nincs lenyomva az ON gomb, akkor sikerül.
   //Ha le van nyomva az ON gomb, akkor nem sikerül, mert a gomb erősebb. (Lásd dióda + fel/le ellenállások értékei.)
   digitalWrite(POWER_PIN, LOW);
   
   //75ms várakozás.
   delay(75);
   
   //Erre a pontra csak akkor jut el, ha a gomb még mindig nyomva.
   digitalWrite(POWER_PIN, HIGH);
   
   //Debounce. Ne detektáljon gombnyomást közvetlenül bekapcsolás után.
   delay(300);
   
   //Fontos, hogy NEM szabad se fel se lehúzó ellenállást használni. Azokat a kapcsolás már tartalmazza.
   pinMode(BUTTON_PIN, INPUT);
}

void loop()
{
   checkButton();
   checkAutoPowerOff();
}

szempo
Újonc
Újonc
Hozzászólások: 14
Csatlakozott: 2016. március 31. csütörtök, 11:14

Re: Arduinobol onallo NYAKra

HozzászólásSzerző: szempo » 2016. december 19. hétfő, 12:54

Sziasztok!

Ezen oldalon leírtak alapján felpatkoltam egy 1Mhz -es bbootloadert a próbapanelon összerakott atmega-ra. Melléraktam egy htu21d -szenzort. Kicsit lassabban meg föl rá a sketch ahogyan a leírásban is jelzik de cserébe a fogyasztás minden mod nélkül is 0,3 mah.

Arra lennék még kíváncsi, hogy ha ezt az egészet kint szeretném használni tudtok -e ajánlani valami dobozt ami esetleg vízhatlan.. vagy az már másik topik?

Köszönöm előre is.

szempo
Újonc
Újonc
Hozzászólások: 14
Csatlakozott: 2016. március 31. csütörtök, 11:14

Re: Arduinobol onallo NYAKra

HozzászólásSzerző: szempo » 2016. december 21. szerda, 10:32

Sziasztok!

A tesztelés során újabb problémába ütköztem és ez gondolom összefügg vargham fentebb leírtakkal. A sensor node működik aksiról szépen. De random naponta fél naponta nem küld jelet eddig leszedtem az akkut mert lemerült (kínai gagyi) és mivel van néhány raktam a másikat.
De tegnap elfogyott... felraktam töltőre és kb 17 perc alatt feltöltött. na ekkor kezdtem gyanakodni és arra jutottam, hogy nem az akku merül le hanem a node maga az atmega áll le vagy hasonló. reset után ismét működik.

Hogyan lehetne esetleg kikényszeríteni 12 óránként a resetet. Kell hozzá valami egyéb külső alkatrész vagy tud ilyet magától. Nézegettem a watchdog timert de nem igazán értem a működését. Törpöltem még a reset láb valahogyan történő felhúzásában gombnyomást szimulálva de az sem igazán akar sikerülni.

A lentebbi sketc használatával olvasgatom a szenzort és ebben szeretném megoldani az időzített resetet.

Válaszokat ötleteket előre is köszönöm!


Kód: Egész kijelölése

#include <SPI.h>                                                                                                                                                           
#include <MySensor.h>                                                                                                                                                       
#include <Wire.h>                                                                                                                                                           
#include <HTU21D.h>                                                                                                                                                         

#define CHILD_ID_HUM 0                                                                                                                                                     
#define CHILD_ID_TEMP 1                                                                                                                                                     
unsigned long SLEEP_TIME = 60000; // Sleep time between reads (in milliseconds)                                                                                             
                                                                                                                                                                       
MySensor gw;                                                                                                                                                               
                                                                                                                                                                       
//Create an instance of the object                                                                                                                                         
HTU21D myHumidity;                                                                                                                                                         
                                                                                                                                                                       
boolean metric = true;                                                                                                                                                     
MyMessage msgHum(CHILD_ID_HUM, V_HUM);                                                                                                                                     
MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP);                                                                                                                                   
                                                                                                                                                                       
void setup()                                                                                                                                                               
{                                                                                                                                                                           
  gw.begin();                                                                                                                                                               
                                                                                                                                                                       
  // Send the Sketch Version Information to the Gateway                                                                                                                     
  gw.sendSketchInfo("Humidity", "1.0");                                                                                                                                     
                                                                                                                                                                       
  // Register all sensors to gw (they will be created as child devices)                                                                                                     
  gw.present(CHILD_ID_HUM, S_HUM);                                                                                                                                         
  gw.present(CHILD_ID_TEMP, S_TEMP);                                                                                                                                       

  metric = gw.getConfig().isMetric;                                                                                                                                         
  myHumidity.begin();                                                                                                                                                       
}                                                                                                                                                                           
void loop()                                                                                                                                                                 
{                                                                                                                                                                           
  float temperature = myHumidity.readTemperature();                                                                                                                         
  if (!metric) {                                                                                                                                                           
      temperature = (temperature * 1.8) + 32.0;                                                                                                                             
  }                                                                                                                                                                         
  gw.send(msgTemp.set(temperature, 1));                                                                                                                                     

  float humidity = myHumidity.readHumidity();                                                                                                                               
  gw.send(msgHum.set(humidity, 1));                                                                                                                                         
                                                                                                                                                                       
  gw.sleep(SLEEP_TIME); //sleep a bit                                                                                                                                       
}

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9908
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

Re: Arduinobol onallo NYAKra

HozzászólásSzerző: Robert » 2016. december 21. szerda, 11:11

Olvasgatom a változásokat... De:
Az Arduino 1 MHz belső órajel esetén:
- minden kommunikáció széthullik, mivel a belső órajel pontatlan és emellett hőfokfüggése is van...
http://www.tavir.hu - a gazda :)

szempo
Újonc
Újonc
Hozzászólások: 14
Csatlakozott: 2016. március 31. csütörtök, 11:14

Re: Arduinobol onallo NYAKra

HozzászólásSzerző: szempo » 2016. december 21. szerda, 11:23

Áhh igen ezt elfelejtettem leírni. Visszatettem a 8 MHz eset. Pont amit amit leírtál. És raktam bele külső 8MHz Quartz -ot

Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3231
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

Re: Arduinobol onallo NYAKra

HozzászólásSzerző: kapu48 » 2016. december 21. szerda, 11:57

Próbáld meg a loop előtt definiálni a változókat:

Kód: Egész kijelölése

// Homero.ino

#include <SPI.h>                                                                                                                                                           
#include <MySensor.h>                                                                                                                                                       
#include <Wire.h>                                                                                                                                                           
#include <HTU21D.h>                                                                                                                                                         

#define CHILD_ID_HUM 0                                                                                                                                                     
#define CHILD_ID_TEMP 1                                                                                                                                                     
unsigned long SLEEP_TIME = 60000; // Sleep time between reads (in milliseconds)                                                                                             
                                                                                                                                                                       
MySensor gw;                                                                                                                                                               
                                                                                                                                                                       
//Create an instance of the object                                                                                                                                         
HTU21D myHumidity;                                                                                                                                                         
                                                                                                                                                                       
boolean metric = true;                                                                                                                                                     
MyMessage msgHum(CHILD_ID_HUM, V_HUM);                                                                                                                                     
MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP); 
                                                                                                                                 
float temperature;
float humidity;
                                                                                                                                                                       
void setup()                                                                                                                                                               
{                                                                                                                                                                           
  gw.begin();                                                                                                                                                               
                                                                                                                                                                       
  // Send the Sketch Version Information to the Gateway                                                                                                                     
  gw.sendSketchInfo("Humidity", "1.0");                                                                                                                                     
                                                                                                                                                                       
  // Register all sensors to gw (they will be created as child devices)                                                                                                     
  gw.present(CHILD_ID_HUM, S_HUM);                                                                                                                                         
  gw.present(CHILD_ID_TEMP, S_TEMP);                                                                                                                                       

  metric = gw.getConfig().isMetric;                                                                                                                                         
  myHumidity.begin();                                                                                                                                                       
}                                                                                                                                                                           
void loop()                                                                                                                                                                 
{                                                                                                                                                                           
  temperature = myHumidity.readTemperature();                                                                                                                         
  if (!metric) {                                                                                                                                                           
      temperature = (temperature * 1.8) + 32.0;                                                                                                                             
  }                                                                                                                                                                         
  gw.send(msgTemp.set(temperature, 1));                                                                                                                                     

  humidity = myHumidity.readHumidity();                                                                                                                               
  gw.send(msgHum.set(humidity, 1));                                                                                                                                         
                                                                                                                                                                       
  gw.sleep(SLEEP_TIME); //sleep a bit                                                                                                                                       
}



Hátha csak memória foglalási probléma van! Ennek kezelésében valami bug lehet az IDE-ben.
És tegyél a loop végére valamennyi várakozást, az ilyen sűrű méréstől felmelegedhet a hőmérőd.

szempo
Újonc
Újonc
Hozzászólások: 14
Csatlakozott: 2016. március 31. csütörtök, 11:14

Re: Arduinobol onallo NYAKra

HozzászólásSzerző: szempo » 2016. december 21. szerda, 12:12

Köszönöm a választ kipróbálom.

Percenként mér annak nem kellene sűrűnek lennie.


Vissza: “Nyákkészítés”

Ki van itt

Jelenlévő fórumozók: nincs regisztrált felhasználó valamint 1 vendég