PID управление отоплением в отдельно взятой каморке.

Тема в разделе "Глядите, что я сделал", создана пользователем ИгорьК, 29 янв 2014.

  1. ИгорьК

    ИгорьК Гуру

    Холода... Холодно. Надо бы потеплее...
    По мотивам Di Halt один к одному повторил его задумку про разгон батареи. Вот что получилось:

    cooler.jpg

    К сожалению, автор идеи не сделал к этому чудесному устройству хоть какое-то управление, и просто подключил конструкцию к пятивольтовому блоку питания. Решил исправить этот недостаток.
    Задание поставил себе такое:
    • управление температурой в комнате, причем по алгоритму PID, а не путем включения/выключения по пороговым температурам. То есть отопление управляется регулированием мощности ШИМ;
    • система сама включается в субботу и воскресенье, остальное время не работает. Значит придется задействовать часы реального времени;
    • отражение работы на ЖК дисплее: температура, режим работы, дата и время;
    • среди недели систему можно включить принудительно;
    • систему можно полностью выключить, но температура и время все равно отображаются.

    Что использовал для проекта:
    1. arduino Nano;
    2. DS18b20;
    3. часы реального времени (RTC);
    4. ЖК индикатор;
    5. кнопка;
    6. UNL2003 для управления нагрузкой, (на фото ниже не показано);
    7. три подтягивающих резистора на 4,7 ком (подтяжка 1Wire и две линии I2C), один на 10 ком - подтяжка 12 ноги.
    Что получилось:
    automat.png

    В принципе, все это можно сделать гораздо проще, и обойтись только Ардуино, датчиком температуры, резистором и UNL.

    Работает это так:


    Кнопкой выбираем один из трех режимов работы: автоматический (на видео отображается "Stop", потому что сейчас рабочий день и система выключена. Ардуинка включит отопление с наступлением субботы), принудительно включено (суббота не наступила, но мы нажали кнопку, результат отображается "Out=...%" - выход ШИМ), принудительно выключено (отображается "Off!").
     
    Последнее редактирование: 6 фев 2014
    Хрюндель, 9xA59kK, Alex19 и 6 другим нравится это.
  2. ИгорьК

    ИгорьК Гуру

    Здесь код. ШИМ получаем на третей ноге Ардуино, куда цепляем весь UNL сразу.
    Что куда цепляется указано в скетче.
    Библиотеку PID берем здесь.
    Библиотеку DS1307.h берем здесь.

    Внимание! У меня здесь кнопка НА РАЗМЫКАНИЕ!

    Код (C):
    #include <OneWire.h>
    #include <PID_v1.h>
    #include <LiquidCrystal.h>

    #include <Wire.h>
    #include <DS1307.h>                         //  http://goo.gl/Qn0sDw
    DS1307 rtc(4, 5);                                // RTC на 4 (SDA) и 5 (SCL) ноге;
    Time  t;                                        // Переменная для чтения в нее времени;
    byte dayOfWeek, dayOfWeekLast;                    // Переменные для запоминания дня недели;
                                                   
                                                    // Инициализируем объект-экран, передаём использованные
                                                    // для подключения контакты в порядке:
                                                    // RS, E, DB5, DB6, DB7, DB8
    LiquidCrystal lcd(6, 7, 8, 9, 10, 11);

                                                    // Установка переменных PID
    double Setpoint = 290;                            // Требуемое показание датчика температуры умножить на 10.
    double Input, Output;
    double aggKp=4, aggKi=0.2, aggKd=1;                // Определяем агрессивные и консервативные параметры PID
    double consKp=1, consKi=0.05, consKd=0.25;
                                                    // Определяем указатели и другие параметры PID
    PID myPID(&Input, &Output, &Setpoint, consKp, consKi, consKd, DIRECT);
    double gap;                                        // Переключатель параметров;

    OneWire  ds(2);                                    // DS18S20 на ноге 2 и все для него
    byte addr[1][8];
    double tempToPID;
    int HighByte, LowByte, TReading, Tc_100, Whole, Fract;
    char buf[20];

    byte modeOfOperation = 0;                        // 0 - автоматический режим, 1 - вкл, 2 - выключен.

    byte switchPointer = 0;                            // Переключатель для switch в loop;
    byte outPercente;                                // Переменная для вывода мощности на вентиляторах;

    void setup()
    {
        rtc.halt(false);
                                                    // Установка часов реального времени, если нужно
        //rtc.setDOW(WEDNESDAY);                        // Установка дня недели;
        //rtc.setTime(12, 0, 0);                    // Установка времени 12:00:00 (24hr формат)
        //rtc.setDate(3, 10, 2010);                    // Установка даты 3 Октябрь, 2010 г.

        lcd.begin(16, 2);                            // Проверим ЖК;
        lcd.print("PID Regulation!");
        lcd.setCursor(0, 1);
        lcd.print("by Jiraffe :-)");

        delay(2000);
        lcd.clear();                                // Протрем стекло ЖК индикатору;
        //Serial.begin(9600);
        ds.search(addr[0]);                            // Найдем и запомним адрес DS18B20;

        myPID.SetMode(AUTOMATIC);                    // Включим PID и установим режим;

        pinMode(12, INPUT);                            // Здесь висит кнопка;
        pinMode(13, OUTPUT);                        // Чтобы видеть нажатие кнопки будем зажигать диод на плате;
    }

    void loop()
    {
        switch (switchPointer)                        // Все делаем в одном операторе;
        {

            /******************************  Измерить температуру  **********************************/
            case 0:                      
            byte i;
            byte data[12];

            ds.reset();                                // Ниже - стандартная процедура чтения датчика
            ds.select(addr[0]);
            ds.write(0x44,1);                        // Старт расчетов датчика;
            delay(850);                                // Нужна задержка для расчета;
            ds.reset();                  
            ds.select(addr[0]);
            ds.write(0xBE);                            // Указание на будущее чтение;

            for ( i = 0; i < 9; i++) {                // Читаем 9 bytes;
                data[i] = ds.read();
            }

            LowByte = data[0];
            HighByte = data[1];
            TReading = (HighByte << 8) + LowByte;
            Tc_100 = (6 * TReading) + TReading / 4;    // Стандартная операция пересчета для DS18b20 (100 * 0.0625) или 6.25;
            tempToPID = (double) Tc_100/100;

            //Serial.print(tempToPID);
            //Serial.print(" = tempToPID:  ");

            lcd.setCursor(0, 0);                    // Печатаем на ЖК;
            lcd.print("      ");
            lcd.setCursor(0, 0);

            lcd.print("T=");
            lcd.print(tempToPID);

            Input = tempToPID*10;                    // Пишем текущую (тепературу х 10) в переменную для передачи в PID;

            switchPointer = 1;                        // Шагаем дальше;

            break;

            /******************************  Считать время и напечатать его  ******************************/

            case 1:

                t = rtc.getTime();                    // Читаем комплект информации о времени;
       
                lcd.setCursor(0, 1);                // Печатаем время на ЖК;
                lcd.print(rtc.getTimeStr());
                lcd.print(" ");
                lcd.print(t.date, DEC);
                lcd.print("/");
                lcd.print(rtc.getMonthStr(FORMAT_SHORT));
                lcd.print(" ");                        // Почистим 14(15) знакоместо;
                dayOfWeek = (byte) t.dow;            // Пишем в переменную значение дня недели для передачи по этапу;

            switchPointer = 2;                        // Идем дальше;

            break;


            /****************************  Проверить нажатие кнопки и режим СТОП ************************************/
            case 2:

            if (digitalRead(12) == 1) {                // Стандартная проверка с антидребезгом, кнопка у меня оказалась на размыкание;
                digitalWrite(13,1);                    // Зажжем диод на плате для наглядности;
                delay(50);                            // Ждем для устранения дребезга;
                if (digitalRead(12) == 1) {            // Проверяем еще раз;
                    modeOfOperation++;                // Следующий режим работы;
                }
                while (digitalRead(12) == 1);        // Ждем отпускания кнопки;
                           
                digitalWrite(13,0);                    // Гасим диод на плате;
                if (modeOfOperation == 3) {            // Если выщли за границы дозволенного режима,
                    modeOfOperation = 0;            // возвращаемся;
                }
            }

            if (modeOfOperation == 2) {
                switchPointer = 0;                    // Если установился/установлен режим СТОП - уходим в начало;
                analogWrite(3,0);                    // PIDу - стоять в нуле!
                lcd.setCursor(7,0);                    // ЖК поставим в известность;
                lcd.print("  Off!  ");
            }

            else switchPointer = 3;                    // Нет режима СТОП - идем дальше;

            break;

            /***************************  Сбросить флаг принудительной работы ********************************/
            case 3:                                    // Если в средине недели система была принудительно запущена,
                                                    // или в выходные это произошло случайно, она перейдет в автоматический режим
                                                    // с началом субботы или понедельника;
                if ((dayOfWeek == 6 && dayOfWeekLast == 5) || (dayOfWeek == 1 && dayOfWeekLast == 7)  ) {
                    modeOfOperation = 0;
                }
                dayOfWeekLast = dayOfWeek;            // Запомним прошлое значение дня;
                switchPointer = 4;                    // Шагаем дальше;

            break;

            /*************************** Проверить день недели и решить что делать ************************/
            case 4:
                if (dayOfWeek == 6 || dayOfWeek == 7 || modeOfOperation == 1) {
                    switchPointer = 6;
                }
                else switchPointer = 5;

            break;

            /************************ Остановить PID ******************************************************/
            case 5:
                analogWrite(3,0);                    // Останавливаем ШИМ;
                lcd.setCursor(7,0);                    // Извещаем об этом ЖК;
                lcd.print("  Stop  ");
                switchPointer = 0;
            break;

            /************************** Запустить PID управление ******************************************/
            case 6:
                gap = abs(Setpoint-Input);            // Разность с желаемой температурой (умноженная на 10, т.е. 0.5 градуса);
                if(gap<5) {                            // Мы недалеко и используем консервативные параметры;
                    myPID.SetTunings(consKp, consKi, consKd);
                }

                else {                                // Мы далеко, используем агрессивные параметры;
                    myPID.SetTunings(aggKp, aggKi, aggKd);
                }

                myPID.Compute();
                analogWrite(3,Output);      // Здесь и висит блок вентиляторов!

                //Serial.print(Output);
                //Serial.println(" = Output");

                outPercente = (byte)(Output/255*100);// Считаем в процентах мощность вывода ШИМ;

                lcd.setCursor(8,0);                    // Печатаем на ЖК;
                lcd.print("Out=    ");
                lcd.setCursor(12,0);
                lcd.print(outPercente);
                lcd.print("%");

                switchPointer = 0;                    // Уходим в начало цикла;
            break;

            default:
                switchPointer = 0;
            break;
        }


    }
     
     
    Последнее редактирование: 20 сен 2015
    Alex19 и Desert Ops нравится это.
  3. ИгорьК

    ИгорьК Гуру

    Теперь скетч попроще для Ардуино, датчика и UNL2003 на третей цифровой ноге. Датчик присоединяется ко второй цифровой ноге.
    Эта конструкция не умеет ничего, кроме как поддерживать установленную температуру. Зато минимальные затраты.
    Код (C):
    #include <OneWire.h>
    #include <PID_v1.h>

                                                    // Опроеделяем переменные

    double Setpoint = 250;                            // Требуемое показание датчика температуры умноженное на 10;
    double Input, Output;
                                                    // Определяем агрессивные и консервативные параметры PID управления
    double aggKp=4, aggKi=0.2, aggKd=1;
    double consKp=1, consKi=0.05, consKd=0.25;

                                                    // Определяем начальные параметры согласно библиотеке
    PID myPID(&Input, &Output, &Setpoint, consKp, consKi, consKd, DIRECT);

    OneWire  ds(2);                                    // DS18S20 Датчик на ноге 2
    byte addr[1][8];                                // Адрес датчика, массив 1х8
    double tempToPID;                                // Переменная для отправки температуры с датчика на PID управление
    int HighByte, LowByte, TReading;                // Переменные для работы DS18S20: старший и младший байты и итоговая температура
    char buf[20];

    void setup(void)
    {
        Serial.begin(9600);
        ds.search(addr[0]);                            // Определим адрес нашего единственного датчика
        myPID.SetMode(AUTOMATIC);                    // Включаем PID
    }

    void loop(void)
    {
        byte i;
        byte data[12];

        ds.reset();
        ds.select(addr[0]);
        ds.write(0x44,1);          
        delay(850);                  
        ds.reset();                  
        ds.select(addr[0]);
        ds.write(0xBE);              

        for ( i = 0; i < 9; i++) {  
            data[i] = ds.read();
        }

        LowByte = data[0];
        HighByte = data[1];
        TReading = (HighByte << 8) + LowByte;

        // For ds18b20
        int Tc_100 = (6 * TReading) + TReading / 4;
        tempToPID = (double) Tc_100/100;

        //Serial.print(tempToPID);
        //Serial.println(" = tempToPID:  ");

        Input = (double)tempToPID*10;  
        double gap = abs(Setpoint-Input);          
        if(gap<5)
        {                                          
            myPID.SetTunings(consKp, consKi, consKd);
        }
        else
        {
            myPID.SetTunings(aggKp, aggKi, aggKd);
        }

        myPID.Compute();
        analogWrite(3,Output);                            // А к этой ноге и присоединен блок вентиляторов!

        //Serial.print(Output);
        //Serial.println(" = Output");
             
             
             
    }
     
    Последнее редактирование: 11 май 2017
    Alex19 и Desert Ops нравится это.
  4. ИгорьК

    ИгорьК Гуру

    Продолжение. Оформился регулятор у меня вот в таком виде:



    Однако выявились две проблемы:
    - вентиляторы пищат, похоже от частоты ШИМа, который устанавливает Ардуино по умолчанию.
    - при выходе ШИМ менее 10% вентиляторы не запускаются - не хватает мощности.
    Вторая проблема легко решается программным отключением выхода когда ШИМ менее 10% заполения.

    А по первой проблеме исследования продолжились в двух направлениях.
    1. установить RC-фильтр. Но ток достигает силы 0.9 ампера, и фильтр потребует и мощного резистора и значительной емкости.
    2. Увеличить частоту ШИМ.
    Естественно нестандартными для Ардуино, но стандартными для AVR методами.

    Результат на видео. Управление ШИМ осуществляется путем прямой записи в регистры микроконтроллера. Частота - 250 кгц. Подключил светодиод к ноге 3 для наглядности работы. Код в следующем посте.

     
    Последнее редактирование: 5 фев 2014
  5. ИгорьК

    ИгорьК Гуру

    Код, частота ШИМ на D3 устанавливается 250 кгц.
    Код большой (из-за пояснений!), поэтому выдрал изменения.
    Полностью код в приложении.
    Код (C):
    #include ...

    .................

    void setup()
    {

        // Инициализация ножки D3, где сидит вывод ШИМ: Bit3=Out

        DDRD|= (1<<DDD3);


        // Инициализация таймера 2
        // Источник счета: системная шина
        // Частота: 250,000 kHz
        // Режим: ШИМ с коррекцией фазы, счет до 255
        // Выход D3: Неинвертированный ШИМ
        // Период таймера: 2,04 ms
        // Начальный выход(s):
        // Период D3 : 2,04 ms Ширина импульса: 0 us


        ASSR=(0<<EXCLK) | (0<<AS2);
        TCCR2A=(0<<COM2A1) | (0<<COM2A0) | (1<<COM2B1) | (0<<COM2B0) | (0<<WGM21) | (1<<WGM20);
        TCCR2B=(0<<WGM22) | (1<<CS22) | (0<<CS21) | (0<<CS20);
        TCNT2=0x00;
        OCR2A=0x00;
        OCR2B=0x00;

       ..............

    }

    void loop()
    {
        switch (switchPointer)                        // Все делаем в одном операторе;
        {

            /******************************  Измерить температуру  **********************************/
            case 0:                              
            .....
            switchPointer = 1;                        // Шагаем дальше;

            break;

            /******************************  Считать время и напечатать его  ******************************/

            case 1:

         ...
            switchPointer = 2;                        // Идем дальше;

            break;


            /****************************  Проверить нажатие кнопки и режим СТОП ************************************/
            case 2:

            if (digitalRead(12) == 1) {                // Стандартная проверка с антидребезгом;
                digitalWrite(13,1);                    // Зажжем диод на плате для наглядности;
                delay(50);                            // Ждем для устранения дребезга;
                if (digitalRead(12) == 1) {            // Проверяем еще раз;
                    modeOfOperation++;                // Следующий режим работы;
                    if (dayOfWeek>5 && modeOfOperation == 1) {    // Если суббота или воскресенье
                        modeOfOperation=2;            // Пропускаем режим принудительного запуска;
                    }
             
                }
                while (digitalRead(12) == 1);        // Ждем отпускания кнопки;
                                 
                digitalWrite(13,0);                    // Гасим диод на плате;
                if (modeOfOperation == 3) {            // Если выщли за границы дозволенного режима,
                    modeOfOperation = 0;            // возвращаемся;
                }
            }

            if (modeOfOperation == 2) {
                switchPointer = 0;                    // Если установился/установлен режим СТОП - уходим в начало;
                //analogWrite(3,0);                    // PIDу - стоять в нуле!
                OCR2B=0x00;                            // Пишем ноль в регистр сравнения Таймера - останавливаем ШИМ
         
                lcd.setCursor(7,0);                    // ЖК поставим в известность;
                lcd.print("  Off!  ");
            }
     
            else switchPointer = 3;                    // Нет режима СТОП - идем дальше;

            break;

            /***************************  Сбросить флаг принудительной работы ********************************/
            case 3:                                ...
            break;

            /*************************** Проверить день недели и решить что делать ************************/
            case 4:
             ...
     
            break;

            /************************ Остановить PID ******************************************************/
            case 5:
                //analogWrite(3,0);                    // Останавливаем ШИМ;
                OCR2B=0x00;                            // Пишем ноль в регистр сравнения Таймера - останавливаем ШИМ
         
                lcd.setCursor(7,0);                    // Извещаем об этом ЖК;
                lcd.print("  Stop  ");
                switchPointer = 0;
            break;

            /************************** Запустить PID управление ******************************************/
            case 6:
                gap = abs(Setpoint-Input);            // Разность с желаемой температурой (умноженная на 10, т.е. 0.5 градуса);
                if(gap<5) {                            // Мы недалеко и используем консервативные параметры;
                    myPID.SetTunings(consKp, consKi, consKd);
                }
         
                else {                                // Мы далеко, используем агрессивные параметры;
                    myPID.SetTunings(aggKp, aggKi, aggKd);
                }

                myPID.Compute();
                //analogWrite(3,Output);            // Выход ШИМ
         
                if (Output>25) {                    // Чтобы лишний раз не дергать моторки, здесь - 10% мощности
                    OCR2B=Output;                    // Пишем число в регистр сравнения таймера - заполение ШИМ
                    }
                else {
                    OCR2B=0;
                }
         
         
                //Serial.print(Output);
                //Serial.println(" = Output");
         
                outPercente = (byte)(Output/255*100);// Считаем в процентах мощность вывода ШИМ;

                lcd.setCursor(8,0);                    // Печатаем на ЖК;
             
                lcd.print("Out=    ");          // Чистим знакоместа при переходе выхода от 100 до < 10
           
                lcd.setCursor(12,0);
                lcd.print(outPercente);
                lcd.print("%");

                switchPointer = 0;                    // Уходим в начало цикла;
            break;

            default:
                switchPointer = 0;
            break;
        }
    }
     
     

    Вложения:

    Последнее редактирование: 5 фев 2014
    Megakoteyka нравится это.
  6. Megakoteyka

    Megakoteyka Оракул Модератор

    Вот все бы так код оформляли - одно удовольствие читать :)
    Я бы посоветовал еще в switch вместо 0, 1, 2... завести константы с понятными названиями - оформить их в #define либо (еще лучше) как enum.
     
    ИгорьК нравится это.
  7. ИгорьК

    ИгорьК Гуру

    Это будет третья версия. В коде есть существенный недостаток. При измерении температуры программа тормозится на 850 мс. Это объективно. Датчику нужно время для подсчета температуры. В принципе, можно стоять и ждать. На работоспособность не влияет, но порождает рваный ритм вывода секунд на ЖК. Мне это заметно. Хотя может лишь потому, что я знаю об этом :)
     
  8. Megakoteyka

    Megakoteyka Оракул Модератор

    Все правильно, 850мс - это довольно много. Даже задержка в 100-200мс чаще всего мешает комфортной работе. Надо это дело обходить :)
     
  9. ИгорьК

    ИгорьК Гуру

    Очень холодно было. Скорость важнее качества в тот момент оказалась :)
     
  10. ИгорьК

    ИгорьК Гуру

    Последняя версия:
    1. Устранено торможение при задержке измерения температуры. Теперь часы на ЖК тикают ровно, а кнопка реагирует на нажатие очень живенько.
    2. При отражении мощности выхода очистка дисплея не заставляет цифры мерцать.
    3. Как рекомендовал Megakoteyka, использована функция enum.
    4. Ссылки на библиотеки RTC и PID в программе.
    =====================================
    5. В файле со словом Summer другое оформление режима принудительной остановки.
    На экране остаются только часы и температура, режим принудительной остановки отражается маленьким ключиком. Думаю летом так будет симпатичнее.
     

    Вложения:

    Последнее редактирование: 6 фев 2014
    Nikolaih нравится это.
  11. ИгорьК

    ИгорьК Гуру

    Ну и самая самая последняя версия v4.
    В ней реализовано следующее:
    1. регулятор запоминает в EEPROM текущее значение режима работы и желаемой температуры, важно, если на время выключилось электричество;
    2. при старте все это нам показывается;
    3. желаемая температура от 22 до 29,5 теперь устанавливается нашей единственной кнопочкой с интервалом 0,5 градуса, а не программно.
    4. частота ШИМ теперь (а чего стесняться - гулять так гулять) - все 16000,000 kHz.
    И как это работает:


    Внимание! Стоит кнопка на размыкание (не было другой под рукой). Это значит, что 12 нога притянута к + резистором на 10 ком, но кнопка все время держит ногу в нуле и лишь при нажимании нога получает единицу. Обычные кнопки - на замыкание. Соответственно, не забывайте править код опроса кнопки в зависимости от ситуации.
    То есть для обычной кнопки все if (digitalRead(12) == 1)... меняем на if (digitalRead(12) == 0)...

    21.02.2014. Добавил маленькую деталь. Во время работы каждые пять секунд последовательно показывается то мощность выхода то желаемая температура. Потому как иногда надо знать что там коробка пытается достичь.
    Файл pid2.zip.
    Библиотека для часов здесь.
     

    Вложения:

    Последнее редактирование: 24 июл 2014
    Хрюндель, Securbond, SONIC300077 и 5 другим нравится это.
  12. Nikolaih

    Nikolaih Нуб

    Класс! Четко, понятно,красиво. Есть небольшой вопрос : как подбирали Kp ,Ki,Kd в PID?
     
  13. ИгорьК

    ИгорьК Гуру

    Точно уже не помню. Если нужно хорошо PID настроить, лучше всего поискать на форуме авиамоделистов инструкции - у них это хлеб. http://forum.rcdesign.ru/ Инструкции там находил.
     
  14. ИгорьК

    ИгорьК Гуру

    И еще здесь, у себя как-то собирал.
     
    Последнее редактирование: 26 окт 2015
  15. SONIC300077

    SONIC300077 Нуб

    Здравствуйте! уже пару часов мучаюсь, не компилируется уже все что знал перепробовал, вроде все устранял, сейчас в тупике вот что пишет ! pid.png
     
  16. imMan

    imMan Нерд

    Вы хоть код покажите
     
  17. ИгорьК

    ИгорьК Гуру

    Сложно сказать. Ради интереса попробуйте самый первый код. Ещё может быть дело в библиотеке часов, возможно у Вас другая. Как видите, жалоб на коипиляцию ещё не было, значит проблема у Вас на компьютере. Проверьте что за плата у Вас выставлена, в IDE.
     
  18. SONIC300077

    SONIC300077 Нуб

    Первый вроде компилится но еще жалуется, как вы сказали на библиотеку часов, А вы какой версией пользуетесь ARDUINO IDE?? может дадите свои рабочие версии библиотек !


    Код (C++):

    D:\Arduino\libraries\DS1307\DS1307.cpp: In member function 'char* DS1307::getTimeStr(uint8_t)':

    D:\Arduino\libraries\DS1307\DS1307.cpp:102:16: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

      char *output= "xxxxxxxx";

                    ^

    D:\Arduino\libraries\DS1307\DS1307.cpp: In member function 'char* DS1307::getDateStr(uint8_t, uint8_t, char)':

    D:\Arduino\libraries\DS1307\DS1307.cpp:133:16: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

      char *output= "xxxxxxxxxx";

                    ^

    D:\Arduino\libraries\DS1307\DS1307.cpp: In member function 'char* DS1307::getDOWStr(uint8_t)':

    D:\Arduino\libraries\DS1307\DS1307.cpp:248:16: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

      char *output= "xxxxxxxxx";

                    ^

    D:\Arduino\libraries\DS1307\DS1307.cpp:254:10: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

        output="Monday";

              ^

    D:\Arduino\libraries\DS1307\DS1307.cpp:257:10: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

        output="Tuesday";

              ^

    D:\Arduino\libraries\DS1307\DS1307.cpp:260:10: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

        output="Wednesday";

              ^

    D:\Arduino\libraries\DS1307\DS1307.cpp:263:10: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

        output="Thursday";

              ^

    D:\Arduino\libraries\DS1307\DS1307.cpp:266:10: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

        output="Friday";

              ^

    D:\Arduino\libraries\DS1307\DS1307.cpp:269:10: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

        output="Saturday";

              ^

    D:\Arduino\libraries\DS1307\DS1307.cpp:272:10: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

        output="Sunday";

              ^

    D:\Arduino\libraries\DS1307\DS1307.cpp: In member function 'char* DS1307::getMonthStr(uint8_t)':

    D:\Arduino\libraries\DS1307\DS1307.cpp:282:16: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

      char *output= "xxxxxxxxx";

                    ^

    D:\Arduino\libraries\DS1307\DS1307.cpp:288:10: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

        output="January";

              ^

    D:\Arduino\libraries\DS1307\DS1307.cpp:291:10: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

        output="February";

              ^

    D:\Arduino\libraries\DS1307\DS1307.cpp:294:10: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

        output="March";

              ^

    D:\Arduino\libraries\DS1307\DS1307.cpp:297:10: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

        output="April";

              ^

    D:\Arduino\libraries\DS1307\DS1307.cpp:300:10: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

        output="May";

              ^

    D:\Arduino\libraries\DS1307\DS1307.cpp:303:10: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

        output="June";

              ^

    D:\Arduino\libraries\DS1307\DS1307.cpp:306:10: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

        output="July";

              ^

    D:\Arduino\libraries\DS1307\DS1307.cpp:309:10: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

        output="August";

              ^

    D:\Arduino\libraries\DS1307\DS1307.cpp:312:10: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

        output="September";

              ^

    D:\Arduino\libraries\DS1307\DS1307.cpp:315:10: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

        output="October";

              ^

    D:\Arduino\libraries\DS1307\DS1307.cpp:318:10: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

        output="November";

              ^

    D:\Arduino\libraries\DS1307\DS1307.cpp:321:10: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

        output="December";

              ^


    Скетч использует 11 084 байт (36%) памяти устройства. Всего доступно 30 720 байт.
    Глобальные переменные используют 670 байт (32%) динамической памяти, оставляя 1 378 байт для локальных переменных. Максимум: 2 048 байт.
    Код (C++):
     
     
    Последнее редактирование: 27 янв 2016
  19. ИгорьК

    ИгорьК Гуру

    Вот, только что:
    222.png

    Во втором посте ссылка на библиотеки.
     
    Последнее редактирование: 28 янв 2016
  20. SONIC300077

    SONIC300077 Нуб

    все библиотеки перепробовал! проблема ушла таким образом, удалил всю шапку в коде
    /***********************************************************

    All works! Добавлен попеременный показ через 5 секунд смены
    мощности выхода необходимой температурой.

    ***********************************************************/
    pid1.png

    Все заработало!!)) скеч залил на плату, буду проверять на работоспособность,
    Да еще один вопрос можно этот код на arduino UNO поставить?
    И большое вам спасибо!!!