0
или всему виной А0 в названии переменной?
0
На дисплей же выводит температуру, а в сериал пишет 0
0
тип double во всём виноват или. Лучше подскажите, я тут немного не местный в СИ.
0
Ошибка у Вас здесь:
if(count == 10) {double tempA0=term1(A0_Read);

Если хотите могу сказать, а если хотите самостоятельно дойти, то промолчу.
  • avatar
  • stD
0
Привет! Добавил в код показания с 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;
}
0
Спасибо.
Есп ненадёжна, поэтому я её избегаю, а вообще конечно можно.
  • avatar
  • stD
0
Как всегда отличная статья.
А можно ли всё тоже самое только вместо блютуса использовать ESP8266
  • avatar
  • shnyak
0
Не могу верхнюю границу области, в которую надо мышку навести, чтобы всплыла подсказка, вниз опустить.
0
Вот теперь сижу голову ломаю на всплывающими подсказками. Курсор наводишь на влажность, а всплывает температура. Там как-то границы смещены. Вот пытаюсь их переместить, но никак не получается. Может быть вы мне поможете, а то у меня в css вообще навыков 0.
0
Привет, это опять я.
Жутко напрягает то, что при нажатии на «темп» не исчезают кнопки, и наоборот. Но… эммм, да простит меня sTD, я поборол сие явление, теперь у меня кнопки не накладываются на температуру. Для этого надо в index.html дописать код. Было:

$(".knp1").click(function(){ /* показать панель "кнопки"  */
	$(".panel1").toggle();
});

$(".knp3").click(function(){ /* показать панель "темп"  */
	$(".panel3").toggle();
});


стало:

$(".knp1").click(function(){ /* показать панель "кнопки"  */
	$(".panel1").toggle();
	$(".panel3").hide();
});

$(".knp3").click(function(){ /* показать панель "темп"  */
	$(".panel1").hide();
	$(".panel3").toggle();
});
0
И веб-часть тоже надо изменять.

До какого количества хотите увеличить?
  • avatar
  • stD
0
Привет всем!
Задался целью (да простит меня sTD) поставить знак градуса, чтобы не "'C" было, а "°С" стало.
В index.html, где прописано "'C", стираем символ перед С и, нажав alt, набираем 0176 на цифровой клавиатуре(num lock). В итоге получаем знак "°".
Также методом тыка на ардуино нашёл этот же символ под кодом 223, т.е. чтобы его вывести на дисплей нужно набрать lcd.print(char(223)).
0
Переписать программу.
  • avatar
  • stD
0
Подскажите пожалуйста, как увеличить количество команд, которые понимает ардуина, например чтобы принимался не один символ для управления, а два (к примеру d1 вкл при поступлении AA, выкл при Aa). Заранее спасибо.
  • avatar
  • slava
0
Нет, скорее всего заработало сразу после замены первых файлов для ББ, когда создавалось 2 процесса. Видимо поздно уже было — не внимательность моя.
0
У Вас торрент случайно не работал вчера?
  • avatar
  • stD
0
Проверил сегодня — всё работает: и кнопки жмутся и порт не менял. Спс за оперативную помощь и файлы для ББ. Я видел у вас новый проектик появился, и судя по статье он более гибче чем предыдущие.
0
Порт смените. От серверов это не зависит, arduserver это самостоятельный сервер, который слушает порт 3490 и ему до лампочки, что там параллельно работает.
Перед публикацией статьи я всё проверяю на работоспособность.
  • avatar
  • stD
0
Да я и так его из под рута запускаю. Нивкакую через судо тоже error — bind. Что-то мне кажется, что работать эта штука будет только через uhttpd. Ладно, на сегодня наверно пора закончить эксперименты, завтра после работы продолжу. Спокойной ночи.