Часы с функцией включения ночного света.

Тема в разделе "Глядите, что я сделал", создана пользователем Securbond, 27 янв 2016.

  1. Securbond

    Securbond Гуру

    Наконец то руки дошли до ардуинки. Давно уже пришло куча прикольных деталюх из Китая, но сесть и понять как все это работает не было времени. Просто так мигать диодом то же не интересно, по этому пришла идея сделать в коридоре часы, которые отображают время, дату, температуру в квартире и что бы как можно полноценнее задействовать контроллер еще и включать ночную подсветку что бы не сбивать ночью углы, топая к фаянсовому другу.
    Что нужно:
    1. отображать время и дату.
    2. отображать температуру воздуха.
    3. включать светодиодную ленту по движению. (пока что вместо ленты стоит контрольный диод)
    4. реализовать ручной и автоматический режимы включения света.
    5. заставить это все работать на attiny85 (сейчас на proMini)
    Отказался от пункта выше Т.к появились новые идеи и не хватит пинов.
    6. Сделать все красиво и эстетично.
    Новые хотелки.
    1. Прикрутить модуль Ethernet и реализовать передачу данных и управление через OpenHab.
    За два часа работы было реализовано первые 3 пункта вот что вышло.
    IMG_8832.JPG IMG_8833.JPG IMG_8834.JPG IMG_8835.JPG

    ну и собственно код (собрано из разных источников и добавлено немного своих мыслей).
    Код (C++):
    #include <Wire.h>
    #include <OneWire.h>
    #include <DallasTemperature.h>
    #include <Time.h>
    #include <DS1307RTC.h>
    #include <LiquidCrystal_I2C.h>
    #define ctrlPin 9 //пин включения MOSFET транзистора

    LiquidCrystal_I2C lcd(0x27,16,2);

    int pirPin = 12; //Пин датчика движения
    int light = 0;//Переменная состояния света вкл/выкл

    // инициализация порта для подключения датчика температуры и модуля часов
    #define ONE_WIRE_BUS 10
    OneWire oneWire(ONE_WIRE_BUS);
    // Pass our oneWire reference to Dallas Temperature.
    DallasTemperature sensors(&oneWire);

    void setup() {
       Serial.begin(9600);
    pinMode(pirPin, INPUT); //пин датчика движения устанавливаем как вход
    pinMode(ctrlPin, OUTPUT);// пин управления MOSFET транзистором устанавливаем как выход
    light =0;
      sensors.begin();//Инициализируем датчик температуры
      lcd.init(); // Инициализируем экран
      lcd.backlight(); //Включаем подсветку
    }
    void loop() {

    sensors.requestTemperatures();
    float TempDS=(sensors.getTempCByIndex(0));
      lcd.setCursor(0,0);//Устанавливаем курсор в начало первой строки
      lcd.print("t: ");
      lcd.print( TempDS);//Выводим  температуру
      lcd.print(" C");
      chasi();
      ctrlLed();

    }

            ///////////////////////////////// ФУНКЦИИ /////////////////////////////////////

    // функция плавного включения светодиодной ленты
    void ctrlLed(){
    if(digitalRead(pirPin) == HIGH)
    { if(light ==0)
       { for(int i=0; i<=150; i++)
          {
            analogWrite(ctrlPin, i);
            delay(10);
          }
          light =1;
          }
    }
      else {
        if (light == 1)
        {
          for(int i=150; i>=0; i--)
          {
            analogWrite(ctrlPin, i);
            delay(10);
          }
          light = 0;
        }
      }
    }

    // функция получения и вывода времени на экран LCD
      void chasi(){
         tmElements_t tm;
    if (RTC.read(tm)) {
        lcd.setCursor(0,1);
        print2digits(tm.Hour);
        lcd.print(':');
        print2digits(tm.Minute);
       // lcd.print(':'); //Секунды убрал за ненадобностью
    //   print2digits(tm.Second);
    lcd.setCursor(6,1);
        //Serial.print(", Date (D/M/Y) = ");
        print2digits(tm.Day);
        lcd.print('.');
        print2digits(tm.Month);
        lcd.print('.');
        lcd.print(tmYearToCalendar(tm.Year));
          } else {
          lcd.setCursor(0,1);
         lcd.print("DS1307 read error!");  
        }
    }
    //добавление "0" к цифрам < 10
    void print2digits(int number) {
      if (number >= 0 && number < 10) {
        lcd.print('0');
      }
      lcd.print(number);
    }

    Прошу не пинать сильно. только начинаю разбираться и вообще первый раз что то публикую для людей))
    P/S: Продолжение следует .......
     
    Последнее редактирование: 12 фев 2016
    ИгорьК и Vladis_a нравится это.
  2. Securbond

    Securbond Гуру

    А это корпус будущих часов)))
    image.jpeg

    В глазике планируется Pir датчик .
     

    Вложения:

    • image.jpeg
      image.jpeg
      Размер файла:
      584,2 КБ
      Просмотров:
      665
    Последнее редактирование: 29 янв 2016
    dwk26111974 нравится это.
  3. ИгорьК

    ИгорьК Гуру

    Жуть.... :)
     
  4. Securbond

    Securbond Гуру

    Зато в черепе много места ))) да же экран встанет
    IMG_8836.JPG
    придется немного обработать напильником))
     
  5. Securbond

    Securbond Гуру

    Добавил две кнопки . первая выбираем режим, вторая включение, выключение в ручном режиме.
    Вот что получилось.
    Код (C++):
    #include <Wire.h>
    #include <OneWire.h>
    #include <DallasTemperature.h>
    #include <Time.h>
    #include <DS1307RTC.h>
    #include <LiquidCrystal_I2C.h>
    #define ctrlPin 9 //пин включения MOSFET транзистора
    int regim; //переменная для выбора режима освещения (ручное/автоматическое)
    LiquidCrystal_I2C lcd(0x27,16,2);
    //Назначение пинов
    int pirPin = 12; //Пин датчика движения
    int pinKnop1 = 7;//Пин для кнопки выбора режима
    int pinKnop2 = 8;//Пин для кнопки вкл/выкл освещения (в ручном режиме)
    // Другие переменные
    int light = 0;//Переменная состояния света вкл/выкл

    int flag=0;

    // инициализация порта для подключения датчика температуры и модуля часов
    #define ONE_WIRE_BUS 10
    OneWire oneWire(ONE_WIRE_BUS);
    // Pass our oneWire reference to Dallas Temperature.
    DallasTemperature sensors(&oneWire);

    void setup() {
    Serial.begin(9600);
    pinMode(pirPin, INPUT); //пин датчика движения устанавливаем как вход
    pinMode(ctrlPin, OUTPUT);// пин управления MOSFET транзистором устанавливаем как выход
    pinMode(pinKnop1, INPUT); //пин кнопки выбора режима на вход
    pinMode(pinKnop2, INPUT); //пин кнопки вкл/выкл на вход
    regim=1;// при первом включении ставим автоматический режим
      sensors.begin();//Инициализируем датчик температуры
      lcd.init(); // Инициализируем экран
      lcd.backlight(); //Включаем подсветку
    }
    void loop() {

    sensors.requestTemperatures();
    float TempDS=(sensors.getTempCByIndex(0));
      lcd.setCursor(0,0);//Устанавливаем курсор в начало первой строки
      lcd.print("t: ");
      lcd.print( TempDS);//Выводим  температуру
      lcd.print(" C");
      chasi();// переходим к Функции вывода времени (см.ниже)
      rejim (); //переходим к Функции выбора режима (см.ниже)
      if (regim == 1) { //Если выбран режим 1(автоматический)
         lcd.setCursor(15,0);
         lcd.print("A");
         ctrlLedA();  //переходим к Функции плавного включения чего либо в автоматическом режиме
      }
      if (regim == 2) { //Если выбран режим 2(ручной)
        lcd.setCursor(15,0);
        lcd.print("P");
        ctrlLedP(); //переходим к Функции плавного включения чего либо в ручном режиме
      }

    }

            ///////////////////////////////// ФУНКЦИИ /////////////////////////////////////
         
    //функция выбора режима
       void rejim() {
     
         if(digitalRead(pinKnop1)==HIGH&&flag==0)//если кнопка нажата
         // и перемення flag равна 0 , то ...
         {
           regim++;
           flag=1;       //это нужно для того что бы с каждым нажатием кнопки происходило только одно действие
                         
            if(regim>2)//ограничим количество режимов
            {
              regim=1;//так как мы используем только одну кнопку, то переключать режимы будем циклично
            }         }
         
          if(digitalRead(pinKnop1)==LOW&&flag==1)//если кнопка НЕ нажата и переменная flag равна - 1 ,то ...  
         {
          flag=0;//обнуляем переменную "flag"
         }        
     
    }

    // функция плавного включения светодиодной ленты в автоматическом режиме
    void ctrlLedA(){
    if(digitalRead(pirPin) == HIGH) //если сработал датчик движения
    { if(light ==0) // плавно зажигаем лампу
       { for(int i=0; i<=150; i++)
          {
            analogWrite(ctrlPin, i);
            delay(10);
          }
          light =1;
          }
    }
      else {
        if (light == 1)
        {
          for(int i=150; i>=0; i--) // иначе медленно гасим
          {
            analogWrite(ctrlPin, i);
            delay(10);
          }
          light = 0;
        }
      }
    }
    // функция ручного переключения состояния освещения
    void ctrlLedP(){
    if(digitalRead(pinKnop2)==HIGH&&light==0)//если кнопка нажата и свет не горит то включаем
    {  
            analogWrite(ctrlPin,150);
            light =1;
          }
      else {
        if (digitalRead(pinKnop2)==HIGH&&light == 1) // если кнопку нажали и свет горит, то выключаем
        {  
            analogWrite(ctrlPin,0);
            light = 0;
        }

    }
    }
    // функция получения и вывода времени на экран LCD
      void chasi(){
         tmElements_t tm;
    if (RTC.read(tm)) {
        lcd.setCursor(0,1);
        print2digits(tm.Hour);
        lcd.print(':');
        print2digits(tm.Minute);
       // lcd.print(':'); //Секунды убрал за ненадобностью
    //   print2digits(tm.Second);
    lcd.setCursor(6,1);
        //Serial.print(", Date (D/M/Y) = ");
        print2digits(tm.Day);
        lcd.print('.');
        print2digits(tm.Month);
        lcd.print('.');
        lcd.print(tmYearToCalendar(tm.Year));
          } else {
          lcd.setCursor(0,1);
         lcd.print("DS1307 read error!");  
        }
    }
    //добавление "0" к цифрам < 10
    void print2digits(int number) {
      if (number >= 0 && number < 10) {
        lcd.print('0');
      }
      lcd.print(number);
    }

    Выслушаю рациональную критику и предложения по оптимизации кода.

    P.S: пока делал, спалил свою погодную станцию, по этому конечная реализация чуть откладывается. (Ремонтирую ПС, сгорела esp-01)
     
    Последнее редактирование: 28 янв 2016
  6. Securbond

    Securbond Гуру

    Немного доработал скетч. Решил, что каждый раз вечером переводить в автоматический режим, нажимая на кнопку будет лень, по этому появился режим "T", который сам переводит ночник в автомат с 23 вечера до 7 утра.
    Код (C++):
    #include <Wire.h>
    #include <OneWire.h>
    #include <DallasTemperature.h>
    #include <Time.h>
    #include <DS1307RTC.h>
    #include <LiquidCrystal_I2C.h>
    #define ctrlPin 9 //пин включения MOSFET транзистора
    int regim; //переменная для выбора режима освещения (ручное/автоматическое)
    int hTime; //переменная для хранения часа
    LiquidCrystal_I2C lcd(0x27,16,2);
    //Назначение пинов
    int pirPin = 12; //Пин датчика движения
    int pinKnop1 = 7;//Пин для кнопки выбора режима
    int pinKnop2 = 8;//Пин для кнопки вкл/выкл освещения (в ручном режиме)
    // Другие переменные
    int light = 0;//Переменная состояния света вкл/выкл

    int flag=0;

    // инициализация порта для подключения датчика температуры и модуля часов
    #define ONE_WIRE_BUS 10
    OneWire oneWire(ONE_WIRE_BUS);
    // Pass our oneWire reference to Dallas Temperature.
    DallasTemperature sensors(&oneWire);

    void setup() {
    Serial.begin(9600);
    pinMode(pirPin, INPUT); //пин датчика движения устанавливаем как вход
    pinMode(ctrlPin, OUTPUT);// пин управления MOSFET транзистором устанавливаем как выход
    pinMode(pinKnop1, INPUT); //пин кнопки выбора режима на вход
    pinMode(pinKnop2, INPUT); //пин кнопки вкл/выкл на вход
    regim=3;// при первом включении ставим автоматический режим
      sensors.begin();//Инициализируем датчик температуры
      lcd.init(); // Инициализируем экран
      lcd.backlight(); //Включаем подсветку
    }
    void loop() {

    sensors.requestTemperatures();
    float TempDS=(sensors.getTempCByIndex(0));
      lcd.setCursor(0,0);//Устанавливаем курсор в начало первой строки
      lcd.print("t: ");
      lcd.print( TempDS);//Выводим  температуру
      lcd.print(" C");
      chasi();// переходим к Функции вывода времени (см.ниже)
      rejim (); //переходим к Функции выбора режима (см.ниже)
      if (regim == 1) { //Если выбран режим 1(автоматический)
         lcd.setCursor(15,0);
         lcd.print("A"); //индикатор режима
         ctrlLedA();  //переходим к Функции плавного включения чего либо в автоматическом режиме
      }
      if (regim == 2) { //Если выбран режим 2(ручной)
        lcd.setCursor(15,0);
        lcd.print("P");//индикатор режима
        ctrlLedP(); //переходим к Функции плавного включения чего либо в ручном режиме
      }
       if (regim == 3) { //Если выбран режим 3(временной)
        lcd.setCursor(15,0);
        lcd.print("T");//индикатор режима

         if(hTime>22||hTime<7)
        {
        lcd.setCursor(14,0);
        lcd.print("*");//индикатор режима (в ночное время, дополнительно появляется "*"
        ctrlLedA();
        }
     
     
      }

    }

            ///////////////////////////////// ФУНКЦИИ /////////////////////////////////////
       
    //функция выбора режима
       void rejim() {

         if(digitalRead(pinKnop1)==HIGH&&flag==0)//если кнопка нажата
         // и перемення flag равна 0 , то ...
         {
           regim++;
           flag=1;       //это нужно для того что бы с каждым нажатием кнопки происходило только одно действие
                       
            if(regim>3)//ограничим количество режимов
            {
              regim=1;//так как мы используем только одну кнопку, то переключать режимы будем циклично
            }         }
       
          if(digitalRead(pinKnop1)==LOW&&flag==1)//если кнопка НЕ нажата и переменная flag равна - 1 ,то ...
         {
          flag=0;//обнуляем переменную "flag"
         }      

    }

    // функция плавного включения светодиодной ленты в автоматическом режиме
    void ctrlLedA(){
    if(digitalRead(pirPin) == HIGH) //если сработал датчик движения
    { if(light ==0) // плавно зажигаем лампу
       { for(int i=0; i<=150; i++)
          {
            analogWrite(ctrlPin, i);
            delay(10);
          }
          light =1;
          }
    }
      else {
        if (light == 1)
        {
          for(int i=150; i>=0; i--) // иначе медленно гасим
          {
            analogWrite(ctrlPin, i);
            delay(10);
          }
          light = 0;
        }
      }
    }
    // функция ручного переключения состояния освещения
    void ctrlLedP(){
    if(digitalRead(pinKnop2)==HIGH&&light==0)//если кнопка нажата и свет не горит то включаем
    {
            analogWrite(ctrlPin,150);
            light =1;
          }
      else {
        if (digitalRead(pinKnop2)==HIGH&&light == 1) // если кнопку нажали и свет горит, то выключаем
        {
            analogWrite(ctrlPin,0);
            light = 0;
        }

    }
    }
    // функция получения и вывода времени на экран LCD
      void chasi(){
         tmElements_t tm;
    if (RTC.read(tm)) {
        lcd.setCursor(0,1);
        print2digits(tm.Hour);
        hTime = (tm.Hour); //сохраняем значение часа в глобальную переменную hTime
        lcd.print(':');
        print2digits(tm.Minute);
       // lcd.print(':'); //Секунды убрал за ненадобностью
    //   print2digits(tm.Second);
    lcd.setCursor(6,1);
        //Serial.print(", Date (D/M/Y) = ");
        print2digits(tm.Day);
        lcd.print('.');
        print2digits(tm.Month);
        lcd.print('.');
        lcd.print(tmYearToCalendar(tm.Year));
          } else {
          lcd.setCursor(0,1);
         lcd.print("DS1307 read error!");
        }
    }
    //добавление "0" к цифрам < 10
    void print2digits(int number) {
      if (number >= 0 && number < 10) {
        lcd.print('0');
      }
      lcd.print(number);
    }
     

    И макетка (как смог :D)
    Clock_Led_bb.jpg
     
    Последнее редактирование: 1 фев 2016
  7. Securbond

    Securbond Гуру

    Пришёл к мысли что во первых заменю ds18b20 на AM2320 потому что есть в наличии и показывает не только температуру но и влажность. И ещё пробую прикрутить ко всей этой конструкции Enc28j60 для отправки данных на OpenHab и управлением с него подключенной светодиодной лентой ( на схеме выше она условно обозначена синим светодиодом). Времени мало, по этому процесс движется в день по чайной ложке.
    P.S Многие скажут зачем Еthernet, когда есть всеми любимый ESP. Причина в том что нужны знания именно по Ethernet, т.к необходимо реализовать промышленный, коммерческий проект, где этот шилд просто вынужденная необходимость. По этому совмещаю приятное с полезным.
     
    Последнее редактирование: 20 фев 2016
  8. Securbond

    Securbond Гуру

    Ну вот. Датчик прикручен. Теперь займёмся самым интересным 28j60+mqtt
    image.jpeg image.jpeg
     
  9. Securbond

    Securbond Гуру

    Проблемма !!!
    Уперся в нехватку памяти, нужна оптимизация ((((
    Sketch uses 24 228 bytes (78%) of program storage space. Maximum is 30 720 bytes.
    Global variables use 2 098 bytes (102%) of dynamic memory, leaving -50 bytes for local variables. Maximum is 2 048 bytes.
    Может кто то что то подскажет ?
    Код (C++):
    #include <Wire.h>
    #include <OneWire.h>
    #include <DallasTemperature.h>
    #include <Time.h>
    #include <DS1307RTC.h>
    #include <LiquidCrystal_I2C.h>
    #include "DHT.h"

    #include <NanodeUNIO.h>
    #include <NanodeUIP.h>
    #include <NanodeMQTT.h>
    NanodeMQTT mqtt(&uip);

    #define DHTPIN 2
    #define DHTTYPE DHT22
    #define ctrlPin 9
    float p;
    int regim;
    int hTime;
    LiquidCrystal_I2C lcd(0x27  ,20,4);
    //Назначение пинов
    int pirPin = 5; //Пин датчика движения
    int pinKnop1 = 10;//Пин для кнопки выбора режима
    int pinKnop2 = 8;//Пин для кнопки вкл/выкл освещения (в ручном режиме)
    // Другие переменные
    int light = 0;//Переменная состояния света вкл/выкл

    int flag=0;

    #define ONE_WIRE_BUS 6
    OneWire oneWire(ONE_WIRE_BUS);
    DallasTemperature sensors(&oneWire);
    DHT dht(DHTPIN, DHTTYPE);
    void message_callback(const char* topic, uint8_t* payload, int payload_length)
    {
      Serial.print(topic);
      Serial.print(" => ");
      Serial.write(payload, payload_length);
      Serial.println();
    }
    void setup() {
      Serial.begin(38400);
       byte macaddr[6];
      NanodeUNIO unio(NANODE_MAC_DEVICE);
      Serial.println("MQTT Subscribe test");
      unio.read(macaddr, NANODE_MAC_ADDRESS, 6);
      uip.init(macaddr);
       uip.set_ip_addr(192, 168, 0, 133);
      uip.set_netmask(255, 255, 255, 0);
      uip.wait_for_link();
      Serial.println("Link is up");
        mqtt.set_server_addr(192, 168, 0, 100);
      mqtt.set_callback(message_callback);
      mqtt.connect();
      Serial.println("Connected to MQTT server");
      mqtt.subscribe("/pogoda/sensors/bmpp");
      Serial.println("Subscribed.");
      Serial.println("setup() done");
    dht.begin();
    pinMode(pirPin, INPUT);
    pinMode(ctrlPin, OUTPUT);
    pinMode(pinKnop1, INPUT);
    pinMode(pinKnop2, INPUT);
    regim=3;
      sensors.begin();
      lcd.init();
      lcd.backlight();
    }
    void loop() {
       uip.poll();
    float h = dht.readHumidity();
      // Read temperature as Celsius (the default)
      float t = dht.readTemperature();
      // Read temperature as Fahrenheit (isFahrenheit = true)
      float f = dht.readTemperature(true);
    sensors.requestTemperatures();
    float TempDS=(sensors.getTempCByIndex(0));
    // Check if any reads failed and exit early (to try again).
      if (isnan(h) || isnan(t) || isnan(f)) {
        Serial.println("Failed to read from DHT sensor!");
        return;
      }
      lcd.setCursor(0,2);//Устанавливаем курсор в начало первой строки
      lcd.print("tAM: ");
      lcd.print(t);//Выводим  температуру
      lcd.print(" C");
      lcd.setCursor(0,3);//Устанавливаем курсор в начало первой строки
      lcd.print("h: ");
      lcd.print(h);//Выводим  температуру
      lcd.print("%");
      lcd.setCursor(0,1);//Устанавливаем курсор в начало первой строки
      lcd.print("tDS: ");
      lcd.print( TempDS);//Выводим  температуру
      lcd.print(" C");
      chasi();// переходим к Функции вывода времени (см.ниже)
      rejim (); //переходим к Функции выбора режима (см.ниже)
      if (regim == 1) { //Если выбран режим 1(автоматический)
         lcd.setCursor(18,0);
         lcd.print("A"); //индикатор режима
         ctrlLedA();  //переходим к Функции плавного включения чего либо в автоматическом режиме
      }
      if (regim == 2) { //Если выбран режим 2(ручной)
        lcd.setCursor(18,0);
        lcd.print("P");//индикатор режима
        ctrlLedP(); //переходим к Функции плавного включения чего либо в ручном режиме
      }
       if (regim == 3) { //Если выбран режим 3(временной)
        lcd.setCursor(18,0);
        lcd.print("T");//индикатор режима
       
         if(hTime>22||hTime<7)
        {
        lcd.setCursor(18,0);
        lcd.print("*");//индикатор режима (в ночное время, дополнительно появляется "*"
        ctrlLedA();
        }        
      }
     
    }      
       void rejim() {  
     
         if(digitalRead(pinKnop1)==HIGH&&flag==0)
         {
           regim++;  
           flag=1;
                         
            if(regim>3)
            {
              regim=1;
            }         }
         
          if(digitalRead(pinKnop1)==LOW&&flag==1)
         {
          flag=0;
          }    
     
    }
    void ctrlLedA(){
    if(digitalRead(pirPin) == HIGH) //если сработал датчик движения
    { if(light ==0) // плавно зажигаем лампу
       { for(int i=0; i<=150; i++)
          {
            analogWrite(ctrlPin, i);
            delay(10);
          }
          light =1;
          }
    }
      else {
        if (light == 1)
        {
          for(int i=150; i>=0; i--) // иначе медленно гасим
          {
            analogWrite(ctrlPin, i);
            delay(10);
          }
          light = 0;
        }
      }
    }
    // функция ручного переключения состояния освещения
    void ctrlLedP(){
    if(digitalRead(pinKnop2)==HIGH&&light==0)
    {    
            analogWrite(ctrlPin,150);
            light =1;
          }
      else {
        if (digitalRead(pinKnop2)==HIGH&&light == 1)
        {    
            analogWrite(ctrlPin,0);
            light = 0;
        }
     
    }
    }
    // функция получения и вывода времени на экран LCD
      void chasi(){
         tmElements_t tm;
    if (RTC.read(tm)) {
        lcd.setCursor(12,0);
        print2digits(tm.Hour);
        hTime = (tm.Hour); //сохраняем значение часа в глобальную переменную hTime
        lcd.print(':');
        print2digits(tm.Minute);
       // lcd.print(':'); //Секунды убрал за ненадобностью
    //   print2digits(tm.Second);
    lcd.setCursor(0,0);
        //Serial.print(", Date (D/M/Y) = ");
        print2digits(tm.Day);
        lcd.print('.');
        print2digits(tm.Month);
        lcd.print('.');
        lcd.print(tmYearToCalendar(tm.Year));
          } else {
          lcd.setCursor(0,1);
         lcd.print("DS1307 read error!");    
        }
    }
    //добавление "0" к цифрам < 10
    void print2digits(int number) {
      if (number >= 0 && number < 10) {
        lcd.print('0');
      }
      lcd.print(number);
    }
     
  10. Onkel

    Onkel Гуру

    50 байтиков озу данных нужно освободить. Посмотрите, может где массив можно не целый, а char, или вместо float можно Int, или переменные из глобальных в локальные перевести. Всего-то 50 байт.
     
  11. Securbond

    Securbond Гуру

    Да ладно... повозился немного но чувствую библиотека слишком кривая для этого шилда. Видимо нужно просто слать данные Get запросом на MySql. Или ехать забирать свой W5100.
     
  12. Onkel

    Onkel Гуру

    а в ide ардуины нет оптимизации? Может где ключик есть? Там же вроде студия в основе? Во всяких честных авр студиях, iar и даже в кодевишнах есть оптимизация по скорости и размеру, с 3 градациями. У меня ни разу проблема размера не возникала, все время оптимизация по скорости включена.
     
  13. Securbond

    Securbond Гуру

    Наверное вы правы, стоит изучать avrstudio но боюсь не потянуть:confused:
     
  14. Onkel

    Onkel Гуру

    я к тому что оптимизация скорее всего уже есть в самом ардуинском ide.
    в студии , например, ключ -Os делает оптимизацию по размеру. Поскольку ide вроде как (не уверен) на студии, то должно тоже работать. Вот куда его вставить не знаю...
    У вас немного другой случай- не хватает озу. Тут надо данные оптимизировать (char вместо Int, int вместо long, int вместо float), особенно если это массивы, не дублировать массивы и строки , перенести константы во флеш, перенести строковые константы (если они есть ) во флеш, можно редко используемые данные перенести из озу в еепром. 50 байт освободить - не проблема. Это 13 float или 25 int, всего-то. К тому же замечено, что если озу забито до предела, то иногда может подключивать, ну вроде стека не хватает, или еще какая проблема - не разбирался.
    пы сы не студии конечно, а компилятора avr-g++. Так что все фичи этого компилятора (вроде оптимизации) должны работать и в ide arduino.
     
  15. Alex19

    Alex19 Гуру

    Освобождать надо и не мало, дело в том, что это лишь глобальные переменные, а есть еще локальные, которые используются в функциях классов и т.д.

    В общем в самом коде .ino мало места для оптимизации памяти. Но начнем с нее.
    1. Все пины переводим на #define
    Начали же хорошо
    Код (C++):
    #define ctrlPin 9 //пин включения MOSFET транзистора
    А потом
    Код (C++):
    int pirPin = 5; //Пин датчика движения
    int pinKnop1 = 10;//Пин для кнопки выбора режима
    int pinKnop2 = 8;//Пин для кнопки вкл/выкл освещения (в ручном режиме)
    2. Выбираем правильный размер переменной.
    Код (C++):
    // Другие переменные
    int light = 0;//Переменная состояния света вкл/выкл

    int flag=0;
    Зачем тут int от -32 768 до 32 767. Тут хватит byte от 0 до 255. И так везде, выбираем правильный объем переменной.

    3. Переходим к поиску библиотеки, которая требуют больше оперативной памяти. Отключаем какую-то библиотеку с смотрим разницу (комментируем include и использование в коде). Тут можно получить максимальный профит.

    Дальше либо находим лучшую для Ардуино или AVR.

    К примеру OneWire.h и DallasTemperature.h не помню как по оперативной, но то по коду раза в 3 больше от библиотеки Amtel. Ближе к вечеру скину ее слегка допиленную для Arduino IDE.
     
  16. Securbond

    Securbond Гуру

    Спасибо.. что то проясняется.. Основной объем памяти 83-87 % кушают три библиотеки отвечающие за передачу данных в mqtt. В них вся проблема, но к сожалению для этого шилда альтернативы я не нашел((
     
  17. Alex19

    Alex19 Гуру

    4. Пункт массивы в библиотеках, порой для передачи данных используют массивы с запасом, можно изучить данные библиотеки и посмотреть, как их можно оптимизировать.

    Дайте ссылки на данные библиотеки, чтобы могли глянуть, не работал с mqtt.

    UDP. Вечером доберусь.
     
  18. Securbond

    Securbond Гуру

    Вот эти библиотеки

    P.S сделал что вы сказали получилось 99% вгрузил в ProMini Да же экран не завелся (((
     

    Вложения:

  19. Securbond

    Securbond Гуру

    Скетч сейчас выглядит так
    Помещается но не работает.
     

    Вложения:

  20. Alex19

    Alex19 Гуру

    Разумеется, я писал об этом.
    Ок, сейчас надо отъехать, приеду попробую.