господа подскажите где в минске есть погружной мотор-насос
.
подойдет любой миниатюрный, нужен для полива домашних цветов.
офлайн
TotCambIKoka
Senior Member
|
|
828 |
10 лет на сайте Город:
|
Доброго. Подскажите, плз.
Есть скетч с использованием дисплея 0,96" (128х64) на контроллере SSD1306, подключение по I2C, библиотека OLED_I2C.h
Есть такой же дисплей, но на 1,3" (128х64) и с контроллером sh1106, сложно ли в скетче подправить под дисплей с 1106? Вроде нужно просто в библиотеке файл поменять под нужный контроллер, не?
dyno:Доброго. Подскажите, плз.
Есть скетч с использованием дисплея 0,96" (128х64) на контроллере SSD1306, подключение по I2C, библиотека OLED_I2C.h
Есть такой же дисплей, но на 1,3" (128х64) и с контроллером sh1106, сложно ли в скетче подправить под дисплей с 1106? Вроде нужно просто в библиотеке файл поменять под нужный контроллер, не?
Нужно убрать комментарий с нужного дисплея, ненужный закомментировать, проверить распиновку нового дисплея, при необходимости исправить под себя. Ну и желательно скетч под
выложить, хотя бы начало с библиотекой.
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, ;
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 >> & 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 << & 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);}
}
На отдельной вкладке еще есть
// 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,
};
Дисплеи с идентичным названием пинов.
dyno, Если с этой библиотекой не работает, то нужно менять библиотеку и в коде везде менять строки вывода на дисплей как того будет требовать другая библиотека.
dyno:Возможно. Какова компенсация трудозатрат?
Я не знаю, я на Си не программирую, я на Паскале.
офлайн
TotCambIKoka
Senior Member
|
|
828 |
10 лет на сайте Город:
|
dyno, у меня экранчиков нет таких, чтоб поэксперементировать) И пока защита, так что только если в конце месяца за шаурму)
dyno,
в чем проблема использовать другую библиотеку?
https://github.com/wonho-maker/Adafruit_SH1106
или вот эту, которая работает с обоими контроллерами?
https://www.arduinolibraries.info/libraries/oled-ssd1306-sh1106
zverjuga, проблема в том, чтоб не нарушить функциональность скетча, изменив дисплей... Возьмётесь?
Тут лежит всё. https://yadi.sk/d/NYXPOGUB3W8tyG
На руках есть собранное устройство, вечером могу оперативно тестировать.
dyno, лучше выложи скетч сюда
https://create.arduino.cc/editor
там намного проще обмениваться исходниками, чем возиться с архивами и прочее. и всегда можно смотреть онлайн. пусть даже не компилится, но по крайней мере чтобы была видна часть, где используется экран. а там видно будет.
ну или любой другой онлайн-редактор
но, сдается мне, тебе будет быстрее поменять скетч самому под новый экран, чем у кого то искать помощи.
zverjuga, я далёк от этого... Это значит изучать ради одного раза... Проще купить готовый... Мне трудно оценить степень переделки, поэтому и спросил.
https://create.arduino.cc/editor/dyno/b02831ce-045a-4cd9-907b-575a9a65acbc
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()
как видишь, практически все, кроме установки фонта, можно заменить. пусть с другими параметрами, но зато будет работать с обоими контроллерами
скетч у тебя слишком большой, чтобы вот так вот навскидку его подкорректировать. и скорее всего, там каша и анархия, которую надо разгребать и чистить. так что лучше попробуй сам все сделать, тем более, что железо под руками.
zverjuga, для самостоятельной работы нужно вникать в сам принцип работы ПО... Это сложно. Человеку, знакомому с принципами это в 100 раз легче сделать...
Разгребать и чистить не нужно, он в принципе работает с экраном 0,96".
Могу конечно тупо заменить эти слова, но боюсь не взлетит... Еще ж и библиотеку поменять.
Вот даже в приведенном списке замен есть варианты, как выбрать?
Понимаете, если это для вас "сложно, нужно вникать в сам принцип работы ПО", то нужно покупать готовые устройства. 99%, что они окажутся всего процентов на 30-70 дороже, чем самосбор. А если учитывать время на разработку, то вообще значительно дешевле.
Этим занимаются либо для удовольствия, либо когда универсального решения нет/оно дорого (часто из-за какой-то редкой функции цена взлетает, а на самом деле чуть ли не пара строчек кода).
Так что " я далёк от этого... Это значит изучать ради одного раза... Проще купить готовый... "
Махасаматман, вы не внимательны. Чтобы оценить степень затрат, нужно понимать суть. Если специалист готов помочь "за шаурму" - меня устраивает. Если помощь равноценна покупке готового - куплю готовое.
dyno, за шаурму никто делать не будет. даже зная ардуину и программирование, на твою задачу нужно потратить несколько вечеров + чтобы железо было под руками. а теперь подумай, сколько человек с тебя потребует к примеру, за неделю своего вечернего времени?
скорее всего ты быстрее разберешься сам, чем найдешь помощника за шаурму. а столько, сколько с тебя попросят, ты скорее всего не будешь готов платить.