SD+LAN+DHT11
- Войдите на сайт для отправки комментариев
Пт, 31/01/2014 - 15:22
Надо собрать SD+LAN+DHT11. набросал отдельно себе коды, работают нормально, начинаю объединять, и появилась проблема (SD+DHT11)
1 - В serial монитор почему то писало 2 раза о чтении датчика DHT11, потом что то наковырял, перестало, но такое ощущение, что функция myTempDataDHT11 выполняется 2 раза внутри loop, и если не ставить делей между выводом в файл и монитор, то датчик показывает ошибку таймаута.
#include <dht11.h> #include <SdFat.h> SdFat sd; SdFile myFile; dht11 DHT11; const int selectEthernet = 10; // выбор ведомого на шилде - Ethernet const int selectSd = 4; // выбор ведомого на шилде - SD #define DHT11PIN 2 // включим Ethernet #define SWITCH_TO_W5100 digitalWrite(selectSd,HIGH); digitalWrite(selectEthernet,LOW); // включим SD #define SWITCH_TO_SD digitalWrite(selectEthernet,HIGH); digitalWrite(selectSd,LOW); // выключим и SD и Ethernet #define ALL_OFF digitalWrite(selectEthernet,HIGH); digitalWrite(selectSd,HIGH); void setup() { Serial.begin(9600); // Initialize SdFat or print a detailed error message and halt // Use half speed like the native library. // change to SPI_FULL_SPEED for more performance. delay(400); // catch Due reset problem SWITCH_TO_SD; if (!sd.begin(selectSd, SPI_HALF_SPEED)) sd.initErrorHalt(); } void loop() { delay(2000); uint32_t t = millis()/1000; String MyStrTemperature=myTempDataDHT11(DHT11PIN); String MyStr; delay(500); mySDLogString("fer.txt",MyStrTemperature,t); delay(500); Serial.print(MyStrTemperature); Serial.print(";"); Serial.println(t); } String myTempDataDHT11(int mDHT11Pin){ String result; Serial.println("\nTemp-DHT11 Reading..."); int chk = DHT11.read(DHT11PIN); Serial.print("DHT11 Sensor: "); switch (chk) { case DHTLIB_OK: result = "OK;Sensor:";result = result + mDHT11Pin;result = result + ";Temp:";result = result + DHT11.temperature; result = result + ";Humid%:";result = result + DHT11.humidity;break; case DHTLIB_ERROR_CHECKSUM: Serial.println("Checksum error"); result = "ErrCS;Sensor:";result = result + mDHT11Pin;result = result + ";0;0";break; case DHTLIB_ERROR_TIMEOUT: Serial.println("Time out error"); result = "ErrTO;Sensor:";result = result + mDHT11Pin;result = result + ";0;0";break; default: Serial.println("Unknown error"); result = "ErrUNK;Sensor:"; result = result + mDHT11Pin; result = result + ";0;0"; break; } return result; } void mySDLogString(String MFileName, String DataStr, uint32_t TimeFromStart){ // выберем ведомого SPI = включим SD SWITCH_TO_SD; // open the file for write at end like the Native SD library if (!myFile.open("fer.csv", O_RDWR | O_CREAT | O_AT_END)) { sd.errorHalt("opening %file% for write failed"); Serial.print("ERROR file Open!"); Serial.print(MFileName); //return "FAIL"; } // if the file opened okay, write to it: Serial.print("Writing to file..."); Serial.println(TimeFromStart); myFile.print(DataStr); myFile.println(";"); myFile.println(TimeFromStart); myFile.println(";"); myFile.close(); ALL_OFF; //return "OK"; }
Я сам не "шарю" в програмировании, но интересно. Меня че-то смущает строчка 48. Разве функцию можно "обзывать" String а не void?
P.S. И нажмите в IDE Ctrl+T - не возможно же код читать..
Разве функцию можно "обзывать" String а не void?
Этот DHT11 тот еще геморой, ошибки часто выдавал, стандартные либы к нему тоже, была у меня одна нестандартная либа которая работала с этим датчиком без проблем, уже затерялась, так как уже имею DHT22 и не имею проблем.
После перехода на новую версию 1.0.4 данная проблема исчезла, но по ходу добавления NTP клиента, снова стал проявляться какой то глюк, в сериал и в файл не выводится часть инфа от датчика, хотя вэб сервер нормально отображает.
Могу повторить ваш вариант если код скините, может смогу помоч. UNO+W5100_SD+DHT11?
Конечно, был бы благодарен. Может памяти не хватает, я ещё мало работаю с ардуино, не опытен. Если в моём коде что ниже, что то добавить в loop, то часть данных от датчика не выводятся (например добавить ещё обработку по другому интервалу millis)
нет мыслей ни у кого?