Search code examples
catmegatemperaturearduino-idetransmission

Reducing C code size for ATmega8


I'm in the middle of a small project with ATmega8. I would like to read temperature from DS18B20 sensor, and then send results using rf433 transmitter. Everything is fine, but size of my source... ATmega has only 7 168 bytes of memory but yet my binary is 8 310 bytes. I removed any unnessesary things and still it's too much. Could you help me reducing size? I'm using Arduino IDE to write the code, maybe in pure C it would be lighter?

Any help appreciated :)

Code:

// RF433
#include <VirtualWire.h>
// Dallas
#include <DallasTemperature.h>
#include <OneWire.h> 

//const char *message; // Our message to send
const int ONE_WIRE_BUS = 2; //DS18S20 Signal pin on digital 2

//Temperature chip i/o
OneWire oneWire(ONE_WIRE_BUS); // on digital pin 2

// Pass our oneWire reference to Dallas Temperature.
DallasTemperature Sensors(&oneWire);

void setup() {
  // RF433
  vw_set_ptt_inverted(true);
  vw_setup(2000);

  Sensors.begin();
}

void loop() {
  // call sensors.requestTemperatures() to issue a global temperature
  // request to all devices on the bus
  Sensors.requestTemperatures(); // Send the command to get temperatures

  float dTmp = Sensors.getTempCByIndex(0);
  // Why "byIndex"? 
  // You can have more than one IC on the same bus. 
  // 0 refers to the first IC on the wire

  char buf[6];
  dtostrf(dTmp, 6, 3, buf);

  char Msg[9];
  strcpy(Msg, "TP:");

  strncat(Msg, buf, 6);

  // Send temp.
  for (int i = 0; i < 10; ++i) // avoid loosing packets
  {
    vw_send((uint8_t *)Msg, strlen(Msg));
    vw_wait_tx();
    delay(300);
  }

  // Sleep 1 min.
  delay(60000);
}

Solution

  • Thanks all of you, guys. Yesterday I found a way how to accomplish this task. Maybe someone will be looking for the answer in the future, so here it is: I gave up on Dallas library, finally it turned out that it's not first need.

    Programming ATmega8 to work with DS18B20 Temperature Sensor and RF433Mhz Transmitter:

    #include <OneWire.h> 
    // RF433
    #include <VirtualWire.h>
    
    int DS18S20_Pin = 2; //DS18S20 Signal pin on digital 2
    
    //Temperature chip i/o
    OneWire ds(DS18S20_Pin); // on digital pin 2
    int led = 13;
    void setup(void) {
      // RF433
      vw_set_ptt_inverted(true);
      vw_setup(2000);
    
      pinMode(led, OUTPUT);
    }
    
    void loop(void) {
      float dTmp = getTemp();
      char buf[6];
      dtostrf(dTmp, 6, 3, buf);
    
      char Msg[10];
      strcpy(Msg, "TMP:");
    
      strncat(Msg, buf, 6);
      digitalWrite(led, HIGH);
      for (int i = 0; i < 10; ++i) // avoid loosing packets in the air
      {
        vw_send((uint8_t *)Msg, strlen(Msg));
        vw_wait_tx();
        delay(300);
      }
      digitalWrite(led, LOW);
    
      // Sleep 15 s.
      delay(15000);
    }
    
    
    float getTemp(){
      //returns the temperature from one DS18S20 in DEG Celsius
    
      byte data[12];
      byte addr[8];
    
      if ( !ds.search(addr)) {
        //no more sensors on chain, reset search
        ds.reset_search();
        return -1000;
      }
    
      if ( OneWire::crc8( addr, 7) != addr[7]) {
        //   Serial.println("CRC is not valid!");
        return -1000;
      }
    
      if ( addr[0] != 0x10 && addr[0] != 0x28) {
        //   Serial.print("Device is not recognized");
        return -1000;
      }
    
      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;
    
    }
    

    Above code as a binary takes about 6300 bytes, so there is still a little space left for some improvements.

    Hope you'll find it usefull :)