arduino uno + SD карта + ds18b20

Нет ответов
kristow
kristow аватар
Offline
Зарегистрирован: 08.08.2013

Arduino uno + SD ридер работает использую родной пример.

Arduino + ds18b20 = тоже работает, выводит данные в com port.

Пробую соединить arduino uno + SD карта + ds18b20 = скетч заливается, далее скетч висит, без действия, не пойму где косяк, и как его определить...

/*
 This example shows how to log data from three analog sensors 
 to an SD card using the SD library.
 The circuit:
 * analog sensors on analog ins 0, 1, and 2
 * SD card attached to SPI bus as follows:
 ** MOSI - pin 11
 ** MISO - pin 12
 ** CLK - pin 13
 ** CS - pin 4 	 
 */
#include <stdio.h>
#include <DS1302.h>
#include <SD.h>
#include <OneWire.h>
const int kCePin   = 5;  // Chip Enable
const int kIoPin   = 6;  // Input/Output
const int kSclkPin = 7;  // Serial Clock
DS1302 rtc(kCePin, kIoPin, kSclkPin);
int i;
byte present = 0;
byte type_s;
byte data[12];
byte addr[8];
int ss = 0;
float celsius;
byte  address_1[] = {0x28, 0x19, 0x00, 0xC0, 0x04, 0x00, 0x00, 0x74};
byte  address_2[] = {0x28, 0x56, 0x04, 0xC0, 0x04, 0x00, 0x00, 0x3A};
OneWire ds (10); // все OneWire устройства на pin 10
byte done[8];
const int chipSelect = 4;

void setup()
{
 // Open serial communications and wait for port to open:
  Serial.begin(9600);
   while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }
  rtc.writeProtect(false);
  rtc.halt(false);

  Serial.print("Initializing SD card...");
  if (!SD.begin(chipSelect)) {
    Serial.println("Card failed, or not present");
    return;
  }
  Serial.println("card initialized.");
}


void reeds()
{
  if(ds.search(addr) != 1) 
  {   
    ds.reset_search();
    delay(250);
    for(byte i = 0; i < 8; i++) addr[i] = 0;
    return;
  }
  ds.reset  ();
  ds.select  (addr);

  Serial.println("----------");

  ds.write  (0x44,1); // start conversion, with parasite power on at the end

  delay  (1000); 
  present = ds.reset  ();
  ds.select  (addr);
  ds.write  (0xBE); // Read Scratchpad

  for  (i = 0; i < 9; i++) { // we need 9 bytes
    data[i] = ds.read ();
  }

  // convert the data to actual temperature
  unsigned int raw =  (data[1] << 8) | data[0];
  if  (type_s) {
    raw = raw << 3; // 9 bit resolution default
    if  (data[7] == 0x10) {
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  } 
  else {
    byte cfg =  (data[4] & 0x60);
    if  (cfg == 0x00) raw = raw << 3; // 9 bit resolution, 93.75 ms
    else if  (cfg == 0x20) raw = raw << 2; // 10 bit res, 187.5 ms
    else if  (cfg == 0x40) raw = raw << 1; // 11 bit res, 375 ms
  }

  celsius =  (float)raw / 16.0;
}


void zapis (){
  reeds();
  Time t = rtc.time();
  char buf[50];
  snprintf(buf, sizeof(buf), "%04d-%02d-%02d %02d:%02d:%02d",
           t.yr, t.mon, t.date,
           t.hr, t.min, t.sec);
  Serial.println(buf);
  char dist_str[6];
  dtostrf(celsius,9, 6, dist_str);
  String dataString = "";
  dataString += buf;
  dataString += " | ";
  dataString += dist_str;
  // open the file. note that only one file can be open at a time,
  // so you have to close this one before opening another.
  File dataFile = SD.open("datalog.txt", FILE_WRITE);
  // if the file is available, write to it:
  if (dataFile) {
    dataFile.println(dataString);
    dataFile.close();
    // print to the serial port too:
    Serial.println(dataString);
  }  
  // if the file isn't open, pop up an error:
  else {
    Serial.println("error opening datalog.txt");
  } 
}


void loop()
{
  Serial.println("++++");
  for (i = 5; i < 55; i=i+5){
    Serial.println(i);
    Time t = rtc.time();
    if (t.min = i){
      if (ss != i){
        zapis ();
        ss = i;
      }
    }
  }
}

Я предпологаю что где-то пересекаются используемые пины... Пробовал устанавливать в другой пин 18b20, результата нет.