Welchen Sketch hast du denn aktuell geflasht und um welchen Reed-Switch handelt es sich? (am besten einen Link posten)
Stromverbrauch von Reed-Switch Varianten
-
Heliox -
7. September 2015 um 20:47 -
Erledigt
-
-
Stromverbrauch von Reed-Switch Varianten? Schau mal ob du hier fündig wirst!
-
Den Sketch für die Sender den ich für die Tests verwendet habe, habe ich leider nicht mehr. Die ursprünglichen habe ich bereits schon so ausgebaut, dass diese hier nur Verwirrung stiften würden, u.A. schon mit PIR, LED usw.. Im Prinzip kannst du aber einfach von dem Sketch von Nathan ausgehen bzw. von deinem eigenen (Reed Switch, Watchdog mit JeeLib). Natürlich prüfte ich nicht auf LOW, sondern auf HIGH um ein Öffnen festzustellen.
Achja Reed-Switches sind diese hier: http://www.ebay.de/itm/-/291131811290?roken=cUgayN
-
Naja um deine Frage aus dem 1.Beitrag überhaupt beantworten zu können ist der verwendete Sketch entscheidend , aber auch all das was angeschlossen ist (und auch wie).
Wenn du aber nicht mals mehr den genauen Sketch hast kann man deine Frage auch nicht wirklich beantworten... Wie auch? Glaskugeln sind ein Mythos.
Evtl. dieser oder jener Sketch - das ist zu ungenau und würde nur weiteres Raten zur Folge haben. -
Also die Frage aus dem ersten Beitrag war doch wieso mehr bzw. überhaupt Strom fließt wenn der Schalter bei der gegebenen Konfiguration (interner Pullup, NO Schalter) geschlossen, also mit GND verbunden ist als wenn er offen ist.
Die Antwort darauf hat aber eigentlich schon Neueinsteiger in Beitrag #3 gegeben. :s
Damit man sich das aber besser vorstellen kann hab ich die 3 Varianten mal aufgezeichnet.
Variante 1 müsste genau der Konfiguration von Heliox entsprechen.http://i.imgur.com/vw3uLGj.png (Ist auch unten anghängt)
Ob der Pullup/Pulldown jetzt intern oder extern liegt ist vom Prinzip her ja völlig egal. Der interne hat halt einen bestimmten Wert, den externen kann man selber bestimmen. Auch ob die Schalter NO oder NC sind ist egal.
Wieso wird in meinem Fall mehr verbraucht wenn die Dinger geschlossen sind als wenn sie geöffnet sind? Wenn ich Reed-Switches die "normally closed" sind verwende, ist doch der Pin permanent im geschlossenen Zustand HIGH, müsste da nicht mehr verbraucht werden?
Wieso soll wenn ein HIGH an einem Eingang anliegt mehr Strom fließen als wenn ein LOW dort anliegt? Der tiny wird ja nicht über den Eingang mit Strom versorgt. Den Strom braucht da nur der Pullup/Pulldown selber.--
EDIT: Heliox sry, wie konnt ich nur. Hab dich doch glatt mit diesem griechischen Sonnengott verwechselt -
Ich sah mich fast dazu veranlasst bei diversen Onlinehändlern extra für dich nach Glaskugeln zu suchen...
Aber mal Spaß bei Seite. Den ursprünglichen Sketch hab ich nunmal nicht mehr, ist halt so. Die anderen Sketches brauch ich nicht posten, denn die tun hier nichts zur Sache und würden die Ausgangssituation verfälschen, demnach unbrauchbar. Ich hab mir mal jetzt auf die Schnelle den Reed-Sketch von Nathan gekrallt und es mal soweit umgestellt, dass ich damit wieder einigermaßen die Situation wie für die Tests habe.
C
Alles anzeigen//---------------------------------------------------------------------------------------------------------------------- // TinyTX - An ATtiny84 and RFM12B Wireless Sensor Node // By Nathan Chantrell. For hardware design see http://nathan.chantrell.net/tinytx // // Detect a normally closed reed switch opening and closing with pin change interrupt to wake from sleep. // // Licenced under the Creative Commons Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) licence: // http://creativecommons.org/licenses/by-sa/3.0/ // // Requires Arduino IDE with arduino-tiny core: http://code.google.com/p/arduino-tiny/ //---------------------------------------------------------------------------------------------------------------------- #include <JeeLib.h> // https://github.com/jcw/jeelib #include <PinChangeInterrupt.h> // http://code.google.com/p/arduino-tiny/downloads/list #include <avr/sleep.h> #define myNodeID 2 // RF12 node ID in the range 1-30 #define network 210 // RF12 Network group #define freq RF12_433MHZ // Frequency of RFM12B module #define USE_ACK // Enable ACKs, comment out to disable #define RETRY_PERIOD 5 // How soon to retry (in seconds) if ACK didn't come in #define RETRY_LIMIT 5 // Maximum number of times to retry #define ACK_TIME 10 // Number of milliseconds to wait for an ack #define WD_LIMIT 8 // 8*8 = 64 Sekunden #define SW_PIN_1 10 #define SW_PIN_2 9 const uint8_t ENCRYPT_KEY[] = "1234567890123456"; uint8_t alarm = 0; uint8_t watchdog_counter = 0; ISR(WDT_vect) { watchdog_counter++; } void wakeUp() { alarm = 1; } //######################################################################################################################## //Data Structure to be sent //######################################################################################################################## typedef struct { int supplyV; int switchState; } Payload; Payload tinytx; //######################################################################################################################## void setup() { rf12_initialize(myNodeID,freq,network); // Initialize RFM12 with settings defined above rf12_encrypt(ENCRYPT_KEY); rf12_sleep(0); // Put the RFM12 to sleep pinMode(SW_PIN_1, INPUT); //set the pin to input digitalWrite(SW_PIN_1, HIGH); //use the internal pullup resistor attachPcInterrupt(SW_PIN_1,wakeUp,CHANGE); // attach a PinChange Interrupt on the falling edge pinMode(SW_PIN_2, INPUT); //set the pin to input digitalWrite(SW_PIN_2, HIGH); //use the internal pullup resistor attachPcInterrupt(SW_PIN_2,wakeUp,CHANGE); // attach a PinChange Interrupt on the falling edge PRR = bit(PRTIM1); // only keep timer 0 going ADCSRA &= ~ bit(ADEN); bitSet(PRR, PRADC); // Disable the ADC to save power MCUSR &= ~(1<<WDRF); WDTCSR |= (1<<WDCE) | (1<<WDE); WDTCSR = 0x21; //8 Sekunden WDTCSR |= _BV(WDIE); watchdog_counter = WD_LIMIT; } void EnableSleep() { set_sleep_mode(SLEEP_MODE_PWR_DOWN); sleep_enable(); sleep_mode(); sleep_disable(); } void loop() { if(alarm || watchdog_counter >= WD_LIMIT) { if (digitalRead(SW_PIN_1) == HIGH || digitalRead(SW_PIN_2) == HIGH) { tinytx.switchState = 1; } else { tinytx.switchState = 0; } tinytx.supplyV = readVcc(); // Get supply voltage rfwrite(); // Send data via RF watchdog_counter = 0; alarm = 0; } EnableSleep(); } //-------------------------------------------------------------------------------------------------- // Send payload data via RF //------------------------------------------------------------------------------------------------- static void rfwrite(){ #ifdef USE_ACK for (byte i = 0; i <= RETRY_LIMIT; ++i) { // tx and wait for ack up to RETRY_LIMIT times rf12_sleep(-1); // Wake up RF module while (!rf12_canSend()) rf12_recvDone(); rf12_sendStart(RF12_HDR_ACK, &tinytx, sizeof tinytx); rf12_sendWait(2); // Wait for RF to finish sending while in standby mode byte acked = waitForAck(); // Wait for ACK rf12_sleep(0); // Put RF module to sleep if (acked) { return; } // Return if ACK received Sleepy::loseSomeTime(RETRY_PERIOD * 1000); // If no ack received wait and try again } #else rf12_sleep(-1); // Wake up RF module while (!rf12_canSend()) rf12_recvDone(); rf12_sendStart(0, &tinytx, sizeof tinytx); rf12_sendWait(2); // Wait for RF to finish sending while in standby mode rf12_sleep(0); // Put RF module to sleep return; #endif } // Wait a few milliseconds for proper ACK #ifdef USE_ACK static byte waitForAck() { MilliTimer ackTimer; while (!ackTimer.poll(ACK_TIME)) { if (rf12_recvDone() && rf12_crc == 0 && rf12_hdr == (RF12_HDR_DST | RF12_HDR_CTL | myNodeID)) return 1; } return 0; } #endif //-------------------------------------------------------------------------------------------------- // Read current supply voltage //-------------------------------------------------------------------------------------------------- long readVcc() { bitClear(PRR, PRADC); ADCSRA |= bit(ADEN); // Enable the ADC long result; // Read 1.1V reference against Vcc ADMUX = _BV(MUX5) | _BV(MUX0); // For ATtiny84 delay(2); // Wait for Vref to settle ADCSRA |= _BV(ADSC); // Convert while (bit_is_set(ADCSRA,ADSC)); result = ADCL; result |= ADCH<<8; result = 1126400L / result; // Back-calculate Vcc in mV ADCSRA &= ~ bit(ADEN); bitSet(PRR, PRADC); // Disable the ADC to save power return result; }
Und nochmal zum allgemeinen Verständnis:
Zitat
Also ich will mich ja nicht einmischen, aber was Du da veranstaltest ist echt lustig. Du schreibst das Dir 0,1mA zuviel Stromverbrauch sind. Da frage ich mich, wo Du Deine Grundlagen her hast. Mit solchen geringen Stromstärken würdest du dermaßen viele Unsicherheiten einbauen, dass ist für eine Alarmanlage überhaupt nicht sinnvol. Zudem gibt es auch eine bestimmte Mindeststromstärke, bei denen die Schaltungen mit den GPIOs arbeiten. Und es ist völlig egal und technisch auch unsinnig (für die Sicherheit kann das an verschiedenen Stellen sinnvol sein) 2 Reedkontakte einzubauen. Kontakte "verbrauchen" keinen Strom. Der Strom fließt nur, weil Du da irgendwas angeschlossen hast. Mit was für einem Messgerät misst Du solche Stromstärken überhaupt?
Wenn der Stromverbrauch des ATTiny84 im Sleep-Modus angeblich im einstelligen uA-Bereich liegen soll, dann sind 100uA oder 200uA sehr wohl zu viel! Was meinst du wieso sich jeder die Mühe macht und z.B. den ADC abschaltet? Um weiteren Missverständnissen vorzubeugen, hier gehts um das TinyTX3-Sender-Board.Zur Bestückung der Boards: die NO-Switches hab ich an Pin10->GND und Pin9->GND angeschlossen. Dann verwende ich 3xAAA-Batteriehalter. Zwischen Batterie und Board hab ich das Messgerät reingehängt. Sind die Reed-Switches geschlossen, messe ich 0,2mA. Öffne ich die Reed-Switches messe ich 0,0mA. Wieso das so ist, weiß ich ja jetzt, siehe Seite zuvor. Mit NC-Switches will ich nicht arbeiten, siehe Begründung weiter oben.
Ich habe auch mal versucht die Reed-Switches in Reihe zu schalten, gemessener Strom 0,1mA.
Im Moment mache ich mir halt nur Gedanken darüber, ob es eine Möglichkeit gibt, diesen Verbrauch weiter zu senken.
EDIT: Joh
Danke für deine Mühen, aber das mit den Pull-Up usw. weiß ich ja, siehe Beiträge zuvor. -
Jetzt mitmachen!
Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!