ArduinoUNO + narodmon + TFT 2.8"
- Войдите на сайт для отправки комментариев
Пнд, 14/12/2015 - 20:54
#include <SPI.h> #include <Ethernet.h> #include <OneWire.h> #include <Wire.h> #include <BMP085.h> #include<Adafruit_GFX.h> #include"SWTFT.h" #include <DHT.h> bool Debug = false; //режим отладки //******************************************************************************************** byte mac[] = { 0x00, 0x19, 0x66, 0x32, 0x8C, 0x78 }; //MAC-адрес Arduino #define BMP085_EXIST 1 // наличие датчика атмосферного давления #define BMP085_TEMP 1 // использовать температурный датчик в BMP085 #define DHT_EXIST 1 // наличие датчика влажности #define DHT_TEMP 1 // использовать температурный датчик в DHT22 #define DS18B20_PIN 0 // пин подключения термодатчика DS18B20 #define DHTPIN 1 // пин подключения датчика влажности DHT22 #define DHTTYPE DHT11 // тип датчика влажности DHT22/DHT11 #define postingInterval 300000 // интервал между отправками данных в миллисекундах (10 минут) #define BLACK 0x0000 #define BLUE 0x001F #define RED 0xF800 #define GREEN 0x07E0 #define CYAN 0x07FF #define MAGENTA 0xF81F #define YELLOW 0xFFE0 #define WHITE 0xFFFF SWTFT tft; //******************************************************************************************** IPAddress server(94,19,113,221); // IP сервера народного мониторинга char macbuf[13]; EthernetClient client; OneWire ds(DS18B20_PIN); #if BMP085_EXIST == 1 BMP085 dps = BMP085(); #endif #if DHT_EXIST == 1 DHT dht(DHTPIN, DHTTYPE); // 39 #endif unsigned long lastConnectionTime = 0; // время последней передачи данных boolean lastConnected = false; // состояние подключения int HighByte, LowByte, TReading, SignBit, Tc_100, Whole, Fract; char replyBuffer[160]; // буфер для отправки int CountSensors; // количество найденных датчиков температуры long Temperature = 0; long Pressure = 0; // давление float Humidity = 0; // влажность float PRESSURE ; void setup() { if (Debug) { Serial.begin(9600); } { Serial.println(F("TFT LCD test")); tft.reset(); uint16_t identifier = tft.readID(); Serial.print(F("LCD driver chip: ")); Serial.println(identifier, HEX); tft.begin(identifier); } // Пробуем подключиться по Ethernet до тех пор пока это не удастся do { delay(1000); } while (Ethernet.begin(mac) == 0); //Узнаём количество термодатчиков DS18B20 // 67 CountSensors = DsCount(); if (Debug) { Serial.print("Found "); Serial.print(CountSensors); Serial.println(" sensors."); } #if BMP085_EXIST == 1 Wire.begin(); dps.init(); #endif #if DHT_EXIST == 1 dht.begin(); #endif lastConnectionTime = millis()-postingInterval+15000; //первое соединение через 15 секунд после запуска } void loop() { //Если вдруг нам случайно приходят откуда-то какие-то данные, //то просто читаем их и игнорируем, чтобы очистить буфер if (client.available()) // 101 { client.read(); } if (!client.connected() && lastConnected) // 106 { if (Debug) { Serial.println(); Serial.println("disconnecting."); } client.stop(); } //если не подключены и прошло определённое время, то делаем замер, //переподключаемся и отправляем данные if (!client.connected() && (millis() - lastConnectionTime > postingInterval)) { //формирование HTTP-запроса memset(replyBuffer, 0, sizeof(replyBuffer)); // 121 strcpy(replyBuffer,"ID="); memset(macbuf, 0, sizeof(macbuf)); //Конвертируем MAC-адрес for (int k=0; k<6; k++) { int b1=mac[k]/16; // 128 int b2=mac[k]%16; char c1[2],c2[2]; if (b1>9) c1[0]=(char)(b1-10)+'A'; else c1[0] = (char)(b1) + '0'; if (b2>9) c2[0]=(char)(b2-10)+'A'; else c2[0] = (char)(b2) + '0'; c1[1]='\0'; c2[1]='\0'; strcat(macbuf,c1); strcat(macbuf,c2); } strcat(replyBuffer, macbuf); //Сбрасываем поиск датчиков (кол-во нам уже известно) ds.reset_search(); //Теперь в цикле опрашиваем все датчики DS18B20 сразу for (int j=0; j<CountSensors; j++) { byte i; byte present = 0; byte data[12]; byte addr[8]; long celsius; if ( !ds.search(addr)) { ds.reset_search(); return; } ds.reset(); ds.select(addr); ds.write(0x44,1); delay(1000); present = ds.reset(); ds.select(addr); ds.write(0xBE); for ( i = 0; i < 9; i++) // нам необходимы 9 байт данных от датчика { data[i] = ds.read(); } LowByte = data[0]; HighByte = data[1]; TReading = (HighByte << 8) + LowByte; SignBit = TReading & 0x8000; // бит знака if (SignBit) // отрицательная температура { TReading = (TReading ^ 0xffff) + 1; } Tc_100 = (6 * TReading) + TReading / 4; Whole = Tc_100 / 100; // разделяем целую и дробную части Fract = Tc_100 % 100; char temp[3]; itoa(Whole,temp); strcat(replyBuffer,"&"); //конвертируем адрес термодатчика for (int k=7; k>=0; k--) { int b1=addr[k]/16; int b2=addr[k]%16; char c1[2],c2[2]; if (b1>9) c1[0]=(char)(b1-10)+'A'; else c1[0] = (char)(b1) + '0'; if (b2>9) c2[0]=(char)(b2-10)+'A'; else c2[0] = (char)(b2) + '0'; c1[1]='\0'; c2[1]='\0'; strcat(replyBuffer, c1); strcat(replyBuffer, c2); } strcat(replyBuffer,"="); if (SignBit) //если температура отрицательная, добавляем знак минуса { strcat(replyBuffer,"-"); } strcat(replyBuffer,temp); strcat(replyBuffer,"."); if (Fract<10) { strcat(replyBuffer,"0"); } itoa(Fract,temp); strcat(replyBuffer,temp); } char temp[8]; long p_100, h_100; #if BMP085_EXIST == 1 //получаем значение атмосферного давления strcat(replyBuffer, "&"); strcat(replyBuffer, macbuf); strcat(replyBuffer, "01="); dps.getPressure(&Pressure); p_100 = Pressure/1.333; Whole = p_100 / 100; Fract = p_100 % 100; itoa(Whole, temp); strcat(replyBuffer, temp); strcat(replyBuffer, "."); PRESSURE = Pressure / 133.3; if (Fract<10) { strcat(replyBuffer,"0"); } itoa(Fract, temp); strcat(replyBuffer, temp); #if BMP085_TEMP == 1 //получаем значение температуры с датчика давления strcat(replyBuffer, "&bmpt="); dps.getTemperature(&Temperature); if (Temperature < 0) { SignBit = 1; Temperature = -Temperature; } else { SignBit = 0; } Whole = Temperature / 10; Fract = Temperature % 10; itoa(Whole, temp); if (SignBit) { strcat(replyBuffer, "-"); } strcat(replyBuffer, temp); strcat(replyBuffer, "."); itoa(Fract, temp); strcat(replyBuffer, temp); #endif #endif #if DHT_EXIST == 1 //получаем значение влажности Humidity = dht.readHumidity(); strcat(replyBuffer, "&"); strcat(replyBuffer, macbuf); strcat(replyBuffer, "02="); h_100 = Humidity*100; Whole = h_100 / 100; Fract = h_100 % 100; itoa(Whole, temp); strcat(replyBuffer, temp); strcat(replyBuffer, "."); if (Fract<10) { strcat(replyBuffer,"0"); } itoa(Fract, temp); strcat(replyBuffer, temp); #if DHT_TEMP == 1 //получаем значение температуры с датчика влажности strcat(replyBuffer, "&dhtt="); Temperature = dht.readTemperature()*100; if (Temperature < 0) { SignBit = 1; Temperature = -Temperature; } else { SignBit = 0; } Whole = Temperature / 100; Fract = Temperature % 100; itoa(Whole, temp); if (SignBit) { strcat(replyBuffer, "-"); } strcat(replyBuffer, temp); strcat(replyBuffer, "."); if (Fract<10) { strcat(replyBuffer,"0"); } itoa(Fract, temp); strcat(replyBuffer, temp); #endif #endif strcat(replyBuffer,'\0'); if (Debug) { Serial.println(replyBuffer); Serial.print("Content-Length: "); Serial.println(len(replyBuffer)); } // MY unsigned long testText(); tft.setRotation(3); tft.fillScreen(CYAN); unsigned long start = micros(); tft.setCursor(3, 20); tft.setTextColor(BLUE);tft.setTextSize(3); tft.print("HUMIDITY(%):"); tft.println((float)dht.readHumidity()); // 347 tft.setCursor(3, 60); tft.setTextColor(BLUE);tft.setTextSize(3); tft.print("TEMPERATURE:"); tft.println((float)dht.readTemperature()); tft.setCursor(3, 100); tft.setTextColor(BLACK);tft.setTextSize(3); tft.print("PRESSURE:"); tft.println((long)PRESSURE); //отправляем запрос httpRequest(); } //храним последнее состояние подключения lastConnected = client.connected(); } //Функция отправки данных void httpRequest() { if (client.connect(server, 80)) { if (Debug) { Serial.println("connecting..."); } // отправляем HTTP POST запрос: client.println("POST http://narodmon.ru/post.php HTTP/1.0"); client.println("Host: narodmon.ru"); client.println("Content-Type: application/x-www-form-urlencoded"); client.print("Content-Length: "); client.println(len(replyBuffer)); client.println(); client.println(replyBuffer); client.println(); lastConnectionTime = millis(); } else { if (Debug) { Serial.println("connection failed"); Serial.println("disconnecting."); } client.stop(); } } //Количество термодатчиков DS18B20 на шине int DsCount() { int count=0; bool thatsall = false; byte addr[8]; do { if ( !ds.search(addr)) { ds.reset_search(); thatsall = true; } count++; } while(!thatsall); return (count-1); } //Функция определения длины строки int len(char *buf) { int i=0; do { i++; } while (buf[i]!='\0'); return i; } //Функция переворота строки void reverse(char s[]) { int i, j; char c; for (i = 0, j = strlen(s)-1; i<j; i++, j--) { c = s[i]; s[i] = s[j]; s[j] = c; } } //Функция конвертирования числа в символьный массив void itoa(int n, char s[]) { int i, sign; if ((sign = n) < 0) /* записываем знак */ n = -n; /* делаем n положительным числом */ i = 0; do { /* генерируем цифры в обратном порядке */ s[i++] = n % 10 + '0'; /* берем следующую цифру */ } while ((n /= 10) > 0); /* удаляем */ if (sign < 0) s[i++] = '-'; s[i] = '\0'; reverse(s); }
всем привет, к UNO подключены датчики DHT11, BMP085, DS18B20 ; данные с помощью шилда W5100 отправляются на narodmon.ru ; на днях получил дисплей 2,8 " http://www.ebay.com/itm/381238351575?_trksid=p2057872.m2749.l2649&ssPageName=STRK%3AMEBIDX%3AIT
после двух дней копаний удалось вывести на дисплей показания влажности и температуры с DHT11 и давления с BMP085, а вот температуру с DS18B20 не получается ни в какую ; скетч, залитый сейчас - выше , вот то, что сейчас выводится на дисплей; подскажите плиз, как вывести данные с DS18B20 на TFT ?
#define DS18B20_PIN 0 // пин подключения термодатчика DS18B20
Тебе обычных пинов не хватает, что приходится на uart вешать?
всё занято под завязку, даже RESET дисплея перенес с А4 на RESET Ардуины ( вы сейчас конечно скажете про 4 цифровых пина под SD , я в курсе про них, если что - перенесу);
Ethernet + Sd = 5 пинов без питания.
DHT11 = 1 пин
DS18 = 1 пин
BMP085 использует i2c = 2 пина (A4 и A5)
Только не говори, что используешь софтовые ISP и I2C.
Только не говори, что используешь софтовые ISP и I2C.
я - нет, а вот TFT использует 12 пинов
Т.е. тебе не хватает пинов, но ты всё равно пытаешься жевать кактус?
Т.е. тебе не хватает пинов
разрешите поинтересоваться, каким образом вы пришли к такому выводу ? экстрасенс ?
#3
Строка 18 и строка 65.
# define DS18B20_PIN 10 // пин подключения DS18B20
теперь по фэн-шую ???
Мне фиолетово.
мне тоже