Почти рабочий код для аналогового датчика давления

Модератор: Alex

Ответить
svetozar161
Сообщения: 72
Зарегистрирован: Пт янв 13, 2017 11:48 pm
Благодарил (а): 6 раз
Поблагодарили: 3 раза

Почти рабочий код для аналогового датчика давления

Сообщение svetozar161 » Вт окт 02, 2018 1:01 am

Здравствуйте друзья. Запустил(почти) датчик давления с алиэкспресса - показывает четко!
2018-10-02_00-53-36.png
2018-10-02_00-53-36.png (202.7 КБ) 5880 просмотров
Вот рабочий код

Код: Выделить всё

//модуль давления воды
#ifdef PRESSURE_FEATURE
#define SENSOR A2//the YELLOW pin of the Sensor is connected with A2 of Arduino/Catduino

char buffer_kPa[10];
char buffer_bar[10];


void pressureInit() {
 
}

void pressureWorks(){
if(cycle20s){
int raw = analogRead(SENSOR);
float voltage = (float) raw * 5.0 / 1024.0;     // voltage at the pin of the Arduino
float pressure_kPa = (voltage - 0.5) / 4.0 * 1100.0 * 10;          // voltage to pressure
float pressure_bar = pressure_kPa * 0.001;    // kPa to bar
timeStamp();
Serial.print(pressure_bar);
Serial.println(" bar");
#ifdef MAJORDOMO_FEATURE
//sendRequestM("Давление котла", pressure_bar);
sendReqSensorFloatM("Давление котла", pressure_bar); 
#endif 
}
}

#endif
В сериале

Код: Выделить всё

2018-10-02 00:33:10 2.21 bar
2018-10-02 00:33:10 Host 192.168.1.100 GET /objects/?object=Давление котла&op=m&m=update&v=? HTTP/1.0
Все работает, единственное почему-то на сервер уходит знак вопроса.
Если расскоментировать строку sendRequestM то вместо знака вопроса уходит целое число до запятой, а хотелось бы дробное.
В чем заковыка?
За это сообщение автора svetozar161 поблагодарил:
serghei (Вт окт 02, 2018 7:33 am)
Рейтинг: 1.16%
Аватара пользователя
ser009
Сообщения: 595
Зарегистрирован: Сб окт 13, 2012 9:55 am
Благодарил (а): 4 раза
Поблагодарили: 43 раза

Re: Почти рабочий код для аналогового датчика давления

Сообщение ser009 » Вт окт 02, 2018 4:24 am

Нужно Float pressure_bar бар вынести из функции void pressureInit() если хочешь использовать её за пределами функции
И нужно посмотреть на функцию sendReqSensorFloatM()
PS: для дальнейшей универсальности рекомендую завести переменные (вместо цифр) с возможностью корректировки с WEBа
Так же при калибровке может пригодится корректировочный коэффициент
serghei
Сообщения: 2575
Зарегистрирован: Пт ноя 06, 2015 10:22 am
Откуда: Кишинёв
Благодарил (а): 303 раза
Поблагодарили: 282 раза

Re: Почти рабочий код для аналогового датчика давления

Сообщение serghei » Вт окт 02, 2018 7:58 am

svetozar161 писал(а):
Вт окт 02, 2018 1:01 am
Если расскоментировать строку sendRequestM то вместо знака вопроса уходит целое число до запятой, а хотелось бы дробное.
В чем заковыка?
Спасибо за решение. Хочу себе такой же поставить , но на 10 килограмм цена пока кусается.
Проблема в способе передачи дробных чисел по HTTP. В дистрибутиве приходится выделять целые и дробные части и посылать отдельно. Есть решение как несколько чисел отдать одним запросом. За основу взял электромодуль и чуть упростил передачу. Одним выстрелом уходит 5 значений - температура и влажность с DHT и 3 значения с BME280. Подставить надо свои значения. В сетапе

Код: Выделить всё

  //============
