Привет! Добавил в код показания с ds18b20 и ntc, а также вывод показаний на дисплей. Столкнулся со следующей проблемой и не могу её никак победить: показания ntc выводятся в сериал как «0», а на дисплей измеренную температуру. В выводе в сериал менял местами переменные — результат 0. По коду tempDS — ds18b20 выводит и на дисплей и в сериал, tempA0 — ntc данные выводит только на дисплей, в сериал пишет 0.
#include <DHT.h>
#include <CyberLib.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
//#include <EEPROM.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define TempResolution 10
#define DHTPIN 9 // пин для подключения датчика
#define DHTTYPE DHT22
OneWire dt(8); //пин для ds18b20
DallasTemperature sensors(&dt);
LiquidCrystal_I2C lcd(0x27,16,2);
DHT dht(DHTPIN, DHTTYPE);
double A=2.7711019E-03, B=2.5316014E-04, C=3.7501045E-11;//коэффициенты зависящие от типа термистора(из даташита или выводятся эмпирически)
float hum; // влажность
float thum; // температура
float tempDS; //температура DS18B20
float tempA0; //температура NTC
byte d2 = 0; // флаг состояния
byte d3 = 0;
byte d4 = 0;
byte d5 = 0;
byte d6 = 0;
byte d7 = 0;
byte d8 = 0;
byte d9 = 0;
byte d10 = 0;
byte d11 = 0;
byte d12 = 0;
byte d13 = 0;
byte pir1 = 0;
byte knop1 = 0;
byte knop2 = 0;
byte knop3 = 0;
byte descript[5]; // массив
unsigned long time; // время
long timelapsed = 0;
byte MAXMILLIS;
int count=0; // счетчик минут
void setup()
{
Serial.begin(57600);
sensors.begin();
sensors.setResolution(TempResolution);
lcd.init();
lcd.backlight();
lcd.print("DS=");
lcd.setCursor(6,0);
lcd.print(char(223));
lcd.print("C");
lcd.setCursor(9,0);
lcd.print("T=");
lcd.setCursor(14,0);
lcd.print(char(223));
lcd.print("C");
lcd.setCursor(0,1);
lcd.print("A0=");
lcd.setCursor(6,1);
lcd.print(char(223));
lcd.print("C");
lcd.setCursor(9,1);
lcd.print("H=");
lcd.setCursor(15,1);
lcd.print("%");
pinMode(A0, INPUT); //пин для ntc
D2_Out;
D3_Out;
D4_Out;
D5_Out;
D6_Out;
D7_Out;
//D8_Out; //DS18B20
//D9_Out; // DHT
D10_Out;
D11_Out;
D12_Out;
D13_Out;
//sensors.requestTemperatures();
//delay(200);
//tempDS = sensors.getTempCByIndex(0);
//delay(200);
//double tempA0=term1(analogRead(A0));
//delay(350);
//thum = dht.readTemperature(); // считываем температуру, сначала делаем это в сетапе, так как следующее чтение будет только через минуту
//delay(200);
//hum = dht.readHumidity(); // считываем влажность
}
void loop()
{
if (Serial.available()>4) // ждём дескриптор и нужный символ
{
if (Serial.read()=='Y') // проверяем первый символ, если это 'Y', то продолжаем принимать, если нет, то выходим из цикла чтения
{
for (byte i=0; i < 5; i++)
{
descript[i] = Serial.read(); // добавляем символы в массив
}
if((descript[0] =='+') && (descript[1] =='=') && (descript[2] =='Z')) // проверяем дескриптор
{
switch (descript[3])
{
case 'o': // обновление
glavnaia(); // отправка ответа
break;
////////////// Кнопки ///////////////////
case 'A': // d2 вкл
D2_High;
d2 = 1; // флаг вкл
break;
case 'a':
D2_Low;
d2 = 0; // флаг откл
break;
case 'B': // d3
D3_High;
d3 = 1;
break;
case 'b': // d3
D3_Low;
d3 = 0;
break;
case 'C': // d4
D4_High;
d4 = 1;
break;
case 'c': // d4
D4_Low;
d4 = 0;
break;
case 'D': // d5
D5_High;
d5 = 1;
break;
case 'd': // d5
D5_Low;
d5 = 0;
break;
case 'E': // d6
D6_High;
d6 = 1;
break;
case 'e': // d6
D6_Low;
d6 = 0;
break;
case 'F': // d7
D7_High;
d7 = 1;
break;
case 'f': // d7
D7_Low;
d7 = 0;
break;
case 'G': // d8
//D8_High; //DS18B20
//d8 = 1;
break;
case 'g': // d8
//D8_Low;
//d8 = 0;
break;
case 'H': // d9
//D9_High; // DHT
//d9 = 1;
break;
case 'h': // d9
//D9_Low; // DHT
//d9 = 0;
break;
case 'I': // d10
D10_High;
d10 = 1;
break;
case 'i': // d10
D10_Low;
d10 = 0;
break;
case 'J': // d11
D11_High;
d11 = 1;
break;
case 'j': // d11
D11_Low;
d11 = 0;
break;
case 'K': // d12
D12_High;
d12 = 1;
break;
case 'k': // d12
D12_Low;
d12 = 0;
break;
case 'M': // d13
D13_High;
d13 = 1;
break;
case 'm': // d13
D13_Low;
d13 = 0;
break;
default:
glavnaia();
}
}
else // если дескриптор ложный, то очищаем буфер
{
for(byte i=0; i < 255; i++)
{
Serial.read();
}
}
} // конец if (Serial.read()=='Y')
} // конец чтение порта
unsigned long currtime = millis();
if(currtime > time) timelapsed = (currtime - time);
else timelapsed = (MAXMILLIS - time + currtime);
if(timelapsed >= 440) // функция будет выполняться раз в 2 минуты
{
time = currtime;
count++;
if(count == 10) {double tempA0=term1(A0_Read);
if (tempA0<10) {lcd.setCursor(4,1); lcd.print("0"); lcd.setCursor(5,1); lcd.print(tempA0,0);}
else if (tempA0<0) {lcd.setCursor(3,1);}
else {lcd.setCursor(4,1);}
lcd.print(tempA0,0);}
if(count == 20) {sensors.requestTemperatures();
tempDS = sensors.getTempCByIndex(0);
if (tempDS<10) {lcd.setCursor(4,0); lcd.print("0"); lcd.setCursor(5,0); lcd.print(tempDS,0);}
else if (tempDS<0 | tempDS>99) {lcd.setCursor(3,0);}
else {lcd.setCursor(4,0);}
lcd.print(tempDS,0);}
if(count == 30) thum = dht.readTemperature();
lcd.setCursor(12,0);
lcd.print(thum,0);
if(count == 40) hum = dht.readHumidity();
lcd.setCursor(12,1);
lcd.print(hum,0);
if(count > 39) count=0;
glavnaia(); // отправка данных серверу
} // конец включения по температуре
} // конец loop
void glavnaia() // отправка данных серверу
{
// сумма проверяется на сервере, на предмет целостности пакета
int summa = d2 + d3 + d4 + d5 + d6 + d7 + d8 + d9 + d10 + d11 + d12 + d13 + thum + hum + tempA0 + tempDS + knop2;
Serial.print('A');
Serial.print(" ");
Serial.print(summa);
Serial.print(" ");
Serial.print(d2);
Serial.print(" ");
Serial.print(d3);
Serial.print(" ");
Serial.print(d4);
Serial.print(" ");
Serial.print(d5);
Serial.print(" ");
Serial.print(d6);
Serial.print(" ");
Serial.print(d7);
Serial.print(" ");
Serial.print(d8);
Serial.print(" ");
Serial.print(d9);
Serial.print(" ");
Serial.print(d10);
Serial.print(" ");
Serial.print(d11);
Serial.print(" ");
Serial.print(d12);
Serial.print(" ");
Serial.print(d13);
Serial.print(" ");
Serial.print(thum,1);
Serial.print(" ");
Serial.print(hum,1);
Serial.print(" ");
Serial.print(tempA0,1);
Serial.print(" ");
Serial.print(tempDS,1);
Serial.print(" ");
Serial.print(knop2); // не используется
Serial.print(" ");
Serial.print(knop3); // не используется
Serial.print(" ");
Serial.print(0); // не используется
Serial.print(" ");
Serial.print(0); // не используется
Serial.print(" ");
Serial.println('Z');
}
float getR(float V) //функция преобразования значения полученного с аналогового входа в сопротивление терморезистора
{
float result;
result=-9.8*V/(V-1024);
return result;
}
float term1(int AnalogDC)
{
double tempertura;
tempertura = 1 / (A + B * (log(getR(AnalogDC))) + C * (log(getR(AnalogDC)))*(log(getR(AnalogDC)))*(log(getR(AnalogDC))) );
tempertura = tempertura - 273.15;
return tempertura;
}
Вот теперь сижу голову ломаю на всплывающими подсказками. Курсор наводишь на влажность, а всплывает температура. Там как-то границы смещены. Вот пытаюсь их переместить, но никак не получается. Может быть вы мне поможете, а то у меня в css вообще навыков 0.
Привет, это опять я.
Жутко напрягает то, что при нажатии на «темп» не исчезают кнопки, и наоборот. Но… эммм, да простит меня sTD, я поборол сие явление, теперь у меня кнопки не накладываются на температуру. Для этого надо в index.html дописать код. Было:
Привет всем!
Задался целью (да простит меня sTD) поставить знак градуса, чтобы не "'C" было, а "°С" стало.
В index.html, где прописано "'C", стираем символ перед С и, нажав alt, набираем 0176 на цифровой клавиатуре(num lock). В итоге получаем знак "°".
Также методом тыка на ардуино нашёл этот же символ под кодом 223, т.е. чтобы его вывести на дисплей нужно набрать lcd.print(char(223)).
Подскажите пожалуйста, как увеличить количество команд, которые понимает ардуина, например чтобы принимался не один символ для управления, а два (к примеру d1 вкл при поступлении AA, выкл при Aa). Заранее спасибо.
Проверил сегодня — всё работает: и кнопки жмутся и порт не менял. Спс за оперативную помощь и файлы для ББ. Я видел у вас новый проектик появился, и судя по статье он более гибче чем предыдущие.
Порт смените. От серверов это не зависит, arduserver это самостоятельный сервер, который слушает порт 3490 и ему до лампочки, что там параллельно работает.
Перед публикацией статьи я всё проверяю на работоспособность.
Да я и так его из под рута запускаю. Нивкакую через судо тоже error — bind. Что-то мне кажется, что работать эта штука будет только через uhttpd. Ладно, на сегодня наверно пора закончить эксперименты, завтра после работы продолжу. Спокойной ночи.
Если хотите могу сказать, а если хотите самостоятельно дойти, то промолчу.
Есп ненадёжна, поэтому я её избегаю, а вообще конечно можно.
А можно ли всё тоже самое только вместо блютуса использовать ESP8266
Жутко напрягает то, что при нажатии на «темп» не исчезают кнопки, и наоборот. Но… эммм, да простит меня sTD, я поборол сие явление, теперь у меня кнопки не накладываются на температуру. Для этого надо в index.html дописать код. Было:
стало:
…
До какого количества хотите увеличить?
Задался целью (да простит меня sTD) поставить знак градуса, чтобы не "'C" было, а "°С" стало.
В index.html, где прописано "'C", стираем символ перед С и, нажав alt, набираем 0176 на цифровой клавиатуре(num lock). В итоге получаем знак "°".
Также методом тыка на ардуино нашёл этот же символ под кодом 223, т.е. чтобы его вывести на дисплей нужно набрать lcd.print(char(223)).
Перед публикацией статьи я всё проверяю на работоспособность.