Запись данных с датчика DHT11 на SD карту?

sdveg
Offline
Зарегистрирован: 02.09.2011

 Добрый день, подскажите пожалуйста код для Запись данных с датчика DHT11 на SD карту.

 

sdveg
Offline
Зарегистрирован: 02.09.2011

Вот на копипастил , вроде работает, теперь осталось два вапроса:

1. как данные писать в строчку или табличкой типа *.xls.

2. как добавить хоть какойто оринтир времени без часов (например запись времени от начала пуска  измерения?)

 

 
// Example testing sketch for various DHT humidity/temperature sensors
// Written by ladyada, public domain

#include "DHT.h"

#define DHTPIN 2 // what pin we're connected to

// Uncomment whatever type you're using!
#define DHTTYPE DHT11 // DHT 11
//define DHTTYPE DHT22 // DHT 22 (AM2302)
//#define DHTTYPE DHT21 // DHT 21 (AM2301)

// Connect pin 1 (on the left) of the sensor to +5V
// Connect pin 2 of the sensor to whatever your DHTPIN is
// Connect pin 4 (on the right) of the sensor to GROUND
// Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor

DHT dht(DHTPIN, DHTTYPE);

 

/*
SD card read/write

Этот пример показывает как читать и писать данные на и из файла на SD карточке
Схема подключения
* SD карточка подсоеденина к SPI шине:
** MOSI - pin 11
** MISO - pin 12
** CLK - pin 13
** CS - pin 10

создано Ноябрь 2010
David A. Mellis
обновлено 2 Декабря 2010
Tom Igoe
и переведено в Марте 2011
Gleb Devyatkin
Этот пример кода - народное достояние.

*/

#include <SD.h>

File myFile;

 


void setup() {
Serial.begin(9600);
Serial.println("DHTxx test!");

dht.begin();
 

Serial.print("Initializing SD card...");
// On the Ethernet Shield, CS is pin 4. It's set as an output by default.
// Note that even if it's not used as the CS pin, the hardware SS pin
// (10 on most Arduino boards, 53 on the Mega) must be left as an output
// or the SD library functions will not work.
pinMode(10, OUTPUT);

if (!SD.begin(10)) {
Serial.println("initialization failed!");
return;
}
Serial.println("initialization done.");

// открываем файл. заметте, что только один файл может быть открыт за раз,
// поэтому вы должны закрыть этот, чтобы открыть другой.
myFile = SD.open("test.txt", FILE_WRITE);

// если файл нормально открылся, запишем в него:
if (myFile) {
Serial.print("Writing to test.txt...");
myFile.println("zapis temperatury i vlagnosti");
// закрываем файл:
myFile.close();
Serial.println("done.");
} else {
// а если он не открылся, то печатаем сообщение об ошибке:
Serial.println("error opening test.txt");
}

// откроем файл снова, для чтения:
myFile = SD.open("test.txt");
if (myFile) {
Serial.println("test.txt:");

// читаем из файла, пока не достигнем конца файла:
while (myFile.available()) {
Serial.write(myFile.read());
}
// закрываем файл:
myFile.close();
} else {
// а если не открылся, то пишем об ошибке:
Serial.println("error opening test.txt");
}
}


void loop() {
// Reading temperature or humidity takes about 250 milliseconds!
// Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
float h = dht.readHumidity();
float t = dht.readTemperature();

// check if returns are valid, if they are NaN (not a number) then something went wrong!
if (isnan(t) || isnan(h)) {
Serial.println("Failed to read from DHT");
} else {
Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("Temperature: ");
Serial.print(t);
Serial.println(" *C");
}

myFile = SD.open("test.txt", FILE_WRITE);

// если файл нормально открылся, запишем в него:
if (myFile) {
Serial.print("Writing to test.txt...");
myFile.println("Humidity: ");
myFile.println(h);
myFile.println(" %\t");
myFile.println("Temperature: ");
myFile.println(" *C");

// закрываем файл:
myFile.close();
Serial.println("done.");
} else {
// а если он не открылся, то печатаем сообщение об ошибке:
Serial.println("error opening test.txt");
}
}

 

Adessit
Adessit аватар
Offline
Зарегистрирован: 12.04.2011

2. как добавить хоть какойто оринтир времени без часов (например запись времени от начала пуска измерения?)

лучше и красивее было бы прицепить RTC и тогда четко бет и красиво по времени 

