2014-12-27 3 views
2

Я нахожусь в середине небольшого проекта с ATmega8. Я хотел бы прочитать температуру от датчика DS18B20, а затем отправить результаты с помощью передатчика rf433. Все в порядке, но размер моего источника ... У ATmega всего 7 168 байт памяти, но мой бинарный файл составляет 8 310 байт. Я удалил все ненужные вещи, и все же это слишком много. Не могли бы вы помочь мне уменьшить размер? Я использую Arduino IDE для написания кода, возможно, в чистом C он будет легче?Уменьшение размера кода C для ATmega8

Любая помощь приветствуется :)

Код:

// 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); 
} 
+2

Вы используете системные функции, предоставляемые некоторой библиотекой. Как вы знаете, что размер этих, добавленных, не больше, чем у вас? – usr2564301

+0

Согласовано. Отбросьте библиотеки. Или используйте большее устройство. –

+0

Поскольку такой код: // RF433 #include // Даллас #include #include аннулируются установка() {} аннулируются петля() { } дает только 1506 байт. Так что это не их вина :( – pablo7890

ответ

0

Спасибо всем вам, ребята. Вчера я нашел способ выполнения этой задачи. Может быть, кто-то будет искать ответ в будущем, так вот вот: Я сдался в библиотеке Далласа, наконец выяснилось, что это не первая потребность.

Программирование ATmega8 для работы с DS18B20 датчика температуры и RF433Mhz передатчика:

#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; 

} 

Над кодом в виде бинарного занимает около 6300 байт, так что еще осталось некоторое улучшение мало места.

Надеюсь, вы найдете это полезным :)