void sendBMEMajor(char obj[]) {
     sprintf(buf, "GET /objects/?object=%s&op=m&m=update&%s=%.2f&%s=%.2f&%s=%.2f&%s=%.2f&%s=%.2f& HTTP/1.0",
      obj, "Temp", temp, "Pres", pres, "Hum", hum, "TempDHT", dht11_t, "HumDHT", dht11_h);
    #ifdef MAJORDOMO_FEATURE
      sendBuffToMajor();
    #endif
}
void getUIP(char obj[]) {
  sendBMEMajor(obj);
}

  //============
И в лупе

Код: Выделить всё

   if (cycle1m) {
    getUIP("packBME");
    }
Сначала собираем буфер , перечисляем названия переменных и их значения. А главное - в строке Sprintf кракозябры отдают значения с точностью 2 знака после запятой . Их количество должно точно соответствовать количеству названий.
  • %s=%.2f&
Полную версию для Due соберу и выложу в готовых решениях. Там же работают страницы авторегулирования , и уставки данных со страницы. Все это было предоставлено ser009 и alexsis_76, за что им еще рез огромное спасибо!
AMS : ESP32 + NRF24 + 1Wire-I2C мост DS2482 + счетчик DS2423 + сеть MySensors + редактирование страниц в браузере + Upload по воздуху + SPIFFS
svetozar161
Сообщения: 72
Зарегистрирован: Пт янв 13, 2017 11:48 pm
Благодарил (а): 6 раз
Поблагодарили: 3 раза

Re: Почти рабочий код для аналогового датчика давления

Сообщение svetozar161 » Вт окт 02, 2018 10:54 am

ser009 писал(а):
Вт окт 02, 2018 4:24 am
Нужно Float pressure_bar бар вынести из функции void pressureInit() если хочешь использовать её за пределами функции
Так в функции voidpressureInit() пусто. Вы наверное имели ввиду вынести Float из функции voidpressureWorks()?
А где объявлять float? В начальной части arduino_mega_server.ino?
serghei
Сообщения: 2575
Зарегистрирован: Пт ноя 06, 2015 10:22 am
Откуда: Кишинёв
Благодарил (а): 303 раза
Поблагодарили: 282 раза

Re: Почти рабочий код для аналогового датчика давления

Сообщение serghei » Вт окт 02, 2018 12:30 pm

Посмотри как сделано во вкладке далласов. В начале
float current_temp[MAX_DS18B20_SENSORS];
В инит

