Перейти к публикации
iT4iT.CLUB

Василий Залукаев

Пользователи
  • Публикации

    9
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные пользователем Василий Залукаев


  1. 8 часов назад, neon999 сказал:

    Добрый день.

    Тоже заинтересовался этой темой.
    Но с применением связки "ESP-12F WeMos D1 WiFi", "Arduino UNO" и внешнего приложения.
    Рабочее название: «Метеостанция с охранной сигнализацией».
    Результат, в целом, удовлетворительный (в рамках поставленных целей).
    Если интересно, то можно посмотреть здесь:
    https://roamer55.ru/my_projs/arduino_prj/my_ts/005_step/ex_grp_03/ex_03_001.pdf ;
    https://roamer55.ru/main_programming/arduino/arduino_technosphere_000/arduino_technosphere_000_005/

     

    ИМХО... результат прям вообще так себе. Видно что вы только ступаете на путь программирования, но уже учите...

    if (s == "PIN_0") { res = 0; };
     if (s == "PIN_1") { res = 1; };
     if (s == "PIN_2") { res = 2; };

    А знаете ли вы что даже если будет PIN_0, то он все равно будет продолжать перебирать по остальным? В таком контексте было бы правильнее сделать так:

    if (s == "PIN_0") { res = 0; } else {
     if (s == "PIN_1") { res = 1; } else {
     if (s == "PIN_2") { res = 2; }}}

    Потом где вы вообще видели за закрывающей скобкой точку с запятой? Вы в курсе что это в программировании грубо говоря пустая строка?

    if (bla) ;

    В данном случае будет выполнена проверка и по итогу ни чего не сделано.

    Но и в данном случае такая себе идея гонять строки. Откройте для себя switch ... case

    Вычленяем все до "_" + проверяем после него на "W" и "A" и после уже в числовую переменную номер пина. 

    pin_val_get(0, true);
     pin_val_get(1, true);
     pin_val_get(2, true);
     pin_val_get(3, true);
     pin_val_get(4, true);
     pin_val_get(5, true);
     pin_val_get(6, true);
     pin_val_get(7, true);
     pin_val_get(8, true);
     pin_val_get(9, true);
     pin_val_get(10, true);
     pin_val_get(11, true);

    Тоже тема знатная... for еще не проходили?

    if (va < 0) {va = 0; }
    if (va > 1) {va = 1; }

    Зачем этот изврат? Вы в курсе что в половине случаев вы просто сделаете лишние тики?

    if (va <= 0) va = 0 else va = 1; 

    Опять же зачем плодить лишние {}?

    Да и подобные простые вещи тоже так громоздко не пишут давно

    va = (va <= 0) ? 0 : 1;

    Так же можно было и сократить и ваши ифы выше:

    res = (s == "PIN_0") ?  0 :
    (s == "PIN_1") ? 1 :
    (s == "PIN_2") ? 2;

    Вот по теме ссылка первая в гугле - https://wm-school.ru/js/js_if_else.php

    Далее по отдаче данных. Кто же отдает кашу? Как там что разбирать? Или отдавайте json, ну или на худой конец xml. И для того и для другого во всех языках есть драйвер по работе. У вас же каждый раз при изменении символа в строке придется городить проверки и прочее.

    Там еще есть вопрос по переменным... Там тебе и "bool res=" и "int res;" Чего только стоит "String sAct = ""; // действие: GET: или SET:" Вы же заранее знаете что там кроме этого ни чего не будет. "char sAcr[4];" - и уже памяти экономим вагон! Но и это изврат: "bool GetSet;" Да и работать с ним куда проще (в плане тиков на операцию). А это... "const int soundPin = 3;" Серьезно? Вы под номер пина выделяете 16 бит? byte - 8 бит. от 0 до 255 вам будет с головой. Но и это тот еще изврат если это постоянная. "#define soundPin 3" - ВСЕ!!! При компиляции машинного кода эта тройка подставится везде. Вы же define вообще обходите стороной... 

    Блин чувак, ты позиционируешь этот код как обучающий ("пример", "настоятельно рекомендую"). Да тебе еще самому обучаться и обучаться.


  2. Если вдруг кто решит заняться некрофилией как я, то
    BMP085 - https://github.com/adafruit/Adafruit-BMP085-Library/releases/tag/1.0.0

    ESP8266 v.2.4.0 - https://github.com/esp8266/Arduino/releases/tag/2.4.0

    А то пришлось повозится ) Почему не выкладывать целиком проект со всеми зависимостями?

    И не могу побороть SPIFFS Error: mkspiffs not found! Arduino IDE 1.8.5 win10. КОмпилируеется, но ни прошивка не заливается, типа esptool not found, ни SPIFFS не загружается... Есть у кого прям готовая arduino ide под это все дело?


  3. 19 минут назад, post125 сказал:

    эти указания не очевидны. не надо отвечать вопросом на вопрос. и еще раз озвучу, что на Про Мини скетч работал и из беззнаковых получались знаковые без проблем.

    Вопросом на вопрос? Не очевидны? Я тебе типы данных привел, а дальше намекнул. Головой подумать не судьба? И даже на про мини это бы не могло работать, ибо компилятор не дурак чтобы тебе беззнаковую переменную скомпилировать как знаковую. Ну и исполняемый код тоже бы ни как не смог поместить число отрицательное в беззнаковую переменную. По минимуму просто было бы смещение.


  4. 10 часов назад, post125 сказал:

    Скетч работает на ProMini, но не хочет на ESP8266. Насколько я понимаю, проблема в разрядности процессоров. ESP не хочет делать отрицательные "int". Пробовал методом "научного тыка" менять типы переменных, ничего хорошего не получается.

    Ардуино выдает:   X    475.00       Y    -1268.00       Z    3557.00

    ESP выдает: X    593.00       Y    16775842.00       Z    3409.00

    т.е. положительные значения похожи, а с отрицательными беда.

    Работающей библиотеки для датчика QRM3100 не нашел, нарыл только такой код простой записи и чтения регистров датчика. Поскажите, пожалуйста, как его подружить с ESp8266.

     

    А при чем тут разрядность?

    uint8_t output;

    https://ru.wikipedia.org/wiki/Stdint.h

    Типы с точной шириной.

    Не все системы могут поддерживать все эти типы.

    Тип Описание
    int8_t 8-битовый со знаком
    int16_t 16-битовый со знаком
    int32_t 32-битовый со знаком
    int64_t 64-битовый со знаком
    uint8_t 8-битовый без знака
    uint16_t 16-битовый без знака
    uint32_t 32-битовый без знака
    uint64_t 64-битовый без знака

     

    Как ты получишь знаковое число в без знаковую переменную?


  5. 08.04.2019 в 21:40, post125 сказал:

    подскажите, пожалуйста, чтобы собирать данные с датчиков 1 раз в 3 минуты, надо написать "cron::time_3m"? :

    
    void sensors_config() {
      Wire.begin(4, 5);
      cron.add(cron::time_3m, getFullDataF1, true);
      sensors.add(F1_0, device::out, 0x01, "battery1", getPowerF1, true);
    }

    и добавить в файл chron.h ? :

    
    time_3m  = 10800,

    или как-то иначе?

    Именно так. 

    • Like 1
    • Thanks 1

  6. 06.04.2019 в 12:39, Kitsum сказал:

     

    Рассматривался ли вариант со снятием показаний через RS232 ИБП и дальнейшая передача показаний, например, через SNMP по запросу от внешнего хоста? Можно таким образом подвязать различные системы мониторинга, например, Zabbix.

    Рассматривался. Но тут возникла проблема на которую не реагирует даже производитель. Есть ИБП eaton P5 в количестве несколько штук. Так вот еще при USB подключении я словил неприятность - часть ИБП отваливали интерфейсы. Была возможность взять плату расширения (2ethernet) и с ней абсолютна такая же история. Т.е. сам ИБП прекрасно работает, проблем нет, но вот его интерфейс... при чем не все, а часть.

    По сему сейчас все просто - выключили свет - ждем 5 минут - выключаем все. ИБП умеют при появлении питания дергать POWER на выходах, все железо настроено на Power on, и все включается. В старом здании было очень актуально. В новом всего 2 раза за год выключили питание.

    За остальное спасибо. Поиском правда пробежался, но... видимо плохо искал )


  7. Спасибо большое автору. Подскажите пожалуйста как сделать график не по 10 минут, а по часу и скажем не на сутки, а на неделю.

    И еще - небольшая интеграция в мою систему. Начало истории тут http://arduino.ru/forum/proekty/vatchdog-220v-klient-server-win

    Это детектор 220В. С клиентской частью для отключения ПК после отсутствия электричества определенное время (для тех у кого есть проблема с получением данных из ИБП).

    Сейчас по случаю решил переделать все это на ESP.

    Добавлен класс watchdog220

    В нем описана функция "инициализации", запроса состояния линии и функция отправки в Broadcast.

    Из изменений в авторском коде:

    В ESP8266_WS_V2.0_iT4IT.CLUB-220watchdog.ino

    объявляем заголовочный файл:

    #include "watchdog220.h"  // 220WatchDog

    В функции setup() инициализируем наш пин (пин определяется в заголовочном файле. не стал выносить лишнее в авторский код) и тут же добавляем в Cron задание на отправку сообщений раз в секунду:

    /* Инициализация Wathcdog'а*/
      watchdog220.startwatchdog();
    /* Добавление в планировщик заданий по проверке 220В на линии и отправке данных на внешнии ресурсы */
      cron.add(cron::time_1s, [&](){ watchdog220.send2broarcast();  });       // Отправка данных в Broarcast

    По идее в кроне была и проверка линии, но... как-то не срасталось. Вынес функцию просто в loop():

    watchdog220.acCheck();

     

    Из настроек:

    #define WATCHDOGPIN D5 - пин на котором висит датчик
    #define WAITTIME 10000 - время через которое система меняет статус на "отсутствие 220В" (дело в том что частота у нас 50Гц и когда попадешь на полупериод, когда не попадешь...)

    IPAddress broadcastIp(192, 168, 0, 255); - IP широковещательный (последний адрес в подсети (для привычных 255.255.255.0 - это 255))

    int udpPort = 4545;  - порт как ни странно )

     

    Лично я схему почерпнул от сюда: http://arduino.ru/forum/apparatnye-voprosy/nuzhno-otslezhivat-nalichie-220-volt-na-linii#comment-237805

    Из дополнений к ней (в комменте указано) - цифровой пин на котором будем ловить сигнал надо подтянуть к +3В через резистор (4,7кОм)

    Тут программа с исходниками: https://www.dropbox.com/s/4741p3jdc3isqfd/win.7z?dl=0

    Для данной реализации нужна только клиентская часть. 

    Еще раз автору данной метеостанции большое спасибо!

    ESP8266_WS_V2.0_iT4IT.CLUB-220watchdog.7z

×
×
  • Создать...