leshak
Offline
Зарегистрирован: 29.09.2011

>как добавить хоть какойто оринтир времени без часов (например запись времени от начала пуска измерения?)

библиотека http://www.arduino.cc/playground/Code/Time функция now() возвращает время в секундах.

или стандартные arduino.cc/en/Reference/HomePage

millis() в милисикундах, micros() в микросекундах.

> как данные писать в строчку или табличкой типа *.xls.

Задача теоретически возможная, но _очень_ теоретически. Если вы хотите просто "кликнуть на файл и что-бы он открылся в экселе", то ГОРАЗДО проще смотреть в сторону формата .csv ru.wikipedia.org/wiki/CSV . Эксель тоже умеет с ним работать.

Это фактически тот же текстовый файл, только расширение .csv а не .txt, и данные разделены запятыми (или точкой с запятой).

leshak
Offline
Зарегистрирован: 29.09.2011

По привычке дал ссылки на "первоисточники", но на этом сайте есть часть переведенной на русский язык документации:

http://arduino.ru/Reference советую ознакомится, что-бы знать "что есть из коробки". Тем более что "не так уж и много" там читать. ;)

Тима
Тима аватар
Offline
Зарегистрирован: 11.04.2013

А есть вариант записывать данные в таблицу ексель не последовательно в ячейки а с указанием номера (х,у) ячейки?

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Тима пишет:

А есть вариант записывать данные в таблицу ексель не последовательно в ячейки а с указанием номера (х,у) ячейки?

есть вариант что вы разберетесь в формате таблиц экселя и сможете даже картинки там рисовать и комиксы..

Тима
Тима аватар
Offline
Зарегистрирован: 11.04.2013

неправильно задал вопрос.

Есть связка ардуино мега, часы реального времени карт-ридер, считывательрадио-меток и разные датчики. Вся связка работает. Необходимо записывать данные в таблицу ексель с указанием номера ячейки и сохранять на сд-карте(не на компе). Как это можно сделать?

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Тима пишет:

неправильно задал вопрос.

Есть связка ардуино мега, часы реального времени карт-ридер, считывательрадио-меток и разные датчики. Вся связка работает. Необходимо записывать данные в таблицу ексель с указанием номера ячейки и сохранять на сд-карте(не на компе). Как это можно сделать?

ровно точно так же как и всегда записываете что то на СД карту с ардуины.. просто придерживаетесь нужного формата файла. вам вроде нужен же эксель.. ну вот в его формате и пишите..

Тима
Тима аватар
Offline
Зарегистрирован: 11.04.2013

А как указать координаты ячейки таблицы?

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Тима пишет:

А как указать координаты ячейки таблицы?

ЗАГУГЛИ! вот прям ровно свой вопрос вставь в строку запроса гугля и там куча советов вывалится... о том как организована структура файлов 

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013
#include <OneWire.h>
#include <ds18b20.h>
#include <SD.h>
#include <Wire.h>
#include <RTClib.h>

// Supports up to 8 devices connected to the OneWire bus
DS18B20 ds(9, 2);
RTC_DS1307 rtc;
File myFile;
long id;

void setup(void) {
  Wire.begin();
  rtc.begin();
  Serial.begin(9600);
  if (! rtc.isrunning()) {
    Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled
    rtc.adjust(DateTime(__DATE__, __TIME__));
  }
  pinMode(13,OUTPUT);
  id = 0;
  if (!SD.begin(4)) {
    Serial.println("SD initialization failed!");
    return;
  }
  digitalWrite(13,HIGH);
  Serial.println("SD initialization done.");
}

void loop(void) {
  digitalWrite(13,LOW);
  char buf[254];
  char t1[10];
  char t2[10];
  DateTime now = rtc.now();
  // initialize() scans the bus for sensors
  ds.initialize();
  // ask for a temperature conversion from sensor 0
  ds.start_conversion(0);
  // read the scratchpad on the other side
  ds.read_scratchpad(0);
  dtostrf(ds.read_temperature(), 5, 2, t1);
  ds.start_conversion(1);
  // read the scratchpad on the other side
  ds.read_scratchpad(1);
  dtostrf(ds.read_temperature(), 5, 2, t2);
  char dbuf[20];
  strncpy(dbuf,"DD.MM.YYYY hh:mm:ss\0",20);
  sprintf(buf, "%s; %s; %s; %d", now.format(dbuf), t1, t2, id);
  Serial.print(buf);
  char name[19];
  strncpy(name,"DD-MM-YY.CSV\0",19);
  now.format(name);
  if(!SD.exists(name)){
    myFile = SD.open(name, FILE_WRITE);
    if (myFile) {
      Serial.print("\nWriting to ");
      Serial.println(name);
      myFile.println("\xEF\xBB\xBFДата;Темпиратура 1;Темпиратура 2;Номер измерения");
      myFile.close();
      id = 0;
    }
  }
  myFile = SD.open(name, FILE_WRITE);
  if (myFile) {
    digitalWrite(13,HIGH);
    myFile.println(buf);
    myFile.close();
    Serial.println("  OK");
    id++;
  }else{
    Serial.println("  Failed!");
  }
  if(id >10000){
    id = 0;
  }
}

