Запись данных с датчика DHT11 на SD карту?
- Войдите на сайт для отправки комментариев
Пт, 02/09/2011 - 21:01
Добрый день, подскажите пожалуйста код для Запись данных с датчика DHT11 на SD карту.
Добрый день, подскажите пожалуйста код для Запись данных с датчика DHT11 на SD карту.
Вот на копипастил , вроде работает, теперь осталось два вапроса:
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"); } }2. как добавить хоть какойто оринтир времени без часов (например запись времени от начала пуска измерения?)
лучше и красивее было бы прицепить RTC и тогда четко бет и красиво по времени
>как добавить хоть какойто оринтир времени без часов (например запись времени от начала пуска измерения?)
библиотека http://www.arduino.cc/playground/Code/Time функция now() возвращает время в секундах.
или стандартные arduino.cc/en/Reference/HomePage
millis() в милисикундах, micros() в микросекундах.
> как данные писать в строчку или табличкой типа *.xls.
Задача теоретически возможная, но _очень_ теоретически. Если вы хотите просто "кликнуть на файл и что-бы он открылся в экселе", то ГОРАЗДО проще смотреть в сторону формата .csv ru.wikipedia.org/wiki/CSV . Эксель тоже умеет с ним работать.
Это фактически тот же текстовый файл, только расширение .csv а не .txt, и данные разделены запятыми (или точкой с запятой).
По привычке дал ссылки на "первоисточники", но на этом сайте есть часть переведенной на русский язык документации:
http://arduino.ru/Reference советую ознакомится, что-бы знать "что есть из коробки". Тем более что "не так уж и много" там читать. ;)
А есть вариант записывать данные в таблицу ексель не последовательно в ячейки а с указанием номера (х,у) ячейки?
А есть вариант записывать данные в таблицу ексель не последовательно в ячейки а с указанием номера (х,у) ячейки?
есть вариант что вы разберетесь в формате таблиц экселя и сможете даже картинки там рисовать и комиксы..
неправильно задал вопрос.
Есть связка ардуино мега, часы реального времени карт-ридер, считывательрадио-меток и разные датчики. Вся связка работает. Необходимо записывать данные в таблицу ексель с указанием номера ячейки и сохранять на сд-карте(не на компе). Как это можно сделать?
неправильно задал вопрос.
Есть связка ардуино мега, часы реального времени карт-ридер, считывательрадио-меток и разные датчики. Вся связка работает. Необходимо записывать данные в таблицу ексель с указанием номера ячейки и сохранять на сд-карте(не на компе). Как это можно сделать?
ровно точно так же как и всегда записываете что то на СД карту с ардуины.. просто придерживаетесь нужного формата файла. вам вроде нужен же эксель.. ну вот в его формате и пишите..
А как указать координаты ячейки таблицы?
А как указать координаты ячейки таблицы?
ЗАГУГЛИ! вот прям ровно свой вопрос вставь в строку запроса гугля и там куча советов вывалится... о том как организована структура файлов
#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 непроблема передалать думаю...
ай, молодец :)
Темпиратура 1;Темпиратура 2
неправильно задал вопрос.
Есть связка ардуино мега, часы реального времени карт-ридер, считывательрадио-меток и разные датчики. Вся связка работает. Необходимо записывать данные в таблицу ексель с указанием номера ячейки и сохранять на сд-карте(не на компе). Как это можно сделать?
Скорее всего как-то так
https://www.youtube.com/watch?v=IE89cWojiYU
#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)
может разные версии библиотеки часов?
Присоединяюсь к вопросу, может разные версии библиотек?
<ds18b20.h> и <RTClib.h>. Можно вашу библеотеку?