Attiny85 met 433mhz zender en DS18B20 tempsensor
14 berichten
• Pagina 2 van 2 • 1, 2
Re: Attiny85 met 433mhz zender en DS18B20 tempsensor
Mijn draadloze temperatuur sensor werkt inmiddels. Ik heb een prototype gemaakt op basis van een Attiny85 met DS18B20 sensor en 433MHZ zender.
De sensor komt boven in een heteluchtballon waardoor er nogal wat bijzonder eisen bij kwamen kijken.
Het "kastje" wordt met klittenband aan de buitenzijde van de ballon vastgemaakt. Het kabeltje van de sensor van ca 20 cm wordt door een gaatje in de ballon naar binnen geleid en daar met ook klittenband tegen de ballon "geplakt".
Op deze manier voorkom ik dat de temperatuur in het "kastje" te hoog wordt. In de ballon kan het 125 graden worden.
Ik heb vooral veel moeite gedaan om het energiegebruik te minimaliseren. Daarvoor heb ik de volgende zaken opgepakt:
"Normaal" slaapt het systeem en verbruikt dan enkele tienden van een microAmp
Een "nattevinger" touch schakelaar geeft een PINchange waarna het systeem gedurende 2 uur werkt. Dat is zo'n beetje de langste vaart met een ballon.
Als het systeem is gestart flitst er een ledje tijdens het zenden. Boven een temperatuur van 40 graden gaat het ledje weer uit.
De zender krijgt alleen voeding tijdens het zenden, het verbruik is dan ca 8 mA. Ik zend om de ca 2 seconden.
Tussen het zenden slaapt het systeem mbv de Narcoleptic library. het verbruik is dan ca 0,2 mA
Tijdens de slaapperiode staan de poorten op input.
Omdat tijdens de slaapperiode mbv Narcoleptic ook de timer is uitgezet heb ik "teller" gemaakt om een periode van ca 2 uur te meten.
Om het zenden met zo'n goedkoop 433MHz zendertje te optimaliseren gebruik ik de Manchester library.
Mijn doel was het geheel te voeden met een CR2032 knoopcel. Met het beperkte energiegebruik moest dat wel lukken.
De zeer goedkope knoopcellen die ik gebruikte, hadden echter een behoorlijke interne weerstand. Daardoor kelderde de voedingsspanning tijdens de meet/zendsessies. De DS18B20 sensor kan daar niet goed tegen waardoor foute werden doorgegeven bij hogere temperaturen. Om die reden ben ik overgestapt op 2 aaa batterijtjes.
In de mand onder ballon wordt de temperatuur ontvangen op een "vlucht" computer. Dat is een MIO spirit 470 waarop een vliegapplicatie LK8000 draait. In de MIO zit ook een Arduino mini pro met ontvanger die de temperatuur doorgeeft aan de LK8000 applicatie.
Hieronder de code waarmee ik binnenkort een proefvaart hoop te maken.
Commentaar welkom
Groet
René
De sensor komt boven in een heteluchtballon waardoor er nogal wat bijzonder eisen bij kwamen kijken.
Het "kastje" wordt met klittenband aan de buitenzijde van de ballon vastgemaakt. Het kabeltje van de sensor van ca 20 cm wordt door een gaatje in de ballon naar binnen geleid en daar met ook klittenband tegen de ballon "geplakt".
Op deze manier voorkom ik dat de temperatuur in het "kastje" te hoog wordt. In de ballon kan het 125 graden worden.
Ik heb vooral veel moeite gedaan om het energiegebruik te minimaliseren. Daarvoor heb ik de volgende zaken opgepakt:
"Normaal" slaapt het systeem en verbruikt dan enkele tienden van een microAmp
Een "nattevinger" touch schakelaar geeft een PINchange waarna het systeem gedurende 2 uur werkt. Dat is zo'n beetje de langste vaart met een ballon.
Als het systeem is gestart flitst er een ledje tijdens het zenden. Boven een temperatuur van 40 graden gaat het ledje weer uit.
De zender krijgt alleen voeding tijdens het zenden, het verbruik is dan ca 8 mA. Ik zend om de ca 2 seconden.
Tussen het zenden slaapt het systeem mbv de Narcoleptic library. het verbruik is dan ca 0,2 mA
Tijdens de slaapperiode staan de poorten op input.
Omdat tijdens de slaapperiode mbv Narcoleptic ook de timer is uitgezet heb ik "teller" gemaakt om een periode van ca 2 uur te meten.
Om het zenden met zo'n goedkoop 433MHz zendertje te optimaliseren gebruik ik de Manchester library.
Mijn doel was het geheel te voeden met een CR2032 knoopcel. Met het beperkte energiegebruik moest dat wel lukken.
De zeer goedkope knoopcellen die ik gebruikte, hadden echter een behoorlijke interne weerstand. Daardoor kelderde de voedingsspanning tijdens de meet/zendsessies. De DS18B20 sensor kan daar niet goed tegen waardoor foute werden doorgegeven bij hogere temperaturen. Om die reden ben ik overgestapt op 2 aaa batterijtjes.
In de mand onder ballon wordt de temperatuur ontvangen op een "vlucht" computer. Dat is een MIO spirit 470 waarop een vliegapplicatie LK8000 draait. In de MIO zit ook een Arduino mini pro met ontvanger die de temperatuur doorgeeft aan de LK8000 applicatie.
Hieronder de code waarmee ik binnenkort een proefvaart hoop te maken.
Commentaar welkom
Groet
René
- Code: Alles selecteren
/*
Script voor de draadloze Attiny85 temperatuur sensor 8 januari 2014
ZENDER
Manchester library wordt gebruikt voor het zenden, hierdoor is het zenden(timing) minder temperatuur afhankelijk
OneWire wordt gebruikt bij het lezen van de temperatuursensor DS18B20
Narcoleptic wordt gebruikt om tussen het zenden in het energiegebruik te minimaliseren
De zender wordt aan- en uitgeschakeld via een attiny poort om het energieverbruik te minimaliseren
tijdens de zendsessies
MAN_300 0
MAN_600 1
MAN_1200 2
MAN_2400 3
MAN_4800 4
MAN_9600 5
MAN_19200 6
MAN_38400 7
De Manchester libray ondersteunt alleen het doorgeven van 1 Byte (0-255).
Om ook negetieve waarden door te geven wordt ook de ID doorgegeven.
ID=1 voor positieve waarden, ID=0 voor negatieve waarden
TEMPSENSOR
De DS18B20 temperatuur sensor wordt op enkelvoudige wijze gebruikt.
(er zit maar 1 sensor op de onewire)
Als de zender niet werkt worden negatieve waarden doorgegeven.
Afhankelijk van het probleem is dat -98, -97 of -96.
ENERGIE GEBRUIKT
Om het energiegebruik te minimaliseren zijn verschillende maatregelen genomen.
1. Het systeem wordt gewekt (Pin Change) door "de schakelaar in te drukken". De schakelaar is een touch methode (natte vinger over twee kontakten.)
De "schakkelaar" is aangesloten op digitale PIN1 dat is PIN6 op de Attiny. Met 100k weerstand naar VCC en een kleine condensator naar aarde.
PIN6 en de - vormen de "natte vinger schakelaar".
Na operating_time gaat het systeem in sleepmode nadat alle poorten met pinMode op INPUT zijn gezet
2. Tijdens operating_time wordt om de interval_time een temperatuur meting gedaan.
3. De power aansluiting van de zender is aangesoten op een poort.
Voor het zenden wordt de poort op OUTPUT en HIGH gezet, direct na het meten of zenden wordt de poort weer op INPUT en LOW gezet
4. Tijdens de intervaltijd wordt het systeem mbv Narcoleptic library in sleep gezet (Narcoleptic.delay()). Hierdoor werkt millis() niet meer.
Om die reden wordt de operating_time omgerekend naar het aantal waarnemingen, die vervolgens worden geteld met een counter
5. Na het aanzetten van het systeem gaat tijdens het zenden een led branden tijdens het zenden en alleen bij temperaturen tussen 0 en 40 graden.
PIN GEBRUIK laden script
Om de software op de Attiny te laden wordt gebruik gemaakt van een Arduino. De kleine C op het printje moet worden ontkoppeld voor het laden van het script.
De volgende pinnen worden dan gebruikt
Arduino Attiny Attiny Arduino
10 1 8 vcc
2 7 13
3 6 12
4 5 11
Zie verder "gebruik Arduino als ISP"
PIN GEBRUIK als draadloze zender
Aansluiting Attiny Attiny Aansluiting
Niet gebruikt 1 8 + batterij
TX_PIN 3 2 7 LED_PIN 2
TX_POWER 4 3 6 WAKE_PIN 1 (100K naar + kleine C naar -, natte vinger contact naar aarde ontlaadt de C )
- batterij 4 5 ONE_WIRE_BUS 0
*/
#include <OneWire.h>
#include <Manchester.h>
#include <Narcoleptic.h>
#include <avr/sleep.h>
// PARAMETERS
unsigned long operating_time = (60*60*1000*2) ; // 60minuten*60seconden*1000millis*2uren
unsigned long interval_time = 2000; // tijd tussen de metingen in ms
int operating_intervals = operating_time/(interval_time+150); // dit is het aantal keren dat tijdens de operating_time een bericht wordt verzonden
int counter = 0;
//sleep vanaf hier
#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif
//sleep tot hier
#define LED_PIN 2 // zit op pin 7
#define TX_POWER 4 // zender power en led zitten op pin 3
#define TX_PIN 3 // pin where your transmitter is connected 2
#define WAKE_PIN 1 // aansluiting schakelaar voor het aanzetten(moet PIN 1 zijn) zit op pin 6
int SIGN_ID=1 ; // 0 is -1 graad of kouder, 1 is 0 of warmer
int DS18B20_Pin = 0; // DS18B20 Signal pin on digital 5
//Temperature chip i/o
OneWire ds(DS18B20_Pin); // on digital pin 2
void setup(void) {
pinMode(TX_POWER, OUTPUT);
pinMode(LED_PIN, OUTPUT);
//sleep vanaf hier
pinMode(WAKE_PIN, INPUT);
sbi(GIMSK,PCIE); // Turn on Pin Change interrupt
sbi(PCMSK,PCINT1); // Which pins are affected by the interrupt, dit is digital PIN1 (pin6)
//sleep tot hier
man.workAround1MhzTinyCore(); //add this in order for transmitter to work with 1Mhz Attiny85/84 nvt
man.setupTransmit(TX_PIN, MAN_1200);
}
void loop(void) {
int temperature = getTemp();
SIGN_ID = 1;
if (temperature < 0)
{
SIGN_ID = 0;
temperature = temperature*(-1); // bij negatieve temperatuur worden deze positief gemaakt
}
pinMode(TX_POWER, OUTPUT);
digitalWrite(TX_POWER, HIGH);
delay(10);
if (temperature > 0) //tussen 0 en 40 graden brandt een LED tijdens de zendactie
{ if (temperature < 40 )
{pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, HIGH);
}
}
man.transmit(man.encodeMessage(SIGN_ID, temperature));
digitalWrite(LED_PIN, LOW);
pinMode(LED_PIN, INPUT);
// man.transmit(man.encodeMessage(SIGN_ID, temperature));
digitalWrite(TX_POWER, LOW);
pinMode(TX_POWER, INPUT);
Narcoleptic.delay(interval_time);
counter = (counter +1);
if (operating_intervals < counter)
{
system_sleep();
counter = 0;
}
}
float getTemp(){
//returns the temperature from one DS18B20 in DEG Celsius
byte data[12];
byte addr[8];
if ( !ds.search(addr)) {
//no more sensors on chain, reset search
ds.reset_search();
return -98;
}
if ( OneWire::crc8( addr, 7) != addr[7]) {
// CRC is not valid!
return -97;
}
if ( addr[0] != 0x10 && addr[0] != 0x28) {
// Device is not recognized
return -96;
}
ds.reset();
ds.select(addr);
ds.write(0x44,1); // start conversion, with parasite power on at the end
byte present = ds.reset();
ds.select(addr);
ds.write(0xBE); // Read Scratchpad
for (int i = 0; i < 9; i++) { // we need 9 bytes
data[i] = ds.read();
}
ds.reset_search();
byte MSB = data[1];
byte LSB = data[0];
float tempRead = ((MSB << 8) | LSB); //using two's compliment
float TemperatureSum = tempRead / 16;
return TemperatureSum;
}
//sleep van hier
// From http://interface.khm.de/index.php/lab/experiments/sleep_watchdog_battery/
void system_sleep() {
cbi(ADCSRA,ADEN); // Switch Analog to Digital converter OFF
set_sleep_mode(SLEEP_MODE_PWR_DOWN); // Set sleep mode
sleep_mode(); // System sleeps here
sbi(ADCSRA,ADEN); // Switch Analog to Digital converter ON
}
ISR(PCINT0_vect) {
}
//sleep tot hier
Advertisement
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: Attiny85 met 433mhz zender en DS18B20 tempsensor
Ik heb in een vergelijkbaar project gebruik gemaakt met 3 x AAA batterijen die kunnen inkakken tot ongeveer 2Volt. Ook hier slaapt alles pas als er een signaal is (van een accelerator), wordt de CPU wakker, die dan weer een schakelende voeding (booster met MCP1640) aangooit die 5V maakt (kan nog tot 0.9V input) die dan weer de zender van spanning voorziet. Signaaltje uit en alles weer slapen.
Re: Attiny85 met 433mhz zender en DS18B20 tempsensor
Hallo,
Ik wil zelf ook een "radiografische thermometer" maken ( voor een hottub die hout gestookt is).
Misschien een beetje hoog gegrepen voor me daar ik beginnende arduino fan ben.
In je beschrijving heb je het over aansluitingen die op een andere pin komen zoals bijvoorbeeld Led pin 2 =pin 7.
ik snap niet goed of je bedoelt dat op de attiny de aansluiting naar pin 7 gaat en daarop ook benadert/geprogrammeerd moet worden in de sketch.
Kun je dat misschien voor me toelichten??
Groet en de beste wensen voor 2015.
Richard
Ik wil zelf ook een "radiografische thermometer" maken ( voor een hottub die hout gestookt is).
Misschien een beetje hoog gegrepen voor me daar ik beginnende arduino fan ben.
In je beschrijving heb je het over aansluitingen die op een andere pin komen zoals bijvoorbeeld Led pin 2 =pin 7.
ik snap niet goed of je bedoelt dat op de attiny de aansluiting naar pin 7 gaat en daarop ook benadert/geprogrammeerd moet worden in de sketch.
Kun je dat misschien voor me toelichten??
Groet en de beste wensen voor 2015.
Richard
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: Attiny85 met 433mhz zender en DS18B20 tempsensor
Er is een verschil bij de arduino tussen de logische pin en fysieke pin. M.a.w. D2 op de Arduino is niet de fysiek pin nummer 2 op de chip. Dat geldt ook voor de tinies. Je moet dus weten welke fysiek pin je wilt gebruiken maar ook hoe hij in de Arduino mapping heet. ff googelen dus....
14 berichten
• Pagina 2 van 2 • 1, 2
Wie is er online?
Gebruikers in dit forum: ezevojazauq en 20 gasten