Вот недавно игрался - такой код делал - каждый день новый файл создается - только для двух далласов термометров, на DHT11 непроблема передалать думаю...

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

ай, молодец :)

Темпиратура 1;Темпиратура 2

 

Alexus-12
Offline
Зарегистрирован: 28.03.2014

Тима пишет:

неправильно задал вопрос.

Есть связка ардуино мега, часы реального времени карт-ридер, считывательрадио-меток и разные датчики. Вся связка работает. Необходимо записывать данные в таблицу ексель с указанием номера ячейки и сохранять на сд-карте(не на компе). Как это можно сделать?

Скорее всего как-то так

https://www.youtube.com/watch?v=IE89cWojiYU

vvadim
Offline
Зарегистрирован: 23.05.2012

NeiroN пишет:

#include <OneWire.h>
#include <ds18b20.h>
#include <SD.h>
#include <Wire.h>
#include <RTClib.h>

// Supports up to 8 devices connected to the OneWire bus
DS18B20 ds(9, 2);
RTC_DS1307 rtc;
File myFile;
long id;

void setup(void) {
  Wire.begin();
  rtc.begin();
  Serial.begin(9600);
  if (! rtc.isrunning()) {
    Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled
    rtc.adjust(DateTime(__DATE__, __TIME__));
  }
  pinMode(13,OUTPUT);
  id = 0;
  if (!SD.begin(4)) {
    Serial.println("SD initialization failed!");
    return;
  }
  digitalWrite(13,HIGH);
  Serial.println("SD initialization done.");
}

void loop(void) {
  digitalWrite(13,LOW);
  char buf[254];
  char t1[10];
  char t2[10];
  DateTime now = rtc.now();
  // initialize() scans the bus for sensors
  ds.initialize();
  // ask for a temperature conversion from sensor 0
  ds.start_conversion(0);
  // read the scratchpad on the other side
  ds.read_scratchpad(0);
  dtostrf(ds.read_temperature(), 5, 2, t1);
  ds.start_conversion(1);
  // read the scratchpad on the other side
  ds.read_scratchpad(1);
  dtostrf(ds.read_temperature(), 5, 2, t2);
  char dbuf[20];
  strncpy(dbuf,"DD.MM.YYYY hh:mm:ss\0",20);
  sprintf(buf, "%s; %s; %s; %d", now.format(dbuf), t1, t2, id);
  Serial.print(buf);
  char name[19];
  strncpy(name,"DD-MM-YY.CSV\0",19);
  now.format(name);
  if(!SD.exists(name)){
    myFile = SD.open(name, FILE_WRITE);
    if (myFile) {
      Serial.print("\nWriting to ");
      Serial.println(name);
      myFile.println("\xEF\xBB\xBFДата;Темпиратура 1;Темпиратура 2;Номер измерения");
      myFile.close();
      id = 0;
    }
  }
  myFile = SD.open(name, FILE_WRITE);
  if (myFile) {
    digitalWrite(13,HIGH);
    myFile.println(buf);
    myFile.close();
    Serial.println("  OK");
    id++;
  }else{
    Serial.println("  Failed!");
  }
  if(id >10000){
    id = 0;
  }
}

Вот недавно игрался - такой код делал - каждый день новый файл создается - только для двух далласов термометров, на DHT11 непроблема передалать думаю...

попробовал - ругается на now.format(name)

может разные версии библиотеки часов?

valera140582
Offline
Зарегистрирован: 01.07.2016

Присоединяюсь к вопросу, может разные версии библиотек?

<ds18b20.h> и <RTClib.h>. Можно вашу библеотеку?