Ответить
  • _CAHEK_ IRC Team
    офлайн
    _CAHEK_ IRC Team

    3598

    18 лет на сайте
    пользователь #60224

    Профиль
    Написать сообщение

    3598
    # 26 мая 2019 19:53 Редактировалось _CAHEK_, 1 раз.

    господа подскажите где в минске есть погружной мотор-насос

    .
    подойдет любой миниатюрный, нужен для полива домашних цветов.

  • TotCambIKoka Senior Member
    офлайн
    TotCambIKoka Senior Member

    828

    10 лет на сайте
    пользователь #825562

    Профиль
    Написать сообщение

    828
    # 26 мая 2019 23:39
    [Паяльник & Отвертка TEAM] Кулыбин ищет хлам для творчества. Все замотаю синей изолентой
  • dyno Senior Member
    офлайн
    dyno Senior Member

    13365

    15 лет на сайте
    пользователь #145869

    Профиль
    Написать сообщение

    13365
    # 27 мая 2019 22:08 Редактировалось dyno, 1 раз.

    Доброго. Подскажите, плз.
    Есть скетч с использованием дисплея 0,96" (128х64) на контроллере SSD1306, подключение по I2C, библиотека OLED_I2C.h
    Есть такой же дисплей, но на 1,3" (128х64) и с контроллером sh1106, сложно ли в скетче подправить под дисплей с 1106? Вроде нужно просто в библиотеке файл поменять под нужный контроллер, не?

    Мои Боги меня рабом не называли.
  • SIO Паяльник & Отвертка TEAM
    офлайн
    SIO Паяльник & Отвертка TEAM

    4105

    17 лет на сайте
    пользователь #68847

    Профиль
    Написать сообщение

    4105
    # 27 мая 2019 22:52 Редактировалось SIO, 4 раз(а).
    dyno:

    Доброго. Подскажите, плз.
    Есть скетч с использованием дисплея 0,96" (128х64) на контроллере SSD1306, подключение по I2C, библиотека OLED_I2C.h
    Есть такой же дисплей, но на 1,3" (128х64) и с контроллером sh1106, сложно ли в скетче подправить под дисплей с 1106? Вроде нужно просто в библиотеке файл поменять под нужный контроллер, не?

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

    выложить, хотя бы начало с библиотекой.

    Паяльник & Отвертка TEAM, MikroPascal for AVR http://forum.onliner.by/viewtopic.php?t=637523
  • dyno Senior Member
    офлайн
    dyno Senior Member

    13365

    15 лет на сайте
    пользователь #145869

    Профиль
    Написать сообщение

    13365
    # 27 мая 2019 23:02 Редактировалось dyno, 4 раз(а).

    SIO, скетч могу и целиком скинуть.

    код выделить все

    #include <Encoder.h>
    #define ENCODER_OPTIMIZE_INTERRUPTS
    #include <Bounce2.h>
    #include <SPI.h>
    #include <EEPROM.h>
    #include <OLED_I2C.h>

    //--------EEPROM Address ------
    #define vol_adr 1 // уровень громкости
    #define sub_adr 2 // уровень сабвуфера
    #define dsp_ctrl_adr 3 // последний режим энкодера
    #define dsp_mode_adr 40 // пресет процессора

    // ---------- OLED 128x64 SSD1306 I2C ---------
    OLED myOLED(SDA, SCL, 8);
    extern uint8_t TerminatorNum[];
    extern uint8_t SmallFont[];
    extern uint8_t ArController_logo[];
    extern uint8_t no_audio[];

    Encoder myEnc(3,5);
    byte maxPWM_2 = 254;
    byte maxPWM_1 = 254;
    byte dsp_ctrl1 = 10;
    byte dsp_ctrl2 = 9;
    byte enc_btn = 4;
    byte dsp_sw = 7;
    byte led = 13;
    int wheel_btn;
    int wheel_data;
    byte enc_multi = 2;
    Bounce bouncer = Bounce();
    uint32_t ms_btn = 0;
    uint32_t ms_save_eeprom = 0;
    const int btn_mid = 500; // средняя длина нажатия кнопки энкодера
    const int btn_long = 2000; // долгое нажатие кнопки энкодера
    int time_long_press = 3000; // время для долгого удержания кнопки
    int time_holding = 500; // время для удержания кнопок в миллисекундах
    int time_tinkling = 10; // время исключающее дребезг контактов в миллисекундах
    int time_save_eeprom = 3000; // частота сохранения значения громкости в eeprom
    unsigned long flag = 0;
    unsigned long eventTime = 0;
    byte vol,sub,e_vol,e_sub,max_vol, max_sub, min_vol, old_vol, old_sub;
    int muted,old_res;

    //-----EEPROM Load--------
    int dsp_mode = EEPROMReadInt (dsp_mode_adr);
    int dsp_ctrl = EEPROMReadInt (dsp_ctrl_adr);
    //------------------------
     
    void setup() {
      bouncer.attach(enc_btn);
      bouncer.interval(10); // interval in ms
      TCCR1A = TCCR1A & 0xe0 | 1;   // 9, 10 Pins
      TCCR1B = TCCR1B & 0xe0 | 0x09;// 62500 Hz
     //OCR0A = 0xAF;
      TIMSK0 |= _BV(OCIE0A); // Timer Interrupts
      pinMode(enc_btn,INPUT_PULLUP);
      pinMode(dsp_sw,OUTPUT);
      pinMode(led, OUTPUT);

    //---------------- Volume loading  -----------
    e_vol = EEPROM.read(vol_adr); //читаем значения громкости из памяти
    e_sub = EEPROM.read(sub_adr); //читаем значения ур.сабвуфера из памяти
    max_vol = 100;
    min_vol = 0;
    max_sub = 100;
    if (e_vol <= max_vol){vol = e_vol;}
    else {vol = 20;} // значение громкости по дефолту
    if (e_sub <= max_sub){sub = e_sub;}
    else {sub = 30;} // значение сабвуфера по дефолту
    PWM_change (vol,max_vol,dsp_ctrl1,maxPWM_1);
    PWM_change (sub,max_sub,dsp_ctrl2,maxPWM_2);
    if (!dsp_ctrl) myEnc.write(vol * enc_multi);
    else myEnc.write(sub * enc_multi);
    //-----------------------------------------
    myOLED.begin();
    myOLED.drawBitmap(0, 0, ArController_logo, 128, 64);
    myOLED.update();
    delay (2000); // ждем установка стабильных напряжений
    }

    void loop() {
        uint32_t ms = millis();
        bouncer.update();
        myOLED.clrScr();
        myOLED.drawRoundRect(2, 1, 126, 15);
        myOLED.drawRoundRect(2, 18, 126, 32);
        myOLED.drawRoundRect(2, 34, 126, 62);
        myOLED.setFont(TerminatorNum);
        VOL_bar ();
    //*************** отображаем уровень громкости на дисплее *********
      if (dsp_ctrl == 0)
      {
        if (!muted){
          myOLED.printNumI(vol, CENTER, 36);
        }
        else {
          myOLED.drawBitmap(52, 36, no_audio, 24, 24);
        }
      }
      else
      {
          if (!muted){
          myOLED.printNumI(sub, CENTER, 36);
        }
        else {
          myOLED.drawBitmap(52, 36, no_audio, 24, 24);
        }
      }

    // ************* переключаем пресеты *************
    if (dsp_mode == 0)
      {
         digitalWrite (led, dsp_mode);
         digitalWrite(dsp_sw,dsp_mode);
         EEPROMWriteInt (dsp_mode_adr,dsp_mode);
         myOLED.invert(true);
      }
      else
      {
         digitalWrite (led, dsp_mode);
         digitalWrite(dsp_sw,dsp_mode);
         EEPROMWriteInt (dsp_mode_adr,dsp_mode);
         myOLED.invert(false);
      }
      
    //************** работа с кнопкой энкодера **********
    if (bouncer.fell())
          {
            ms_btn = ms;
          }
        if (bouncer.rose())
          {
            if (ms - ms_btn < btn_mid) // короткое нажатие энкодера
            {
             DSP_ctrl_ch();
            }
            if (ms - ms_btn > btn_mid && ms-ms_btn <btn_long) // среднее нажатие энкодера
            {
              DSP_set();
            }
            if (ms - ms_btn > btn_long) // долгое нажатие энкодера
            {
               //
            }
          }
       
    // ************ Обработка изменения значения энкодера *********
      if (dsp_ctrl == 0){
      int nvol = myEnc.read()/enc_multi;
      if (nvol != vol ){
        if (!muted){
          PWM_change (nvol,max_vol,dsp_ctrl1,maxPWM_1);
          vol = nvol;
          ms_save_eeprom = ms;
        }
        else {
          vol = old_vol;
          PWM_change (vol,max_vol,dsp_ctrl1,maxPWM_1);
          myEnc.write(vol * enc_multi);
          ms_save_eeprom = ms;
          muted = false;
        }
      }
      }
     else{
     int nsub = myEnc.read()/enc_multi;
     if (nsub != sub)
          {
          if (!muted){
           PWM_change (nsub,max_sub,dsp_ctrl2,maxPWM_2);  
           sub = nsub;
           ms_save_eeprom = ms;
          }
          else{
            sub = old_sub;
            PWM_change (sub,max_sub,dsp_ctrl2,maxPWM_2);
            myEnc.write(sub * enc_multi);
            ms_save_eeprom = ms;
            muted = false;
            }
          }
      }
      
    // ************ Сохранение новых значений громкости ***********
    if (ms - ms_save_eeprom > time_save_eeprom)
      {
        EEPROM.put(vol_adr,vol); // запись последнего значения громкости в EEPROM
        EEPROM.put(sub_adr,sub); // запись последнего значения сабвуфера в EEPROM
      }
    //************* Обновляем дисплей **************
      myOLED.update();
    }
        
    // ************ Рисуем прогрессбар *************
    void VOL_bar ()
    {
      int max_bar = 124;
      int min_bar = 4;
      for (int i = min_bar ; i < max_bar * vol / max_vol ; i++)
        {
          if (dsp_ctrl == 1){
           if (i%2 == 0) myOLED.drawLine( i, 3, i, 14);
          }
          else myOLED.drawLine( i, 3, i, 14);
        }
      for (int i = min_bar ; i < max_bar * sub / max_sub ; i++)
        {
          if (dsp_ctrl == 0){
           if (i%2 == 0) myOLED.drawLine( i, 20, i, 31);
          }
          else myOLED.drawLine( i, 20, i, 31);
        }
    }

    // ************ Управление PWM выходами ****************
    void PWM_change (int volume, int maximum, byte PWM_pin, byte maxPWM){
      //if (volume >= maximum) {volume=maximum;myEnc.write(maximum*enc_multi);}
      //if (volume < 0) {volume=0;myEnc.write(0);}
      int PWM_level = maxPWM * volume / maximum;
      analogWrite(PWM_pin, PWM_level);
    }

    // ************* Переключение энкодеров ****************
    void DSP_ctrl_ch()
    {
     if (dsp_ctrl == 0) { // меняем режим работы
                dsp_ctrl = 1;
                myEnc.write (sub * enc_multi);
              }
              else
              {
                 dsp_ctrl = 0;
                 myEnc.write (vol * enc_multi);
              }
      EEPROMWriteInt (dsp_ctrl_adr,dsp_ctrl);
    }

    // ************ Эмуляция кнопки энкодера **************
    void DSP_set()
    {
      if (dsp_mode == 0) // переключаем пресет
        {
         dsp_mode = 1;
        }
         else
        {
         dsp_mode = 0;
        }
    }

    // *************** Запись в EEPROM переменной Int *************
    void EEPROMWriteInt(int p_address, int p_value)
    {
      byte lowByte = ((p_value >> 0) & 0xFF);
      byte highByte = ((p_value >> 8) & 0xFF);
      EEPROM.write(p_address, lowByte);
      EEPROM.write(p_address + 1, highByte);
    }
    // **************** Чтение Int из EEPROM **************
    unsigned int EEPROMReadInt(int p_address)
    {
      byte lowByte = EEPROM.read(p_address);
      byte highByte = EEPROM.read(p_address + 1);
      return ((lowByte << 0) & 0xFF) + ((highByte << 8) & 0xFF00);
    }

    // ********* Прерывание для коррекции диапазона регулировок **********
    SIGNAL(TIMER0_COMPA_vect) 
    {
      if (myEnc.read()/ enc_multi > max_vol ) {myEnc.write(max_vol*enc_multi);}
      if (myEnc.read()/ enc_multi < min_vol ) {myEnc.write(min_vol*enc_multi);}
    }

    Добавлено спустя 4 минуты 35 секунд

    На отдельной вкладке еще есть

    код выделить все

    // Generated by   : ImageConverter Mono Online
    // Generated from : high_volume_filled1600.png
    // Time generated : Thu, 17 May 18 18:05:09 +0200  (Server timezone: CET)
    // Image Size     : 24x24 pixels
    // Memory usage   : 72 bytes

    #if defined(__AVR__)
        #include <avr/pgmspace.h>
        #define imagedatatype const uint8_t
    #elif defined(__PIC32MX__)
        #define PROGMEM
        #define imagedatatype const unsigned char
    #elif defined(__arm__)
        #define PROGMEM
        #define imagedatatype const unsigned char
    #endif

    imagedatatype no_audio[] PROGMEM={
    0x01, 0x03, 0x04, 0x08, 0x10, 0xA0, 0x40, 0xE0, 0xF0, 0xF8, 0xFC, 0xFC, 0xFC, 0x00, 0x00, 0x00,   // 0x0010 (16) pixels
    0x40, 0xC0, 0x98, 0x30, 0x60, 0xC0, 0x80, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFE,   // 0x0020 (32) pixels
    0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0x20, 0x42, 0xE6, 0x3C, 0x00, 0x81, 0xFF, 0x18, 0x00, 0xF7, 0x7E,   // 0x0030 (48 ) pixels
    0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x00,   // 0x0040 (64) pixels
    0x01, 0x03, 0x05, 0x0C, 0x1E, 0x23, 0x41, 0xC0, 
    };

    Добавлено спустя 2 минуты 26 секунд

    Дисплеи с идентичным названием пинов.

    Мои Боги меня рабом не называли.
  • SIO Паяльник & Отвертка TEAM
    офлайн
    SIO Паяльник & Отвертка TEAM

    4105

    17 лет на сайте
    пользователь #68847

    Профиль
    Написать сообщение

    4105
    # 28 мая 2019 08:35

    dyno, Если с этой библиотекой не работает, то нужно менять библиотеку и в коде везде менять строки вывода на дисплей как того будет требовать другая библиотека.

    Паяльник & Отвертка TEAM, MikroPascal for AVR http://forum.onliner.by/viewtopic.php?t=637523
  • dyno Senior Member
    офлайн
    dyno Senior Member

    13365

    15 лет на сайте
    пользователь #145869

    Профиль
    Написать сообщение

    13365
    # 28 мая 2019 09:49

    Возможно. Какова компенсация трудозатрат?

    Мои Боги меня рабом не называли.
  • SIO Паяльник & Отвертка TEAM
    офлайн
    SIO Паяльник & Отвертка TEAM

    4105

    17 лет на сайте
    пользователь #68847

    Профиль
    Написать сообщение

    4105
    # 28 мая 2019 20:05
    dyno:

    Возможно. Какова компенсация трудозатрат?

    Я не знаю, я на Си не программирую, я на Паскале.

    Паяльник & Отвертка TEAM, MikroPascal for AVR http://forum.onliner.by/viewtopic.php?t=637523
  • dyno Senior Member
    офлайн
    dyno Senior Member

    13365

    15 лет на сайте
    пользователь #145869

    Профиль
    Написать сообщение

    13365
    # 28 мая 2019 20:52

    Может ещё кто откликнется.

    Мои Боги меня рабом не называли.
  • TotCambIKoka Senior Member
    офлайн
    TotCambIKoka Senior Member

    828

    10 лет на сайте
    пользователь #825562

    Профиль
    Написать сообщение

    828
    # 28 мая 2019 21:52

    dyno, у меня экранчиков нет таких, чтоб поэксперементировать) И пока защита, так что только если в конце месяца за шаурму)

    [Паяльник & Отвертка TEAM] Кулыбин ищет хлам для творчества. Все замотаю синей изолентой
  • dyno Senior Member
    офлайн
    dyno Senior Member

    13365

    15 лет на сайте
    пользователь #145869

    Профиль
    Написать сообщение

    13365
    # 29 мая 2019 07:56

    TotCambIKoka, хоть так. :)

    Мои Боги меня рабом не называли.
  • zverjuga Senior Member
    офлайн
    zverjuga Senior Member

    5030

    13 лет на сайте
    пользователь #346019

    Профиль
    Написать сообщение

    5030
    # 29 мая 2019 16:42

    dyno,
    в чем проблема использовать другую библиотеку?
    https://github.com/wonho-maker/Adafruit_SH1106

    или вот эту, которая работает с обоими контроллерами?
    https://www.arduinolibraries.info/libraries/oled-ssd1306-sh1106

    проклятый антисутенерский закон!
  • dyno Senior Member
    офлайн
    dyno Senior Member

    13365

    15 лет на сайте
    пользователь #145869

    Профиль
    Написать сообщение

    13365
    # 29 мая 2019 16:44 Редактировалось dyno, 3 раз(а).

    zverjuga, проблема в том, чтоб не нарушить функциональность скетча, изменив дисплей... Возьмётесь? ;)
    Тут лежит всё. https://yadi.sk/d/NYXPOGUB3W8tyG
    На руках есть собранное устройство, вечером могу оперативно тестировать.

    Мои Боги меня рабом не называли.
  • zverjuga Senior Member
    офлайн
    zverjuga Senior Member

    5030

    13 лет на сайте
    пользователь #346019

    Профиль
    Написать сообщение

    5030
    # 29 мая 2019 17:08

    dyno, лучше выложи скетч сюда
    https://create.arduino.cc/editor

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

    ну или любой другой онлайн-редактор

    но, сдается мне, тебе будет быстрее поменять скетч самому под новый экран, чем у кого то искать помощи.

    проклятый антисутенерский закон!
  • dyno Senior Member
    офлайн
    dyno Senior Member

    13365

    15 лет на сайте
    пользователь #145869

    Профиль
    Написать сообщение

    13365
    # 29 мая 2019 17:26 Редактировалось dyno, 1 раз.

    zverjuga, я далёк от этого... Это значит изучать ради одного раза... Проще купить готовый... Мне трудно оценить степень переделки, поэтому и спросил.
    https://create.arduino.cc/editor/dyno/b02831ce-045a-4cd9-907b-575a9a65acbc

    Мои Боги меня рабом не называли.
  • zverjuga Senior Member
    офлайн
    zverjuga Senior Member

    5030

    13 лет на сайте
    пользователь #346019

    Профиль
    Написать сообщение

    5030
    # 29 мая 2019 18:46 Редактировалось zverjuga, 2 раз(а).

    dyno,

    в твоем скетче используются следующие функции экрана. слева функции из твоего скетча, справа - найденные аналоги из библиотеки https://www.arduinolibraries.info/libraries/oled-ssd1306-sh1106 (https://github.com/durydevelop/arduino-lib-oled/blob/master/src/oled.h)

    1. drawBitmap - заменить на draw_bitmap или draw_bitmap_P
    2. clrScr() - заменить на clear()
    3. drawRoundRect ()- заменить на draw_circle() или draw_rectangle()
    4. setFont() - аналога не найдено
    5. printNumI() - заменить на draw_string() или draw_string_P()
    6. invert() - заменить на set_invert()
    7. update() - заменить на display()
    8. drawLine() - заменить на draw_line()
    9. print() - заменить на draw_string() или draw_string_P()

    как видишь, практически все, кроме установки фонта, можно заменить. пусть с другими параметрами, но зато будет работать с обоими контроллерами

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

    проклятый антисутенерский закон!
  • dyno Senior Member
    офлайн
    dyno Senior Member

    13365

    15 лет на сайте
    пользователь #145869

    Профиль
    Написать сообщение

    13365
    # 29 мая 2019 19:10 Редактировалось dyno, 3 раз(а).

    zverjuga, для самостоятельной работы нужно вникать в сам принцип работы ПО... Это сложно. Человеку, знакомому с принципами это в 100 раз легче сделать...
    Разгребать и чистить не нужно, он в принципе работает с экраном 0,96".
    Могу конечно тупо заменить эти слова, но боюсь не взлетит... Еще ж и библиотеку поменять.
    Вот даже в приведенном списке замен есть варианты, как выбрать?

    Мои Боги меня рабом не называли.
  • Махасаматман Member
    офлайн
    Махасаматман Member

    274

    11 лет на сайте
    пользователь #721530

    Профиль
    Написать сообщение

    274
    # 29 мая 2019 20:42

    Понимаете, если это для вас "сложно, нужно вникать в сам принцип работы ПО", то нужно покупать готовые устройства. 99%, что они окажутся всего процентов на 30-70 дороже, чем самосбор. А если учитывать время на разработку, то вообще значительно дешевле.
    Этим занимаются либо для удовольствия, либо когда универсального решения нет/оно дорого (часто из-за какой-то редкой функции цена взлетает, а на самом деле чуть ли не пара строчек кода).
    Так что " я далёк от этого... Это значит изучать ради одного раза... Проще купить готовый... " :super:

  • dyno Senior Member
    офлайн
    dyno Senior Member

    13365

    15 лет на сайте
    пользователь #145869

    Профиль
    Написать сообщение

    13365
    # 29 мая 2019 20:59

    Махасаматман, вы не внимательны. Чтобы оценить степень затрат, нужно понимать суть. Если специалист готов помочь "за шаурму" - меня устраивает. Если помощь равноценна покупке готового - куплю готовое.

    Мои Боги меня рабом не называли.
  • zverjuga Senior Member
    офлайн
    zverjuga Senior Member

    5030

    13 лет на сайте
    пользователь #346019

    Профиль
    Написать сообщение

    5030
    # 29 мая 2019 23:06 Редактировалось zverjuga, 1 раз.

    dyno, за шаурму никто делать не будет. даже зная ардуину и программирование, на твою задачу нужно потратить несколько вечеров + чтобы железо было под руками. а теперь подумай, сколько человек с тебя потребует к примеру, за неделю своего вечернего времени?

    скорее всего ты быстрее разберешься сам, чем найдешь помощника за шаурму. а столько, сколько с тебя попросят, ты скорее всего не будешь готов платить.

    проклятый антисутенерский закон!