Код: Выделить всё

    if (current_temp[n] != -127) {
      if (current_temp[n] != 85) {
        timeStamp();
        Serial.print(objSens[n]); Serial.print(F(": ")); Serial.println(current_temp[n]);
         
        tempB_[n] = (current_temp[n] - (int)current_temp[n]) * 100;

        if ((current_temp[n] > -1) && (current_temp[n] < 0)) {
          #ifdef MAJORDOMO_FEATURE
            sendRequestMinusM(objSens[n], "-", (int)current_temp[n], abs(tempB_[n])); 
          #endif          
        } else {
            #ifdef MAJORDOMO_FEATURE
              sendRequestMinusM(objSens[n], "", (int)current_temp[n], abs(tempB_[n])); 
            #endif            
          }  
Там сначала выделяешь дробную часть числа а затем передаешь целую часть и дробную. Но я не вижу смысла , так как можно отдать одним махом. Проверю только поздно вечером.
AMS : ESP32 + NRF24 + 1Wire-I2C мост DS2482 + счетчик DS2423 + сеть MySensors + редактирование страниц в браузере + Upload по воздуху + SPIFFS
Аватара пользователя
ser009
Сообщения: 595
Зарегистрирован: Сб окт 13, 2012 9:55 am
Благодарил (а): 4 раза
Поблагодарили: 43 раза

Re: Почти рабочий код для аналогового датчика давления

Сообщение ser009 » Вт окт 02, 2018 3:52 pm

Я имел ввиду глобальные переменные.
https://arduinomaster.ru/program/global ... #__Arduino
serghei
Сообщения: 2575
Зарегистрирован: Пт ноя 06, 2015 10:22 am
Откуда: Кишинёв
Благодарил (а): 303 раза
Поблагодарили: 282 раза

Re: Почти рабочий код для аналогового датчика давления

Сообщение serghei » Ср окт 03, 2018 1:54 pm

svetozar161 писал(а):
Вт окт 02, 2018 1:01 am
Все работает, единственное почему-то на сервер уходит знак вопроса.
Если расскоментировать строку sendRequestM то вместо знака вопроса уходит целое число до запятой, а хотелось бы дробное.
В чем заковыка?
  • 2018-10-03 13:46:02 Host 192.168.2.108 not connected (GET /objects/?object=Press&op=m&m=update&v=7.60 HTTP/1.0)
    2018-10-03 13:46:22 Host 192.168.2.108 not connected (GET /objects/?object=ncMega02&op=m&m=update&v=1)
    2018-10-03 13:46:22 (duration 1 min 0 sec)2018-10-03 13:46:22 7.65 bar
    2018-10-03 13:46:24 Host 192.168.2.108 not connected (GET /objects/?object=Press&op=m&m=update&v=7.64 HTTP/1.0)
    2018-10-03 13:46:26 2570 (31%)
    2018-10-03 13:46:40 7.84 bar
    2018-10-03 13:46:42 Host 192.168.2.108 not connected (GET /objects/?object=Press&op=m&m=update&v=7.83 HTTP/1.0)
    2018-10-03 13:47:00 7.58 bar
Смотри как сделано в скетче далласов.

Код: Выделить всё

//модуль давления воды
#ifdef PRESSURE_FEATURE
#define SENSOR A2//the YELLOW pin of the Sensor is connected with A2 of Arduino/Catduino

char buffer_kPa[10];
char buffer_bar[10];


void pressureInit() {
 
}

void pressureWorks(){
if(cycle20s){
int raw = analogRead(SENSOR);
float voltage = (float) raw * 5.0 / 1024.0;     // voltage at the pin of the Arduino
float pressure_kPa = (voltage - 0.5) / 4.0 * 1100.0 * 10;          // voltage to pressure
float pressure_bar = pressure_kPa * 0.001;    // kPa to bar

int press_bar = 0;

timeStamp();
Serial.print(pressure_bar);
Serial.println(" bar");

//sendRequestM("Давление котла", pressure_bar);
//sendReqSensorFloatM("Давление котла", pressure_bar);

press_bar = (pressure_bar - (int)pressure_bar) * 100;
        if ((pressure_bar > -1) && (pressure_bar < 0)) {
          #ifdef MAJORDOMO_FEATURE
            sendRequestMinusM("Press", "-", (int)pressure_bar, abs(press_bar)); 
          #endif          
        } else {
            #ifdef MAJORDOMO_FEATURE
              sendRequestMinusM("Press", "", (int)pressure_bar, abs(press_bar)); 
            #endif            
          } 
}
}

#endif
За пример реализации еще раз спасибо.
AMS : ESP32 + NRF24 + 1Wire-I2C мост DS2482 + счетчик DS2423 + сеть MySensors + редактирование страниц в браузере + Upload по воздуху + SPIFFS
svetozar161
Сообщения: 72
Зарегистрирован: Пт янв 13, 2017 11:48 pm
Благодарил (а): 6 раз
Поблагодарили: 3 раза

Re: Почти рабочий код для аналогового датчика давления

Сообщение svetozar161 » Ср окт 03, 2018 7:56 pm

Смотри как сделано в скетче далласов.
Вот спасибо Серега! Все работает!
Теперь осталось понять как привязать GET в мажордомо к объектам. Что-то я подзабыл, да и температура с float тоже не работает((
serghei
Сообщения: 2575
Зарегистрирован: Пт ноя 06, 2015 10:22 am
Откуда: Кишинёв
Благодарил (а): 303 раза
Поблагодарили: 282 раза

Re: Почти рабочий код для аналогового датчика давления

Сообщение serghei » Ср окт 03, 2018 10:21 pm

В седьмой раз говорю - посмотри Тему. Скачай три файла. Power то же пригодится. Установи через импорт класса на странице "Объекты". С давлением по образу и подобию температуры. А с ней-то какие проблемы? Там всё из коробки работает. Покажи вывод температуры в сериале.
Полностью восстановлю комп - проверю сам.
AMS : ESP32 + NRF24 + 1Wire-I2C мост DS2482 + счетчик DS2423 + сеть MySensors + редактирование страниц в браузере + Upload по воздуху + SPIFFS
Ответить