1 2 3 4 5 6 7 8 9 10 10/10 10,00оценок: 12

Arduino Mega. Контроллер теплицы. Хроники - 4.0

Тема в разделе "Теплицы и парники", создана пользователем Анкор Плюс, 19.05.18.

Статус темы:
Закрыта.
  1. DIYMan
    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889

    DIYMan

    Любопытный рукосуй :)

    DIYMan

    Любопытный рукосуй :)

    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889
    Адрес:
    80 км от Краснодара
    @promavto - Саша, обновил все прошивки, качай. Появилась новая прошивка UniversalSunControllerModule, она пока настроена на отсылку рандомных данных. Получилось, что там все три шлюза можно использовать, в том числе RS-485.

    В прошивке контроллера появилась настройка, актуальная для RS-485:
    Код:
    // использовать или нет выносной модуль с контроллером солнечной установки (прошивка UniversalSunControllerModule)
    #define USE_UNI_SUN_CONTROLLER_MODULE
    #define UNI_SUN_CONTROLLER_UPDATE_INTERVAL 4500 // через сколько миллисекунд запрашивать по RS-485 данные с контроллера солнечной установки
    
    Теперь, как проверять: если будешь проверять через радиоканал, то убедись, что модулю назначен правильный ID контроллера (в прошивке сверху есть комментарии, как это сделать, RS-485 при такой настройке должна быть выключена на модуле). Включаешь _DEBUG и _DEBUG_RANDOM_DATA на модуле (они включены уже, но я на всякий). В прошивке контроллера - включаешь соответствующий дебаг-режим: например, если проверяешь через Lo-Ra - то LORA_DEBUG, если через RS-485 - RS485_DEBUG и т. п.

    Модуль должен раз в 5 секунд отсылать в эфир рандомные данные, в мониторе порта модуля он будет писать, что отсылает. В мониторе порта контроллера - что принимает контроллер. Данные будут вида:
    И с каждым пакетом чиселка будет расти, пока не завернётся на начало. Если всё будет нормально принимать - значит, можно будет внедрять опрос датчиков DS18B20, принцип с сохранением индексов - у нас уже есть ;)

    Если по радиоканалу принимать не будет - проверять RS-485, только _DEBUG на модуле выключи ;)

    Ещё что важное забыл упомянуть: пин А0 на модуле - не занимать, с него при старте читается показание для инициализации генератора псевдослучайных чисел, чтобы немного разносить интервал отсыла данных по времени, во избежание коллизий. Не помню - есть такое на модуле с датчиками, надо бы посмотреть, и если нет - добавлю и там ;)

    Пиши, жду, пока убёг на стройку.
     
    Последнее редактирование: 29.04.19
  2. DIYMan
    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889

    DIYMan

    Любопытный рукосуй :)

    DIYMan

    Любопытный рукосуй :)

    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889
    Адрес:
    80 км от Краснодара
    @evgeny1241, посмотрел код вебморды, для поля ввода показаний датчика для проверки - можно вводить не только цифры, а и макроподстановки "%TO%" и "%TC%", которые заменяются потом на уставки температур открытия и закрытия в настройках.

    В окне добавления/редактирования правила в вебморде даже есть подсказка с заголовком "Специальные значения" - читайте ;)
     
  3. promavto
    Регистрация:
    27.02.16
    Сообщения:
    1.960
    Благодарности:
    1.958

    promavto

    Разработка контроллеров

    promavto

    Разработка контроллеров

    Регистрация:
    27.02.16
    Сообщения:
    1.960
    Благодарности:
    1.958
    Адрес:
    г. Москва, Зеленоград.
    Классно! :victory: Пять датчиков температуры - это то что нужно было (можно еще один добавить на бойлер, но можно его подключить напрямую к контроллеру). Есть еще концевики (два - верх / низ и еще два - восток / запад). Эти нужнее. При достижении крайних положений выдают "0". Для отображения состояния всех концевиков достаточно одного байта.

    Информация к размышлению. У меня есть старая программа расчета текущего положения Солнца, но она почему то выдает информацию с ошибкой (и вообще она мне не нравиться). Искать ошибку не хочется.
    Вообще то эта программа нужна не сейчас, а потом в контроллер теплицы. Подготавливаю тебе инфу.
    Есть другая, вычисляет точно и написана более менее прилично. Неплохо бы ее применить. Но есть маленький нюанс в качестве данных по времени - применяется время по гринвичу, а не местное. У нас в контроллере применяется местное время. Нужна программка вычисляющая время по гринвичу относительно местного. Можно, конечно тупо отнимать местное время с некоторой корректировкой при переходе суток. Но может есть более элегантное решение. Типа получить время в UNIX, отнять местное и преобразовать в гринвическое.

    Это так, информация к размышлению. Предполагаю, что при синхронизации времени из интернета, ты уже получаешь UNIX по гринвичу. :faq:
     
  4. promavto
    Регистрация:
    27.02.16
    Сообщения:
    1.960
    Благодарности:
    1.958

    promavto

    Разработка контроллеров

    promavto

    Разработка контроллеров

    Регистрация:
    27.02.16
    Сообщения:
    1.960
    Благодарности:
    1.958
    Адрес:
    г. Москва, Зеленоград.
    Ээхх! не успеваю писать ответы. А вот А0 на печатке занят, будем думать. :faq:
     
  5. DIYMan
    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889

    DIYMan

    Любопытный рукосуй :)

    DIYMan

    Любопытный рукосуй :)

    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889
    Адрес:
    80 км от Краснодара
    5 байт на флаги в запасе, я писал выше. Концевики будем приделывать позже, сейчас главное - проверить работоспособность гоняния данных от модуля к контроллеру.
    У меня в коде есть возможность переводить в unixtime и обратно. Достаточно отнять/прибавить нужное кол-во секунд - и всё будет.
    Ну можно не А0, а любой свободный аналоговый. Щас вынесу в настройки и перезакачаю ;)
     
  6. DIYMan
    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889

    DIYMan

    Любопытный рукосуй :)

    DIYMan

    Любопытный рукосуй :)

    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889
    Адрес:
    80 км от Краснодара
    Я сейчас пока просмотрю прошивки, которые отсылают данные в контроллер по радиоканалу - надо доработать, чтобы было небольшое расхождение по времени отсыла пакетов. По результатам - отпишусь ;)
     
  7. promavto
    Регистрация:
    27.02.16
    Сообщения:
    1.960
    Благодарности:
    1.958

    promavto

    Разработка контроллеров

    promavto

    Разработка контроллеров

    Регистрация:
    27.02.16
    Сообщения:
    1.960
    Благодарности:
    1.958
    Адрес:
    г. Москва, Зеленоград.
    Придется сбежать с работы:)]:)]
     
  8. DIYMan
    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889

    DIYMan

    Любопытный рукосуй :)

    DIYMan

    Любопытный рукосуй :)

    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889
    Адрес:
    80 км от Краснодара
    @promavto - перезакачал, обновил прошивки трёх модулей: UniversalSensorsModule, UniversalWindRainModule, UniversalSunControllerModule - добавил везде настройки

    Код:
    #define USE_RANDOM_SEED_PIN // закомментировать, если не надо использовать пин для инициализации генератора псевдослучайных чисел
    #define RANDOM_SEED_PIN A0 // какой пин (АНАЛОГОВЫЙ !!!) использовать для инициализации генератора псевдослучайных чисел (пин должен быть висящим в воздухе)
    
    Для того, чтобы после каждого отсыла чуть сдвигать временнЫе интервалы, во избежание, что называется.

    2all: на гитхабе также обновилась прошивка UniversalSensorsModule - там добавлена вышеупомянутая настройка. Думаю, она нам ещё пригодится, когда дойдёт время тестировать на больших нагрузках ;) Несмотря на то, что интервалы отсыла для модулей с датчиками - настраиваются, считаю, подобный временной сдвиг - будет отнюдь не лишним, для радиоканала это может быть полезно. RS-485 - там пофиг, там сам контроллер инициирует запросы, и нет галдежа в эфире ;)

    Всё, убёг следить за строителями, а то накосячат, как пить дать - что-то притихли, это первый признак, что что-то идёт не так :)]:aga:
     
  9. promavto
    Регистрация:
    27.02.16
    Сообщения:
    1.960
    Благодарности:
    1.958

    promavto

    Разработка контроллеров

    promavto

    Разработка контроллеров

    Регистрация:
    27.02.16
    Сообщения:
    1.960
    Благодарности:
    1.958
    Адрес:
    г. Москва, Зеленоград.
    В продолжение темы управления солнечной установкой. Программа вычисления текущего положения Солнца. Необходимые данные: текущее время UT (по Гринвичу) и географические координаты Вашей установки.

    Код:
    /*
        Name:       Azimuth_calculation.ino
        Created:    28.04.2019 17:28:20
        Author:     
    */
    
    //+++++++++++++++++++++++++ Расчет положения солнца по горизонтали и вертикали ++++++++++++++++++++++++++
    
    #define pi    3.14159265358979323846
    #define twopi (2*pi)
    #define rad   (pi/180)
    #define EarthMeanRadius     6371.01      // In km
    #define AstronomicalUnit    149597890      // In km
    
    //Input Variables --------------------- TIME HAS TO BE IN UT (UNIVERSAL TIME)! NO TIME ZONES OR SUMMER TIMES --------
    //My last modifications were probably at this time on this date!
    
    float Longitude = 37.12; //enter longitude here
    float Latitude = 55.59; //enter latitude here
    //--------
    
    //Program Variables
    float ZenithAngle;
    float Azimuth;
    float RightAscension;
    float Declination;
    float Parallax;
    float ElevationAngle;
    
    float ElapsedJulianDays;
    float DecimalHours;
    float EclipticLongitude;
    float EclipticObliquity;
    //--------
    
    
    void setup() {
        Serial.begin(57600);
    
    }
    
    
    void sunPos(int _year, int _month, int _day, int _hour, int _minute)
    {
        //DateTime now = RTC.now();
    
        //int Year = (now.year(), DEC); //year
        //int Month = (now.month(), DEC); //month
        //int Day = (now.day(), DEC); //day
        //float Hours = (now.hour(), DEC); //hour
        //float Minutes = (now.minute(), DEC); //minutes     
    
        int Year = _year; //year
        int Month = _month; //month
        int Day = _day; //day
        float Hours = _hour; //hour
        float Minutes = _minute; //minutes
    
        // Auxiliary variables
        float dY;
        float dX;
    
        // Calculate difference in days between the current Julian Day
        // and JD 2451545.0, which is noon 1 January 2000 Universal Time
    
        float JulianDate;
        long int liAux1;
        long int liAux2;
        // Calculate time of the day in UT decimal hours
        DecimalHours = Hours + (Minutes / 60.0);
        // Calculate current Julian Day
        liAux1 = (Month - 14) / 12;
        liAux2 = (1461 * (Year + 4800 + liAux1)) / 4 + (367 * (Month
            - 2 - 12 * liAux1)) / 12 - (3 * ((Year + 4900
                + liAux1) / 100)) / 4 + Day - 32075;
        JulianDate = (float)(liAux2)-0.5 + DecimalHours / 24.0;
        // Calculate difference between current Julian Day and JD 2451545.0
        ElapsedJulianDays = JulianDate - 2451545.0;
    
        // Calculate ecliptic coordinates (ecliptic longitude and obliquity of the
        // ecliptic in radians but without limiting the angle to be less than 2*Pi
        // (i.e., the result may be greater than 2*Pi)
    
        float MeanLongitude;
        float MeanAnomaly;
        float Omega;
        Omega = 2.1429 - 0.0010394594*ElapsedJulianDays;
        MeanLongitude = 4.8950630 + 0.017202791698*ElapsedJulianDays; // Radians
        MeanAnomaly = 6.2400600 + 0.0172019699*ElapsedJulianDays;
        EclipticLongitude = MeanLongitude + 0.03341607*sin(MeanAnomaly)
            + 0.00034894*sin(2 * MeanAnomaly) - 0.0001134
            - 0.0000203*sin(Omega);
        EclipticObliquity = 0.4090928 - 6.2140e-9*ElapsedJulianDays
            + 0.0000396*cos(Omega);
    
        // Calculate celestial coordinates ( right ascension and declination ) in radians
        // but without limiting the angle to be less than 2*Pi (i.e., the result may be
        // greater than 2*Pi)
    
        float Sin_EclipticLongitude;
        Sin_EclipticLongitude = sin(EclipticLongitude);
        dY = cos(EclipticObliquity) * Sin_EclipticLongitude;
        dX = cos(EclipticLongitude);
        RightAscension = atan2(dY, dX);
        if (RightAscension < 0.0) RightAscension = RightAscension + twopi;
        Declination = asin(sin(EclipticObliquity)*Sin_EclipticLongitude);
    
        // Calculate local coordinates ( azimuth and zenith angle ) in degrees
    
        float GreenwichMeanSiderealTime;
        float LocalMeanSiderealTime;
        float LatitudeInRadians;
        float HourAngle;
        float Cos_Latitude;
        float Sin_Latitude;
        float Cos_HourAngle;
        GreenwichMeanSiderealTime = 6.6974243242 +
            0.0657098283*ElapsedJulianDays
            + DecimalHours;
        LocalMeanSiderealTime = (GreenwichMeanSiderealTime * 15
            + Longitude)*rad;
        HourAngle = LocalMeanSiderealTime - RightAscension;
        LatitudeInRadians = Latitude * rad;
        Cos_Latitude = cos(LatitudeInRadians);
        Sin_Latitude = sin(LatitudeInRadians);
        Cos_HourAngle = cos(HourAngle);
        ZenithAngle = (acos(Cos_Latitude*Cos_HourAngle
            *cos(Declination) + sin(Declination)*Sin_Latitude));
        dY = -sin(HourAngle);
        dX = tan(Declination)*Cos_Latitude - Sin_Latitude * Cos_HourAngle;
        Azimuth = atan2(dY, dX);
        if (Azimuth < 0.0)
            Azimuth = Azimuth + twopi;
        Azimuth = Azimuth / rad;
        // Parallax Correction
        Parallax = (EarthMeanRadius / AstronomicalUnit)
            *sin(ZenithAngle);
        ZenithAngle = (ZenithAngle //Zenith angle is from the top of the visible sky (thanks breaksbassbleeps)
            + Parallax) / rad;
        ElevationAngle = (90 - ZenithAngle); //Retrieve useful elevation angle from Zenith angle
    }
    
    void loop() {
        //DateTime now = RTC.now();
        sunPos(2019,4,29,8,0); //Run sun position calculations// время UT всемирное
        Serial.print("Elevation Angle:  ");
        Serial.println(ElevationAngle); //Print Elevation (Vertical) with no decimal places as accuracy is not really great enough
        Serial.print("Azimuth:  ");
        Serial.println(Azimuth); //Print Azimuth (Horizontal) with no decimal places
     
       // Serial.print("Seconds:  ");
       // Serial.println(now.second(), DEC);
       // печать времени в сериал
        /*Serial.print(now.year(), DEC);
        Serial.print('/');
        Serial.print(now.month(), DEC);
        Serial.print('/');
        Serial.print(now.day(), DEC);
        Serial.print(' ');
        Serial.print(now.hour(), DEC);
        Serial.print(':');
        Serial.print(now.minute(), DEC);
        Serial.print(':');
        Serial.print(now.second(), DEC);
        Serial.println();*/
    
        if (ElevationAngle < 0)
            Serial.println("The sun has set. Get some sleep!");
        delay(1000); //Delay 10 seconds - Values aren't going to have changed anyway as they are currently static variables!
     
    }
    
     
  10. promavto
    Регистрация:
    27.02.16
    Сообщения:
    1.960
    Благодарности:
    1.958

    promavto

    Разработка контроллеров

    promavto

    Разработка контроллеров

    Регистрация:
    27.02.16
    Сообщения:
    1.960
    Благодарности:
    1.958
    Адрес:
    г. Москва, Зеленоград.
    Загрузил файлы. Пакеты передаются. К сожалению на приемной стороне не очень хорошо работает прием пакетов. У меня там стоит SAMD21E18A + LoRa. Принимает 2-3 пакета, затем молчит. При этом светодиод индикации прихода пакета регулярно индицирует прием пакета. Завтра переведу LoRa на Nano 328P

    LoRa Receiver
    packetSize '30
    Received packet '5535503145146147148149150151152153154155015601570000000015680' with RSSI -87
    packetSize '30
    Received packet '55548031581591601611621631641651661671680169017000000000156230' with RSSI -87
    packetSize '30
    Received packet '55548031581591601611621631641651661671680169017000000000156230' with RSSI -87
     
    Последнее редактирование: 29.04.19
  11. DIYMan
    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889

    DIYMan

    Любопытный рукосуй :)

    DIYMan

    Любопытный рукосуй :)

    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889
    Адрес:
    80 км от Краснодара
    Не, ты тестируй на контроллере и модуле под управлением 328-й меги. Нафига тестировать в нерабочем окружении? Я же выложил прошивки, где всё будет показывать в порту при включенных отладочных режимах.

    Смысл твоего тестирования? Ты проверил, что какая-то сторонняя прошивка ловит пакеты, всё. При этом - не проверил, работает ли связка прошивки контроллера с прошивкой модуля. Саш, без обид, но это - не то тестирование, которого я жду. Понимаю, что ты любишь тестовые скетчи, но это - неправильно, надо тестировать на рабочем окружении.
     
  12. DIYMan
    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889

    DIYMan

    Любопытный рукосуй :)

    DIYMan

    Любопытный рукосуй :)

    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889
    Адрес:
    80 км от Краснодара
    Тут кстати вопрос возник: а зачем вообще передавать состояние концевиков с модуля на контроллер? Я вижу, что модуль должен работать сам, посылая данные в эфир, при необходимости из эфира получая измененные настройки, всё. Зачем передавать состояние концевиков - непонятно.

    Сразу скажу: многие вещи буду делать так, как вижу именно я. Например, скажу, что датчики температуры - они будут только для этого модуля, ни в правилах, нигде - их использовать будет нельзя, ибо их не припилишь к системе, от слова "никак". Будут только справочными показаниями на экране, и в настройках модуля. Ну и другие нюансы будут - раз делаю, имею права на свой взгляд на вещи ;)
     
  13. evgeny1241
    Регистрация:
    07.07.16
    Сообщения:
    472
    Благодарности:
    46

    evgeny1241

    Живу здесь

    evgeny1241

    Живу здесь

    Регистрация:
    07.07.16
    Сообщения:
    472
    Благодарности:
    46
    Попробывал на вайфай модуле si7102 что то не видит.
    #define SENSORS { sensor_DS18B20, 3, D5, temp12bit }, { sensor_DS18B20, 4, D6, temp12bit }, {sensor_Si7021, 4 }
    тот же датчик на меге влажность показывает. на wifi nodem cu подключаем к d1 d2 ?
    иногда показания поскакивают. но почти всегда нет данных
     
    Последнее редактирование: 30.04.19
  14. promavto
    Регистрация:
    27.02.16
    Сообщения:
    1.960
    Благодарности:
    1.958

    promavto

    Разработка контроллеров

    promavto

    Разработка контроллеров

    Регистрация:
    27.02.16
    Сообщения:
    1.960
    Благодарности:
    1.958
    Адрес:
    г. Москва, Зеленоград.
    В электронике как и в математике сложно решить пример с многими неизвестными. Сначала я должен проверить работу каждого узла (электронику, настройку пинов, выполнение запрограммированных функций). И только после этого проверить работу всей системы в целом. Ты же свою линейку не подключил сразу и стал смотреть работает или нет. А последовательно подключал все узлы.
    Вот и у меня Nano толком не заработала, а заменил ее на модуль метеостанции - все в порядке.
    Сегодня постараюсь проверить в комплексе.

    Механизм поворота солнечной установки довольно мощный. И если по какой либо ошибке прокрутит установку за разрешенные пределы - беды не миновать.
    У нас эти пределы программа определяет магнитным компасом. С случае сбоя измерений установка не защищена. Установка концевиков сообщает программе, что при срабатывании нужно остановить движение и не важно что показывает компас. И уж на совсем аварийный случай у меня установлены концевики, которые физически рвут цеп питания моторов. Но до этого лучше не доводить. Идеально - это останавливать при достижении некоторых, запрограммированных градусов. Все остальное - защита при нештатных ситуациях.
     
  15. DIYMan
    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889

    DIYMan

    Любопытный рукосуй :)

    DIYMan

    Любопытный рукосуй :)

    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889
    Адрес:
    80 км от Краснодара
    С этим не подскажу, у меня показывало, помнится. Питание датчику какое подаёте? Если китайская плата с Si7021 - там питание надо 5В подавать.
     
Статус темы:
Закрыта.