Attiny85 met 433mhz zender en DS18B20 tempsensor

Arduino specifieke Software
Berichten: 132
Geregistreerd: 21 Feb 2013, 16:04

Re: Attiny85 met 433mhz zender en DS18B20 tempsensor

Berichtdoor René » 08 Jan 2014, 19:01

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.

Afbeelding

Afbeelding

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

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Attiny85 met 433mhz zender en DS18B20 tempsensor

Berichtdoor nicoverduin » 08 Jan 2014, 20:39

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.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 1
Geregistreerd: 23 Dec 2014, 02:23

Re: Attiny85 met 433mhz zender en DS18B20 tempsensor

Berichtdoor olliver1 » 31 Dec 2014, 23:08

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

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Attiny85 met 433mhz zender en DS18B20 tempsensor

Berichtdoor nicoverduin » 01 Jan 2015, 17:29

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....
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Vorige

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: ezevojazauq en 20 gasten