Всем доброго, недавно один из подписчиков подарил мне платы от трансивера Радио-76 М2 в рабочем состоянии. Трансивер Олегу собирал его приятель и он чуточку отличается от типовой схемы опубликованной в журнале "Радио" и размещенной на многих сайтах в интернете. Отличия не только конструктивные но и схемные. К сожалению схемы автора нет, а сам я её пока еще не нарисовал, Схема будет в следующих частях из этой серии.
В данной же заметке, хочу рассказать об S-Метре. Родной индикатор был выполнен на стрелочном приборе маленьких габаритов, кроме того, шкала прибора размечена под индикатор уровня какого-то магнитофона. Еще до того как определился с корпусом, планировал применить более крупную головку с собственной шкало, но после того как созрел корпус, стало понятно, что такой прибор просто не поместится на передней панели.
Пока был на вахте, поглядывал в сеть, искал альтернативы.
На одном из Ютюб каналов нашел интересную реализацию S-Метра, на ардуино и OLED дисплее.
Ссылок на схему и исходники автор не дал, но мне повезло - в комментариях под видео, автор опубликовал текст исходного кода в среде "Arduino IDE".
Оттуда и был скопирован код.
Схема предельно проста, Дисплей подключается стандартно по шине I2C, а сигнал подается на нулевой пин ардуины через делитель, всё это прописано в скетче.
Дисплей SH1106 можно заменить дисплеем SSD1306, без изменений в исходнике, но делать этого не стоит по причине неприлично малых размеров экрана последнего.
В трансивере схема собрана навесным монтажом и подключена туда же куда подключалась головка электромеханического индикатора. Ввиду малой толщины модуля дисплея, он с легкостью нашел себе место на морде аппарата.
Ниже привожу скетч, его нужно скопировать и вставить в Arduino IDE. Библиотеки если потребуются качайте с Гитхаба.
#include <Wire.h> // requried to run I2C SH1106
#include <SPI.h> // requried to run I2C SH1106
#include <Adafruit_GFX.h> // https://github.com/adafruit/Adafruit-GFX-Library
//#include <Adafruit_SSD1306.h>
#include <Adafruit_SH1106.h>
#include<NoDelay.h>
noDelay SM(100);
#define OLED_RESET 4
//Adafruit_SSD1306 display(OLED_RESET);
Adafruit_SH1106 display(OLED_RESET);
//#if (SSD1306_LCDHEIGHT != 64 )
//#error("Height incorrect, please fix Adafruit_SSD1306.h!");
//#endif
#if (SH1106_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SH1106.h!");
#endif
boolean unefois;
int analogInput = A0; // analog input
int hMeter = 65; // horizontal center for needle animation
int vMeter = 85; // vertical center for needle animation (outside of dislay limits)
int rMeter = 69; // longeur de l'aiguil defaul 80
unsigned int sample;
int MeterValue = 0;
// VU meter background mask image:
static const unsigned char PROGMEM VUMeter[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x11, 0x00, 0x01, 0x8E, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x11, 0x00, 0x02, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x0F, 0x00, 0x00, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x20, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x03, 0x80, 0x00, 0xF0, 0x00, 0x01, 0x00, 0x20, 0x51, 0x00, 0x04, 0x70, 0x00, 0x00,
0x00, 0x00, 0x04, 0x40, 0x00, 0x88, 0x00, 0x11, 0x00, 0xF8, 0x91, 0x00, 0x0C, 0x88, 0x00, 0x00,
0x00, 0x00, 0x00, 0x40, 0x00, 0x88, 0x00, 0x0E, 0x00, 0x21, 0x11, 0x00, 0x0C, 0x88, 0x00, 0x00,
0x00, 0x00, 0x00, 0x40, 0x00, 0x88, 0x00, 0x00, 0x00, 0x22, 0x11, 0x02, 0x14, 0x88, 0x00, 0x00,
0x00, 0x00, 0x01, 0x80, 0x00, 0x70, 0x00, 0x00, 0x00, 0x03, 0xCE, 0x02, 0x14, 0x88, 0x00, 0x00,
0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xA4, 0x88, 0x00, 0x00,
0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x3E, 0x88, 0x00, 0x00,
0x00, 0x00, 0x04, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x88, 0x00, 0x00,
0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x70, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
0x07, 0x00, 0x00, 0x00, 0x00, 0x20, 0x41, 0x04, 0x01, 0x00, 0x40, 0x00, 0x00, 0x00, 0x0C, 0x70,
0x08, 0x80, 0x00, 0x00, 0x00, 0x10, 0x41, 0x04, 0x01, 0x00, 0x80, 0x00, 0x00, 0x00, 0x12, 0x88,
0x08, 0x80, 0x00, 0x00, 0x08, 0x11, 0xFF, 0xFC, 0x7F, 0xF0, 0x80, 0x00, 0x00, 0x00, 0x10, 0x88,
0x08, 0x80, 0x00, 0x80, 0x08, 0x3F, 0xFF, 0xFC, 0x7F, 0xFF, 0xC0, 0x40, 0x10, 0x01, 0x10, 0x88,
0x08, 0x80, 0x00, 0x42, 0x0F, 0xFF, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x40, 0x20, 0x01, 0x1C, 0x88,
0x08, 0x80, 0x00, 0x41, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xE0, 0x20, 0x07, 0xD2, 0x88,
0x08, 0x80, 0x00, 0x47, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFC, 0x20, 0x01, 0x12, 0x88,
0x08, 0x80, 0x00, 0x3F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC0, 0x01, 0x12, 0x88,
0x07, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x0C, 0x70,
0x00, 0x00, 0x1F, 0xE0, 0x00, 0x00, 0x03, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x7E, 0x10, 0x00, 0x00,
0x02, 0x00, 0x3F, 0x00, 0x00, 0x03, 0xFC, 0x04, 0x03, 0xFE, 0x00, 0x00, 0x0F, 0xE0, 0x08, 0x00,
0x01, 0x00, 0xF8, 0x00, 0x00, 0xFC, 0x10, 0x04, 0x00, 0x81, 0xE0, 0x00, 0x03, 0xF0, 0x08, 0x00,
0x01, 0x07, 0xE0, 0x00, 0x1F, 0x40, 0x10, 0x04, 0x00, 0x80, 0x3F, 0x80, 0x00, 0x78, 0x10, 0x00,
0x00, 0x9F, 0x80, 0x00, 0xE0, 0x40, 0x10, 0x00, 0x00, 0x80, 0x20, 0x70, 0x00, 0x1F, 0x10, 0x00,
0x00, 0xBC, 0x00, 0x07, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1C, 0x00, 0x07, 0xE0, 0x00,
0x00, 0xF0, 0x00, 0x3A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0xC0, 0x01, 0xF0, 0x00,
0x03, 0xC0, 0x01, 0xC1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x00, 0x78, 0x00,
0x07, 0x80, 0x0E, 0x01, 0x00, 0x00, 0x08, 0x00, 0x01, 0xC0, 0x00, 0x10, 0x06, 0x00, 0x18, 0x00,
0x06, 0x00, 0x14, 0x00, 0x00, 0x00, 0x18, 0x00, 0x02, 0x20, 0x00, 0x00, 0x05, 0x80, 0x00, 0x00,
0x00, 0x00, 0xE4, 0x00, 0x00, 0x00, 0x18, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x60, 0x00, 0x00,
0x00, 0x03, 0x82, 0x00, 0x00, 0x00, 0x28, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x18, 0x00, 0x00,
0x00, 0x0C, 0x00, 0x07, 0x00, 0x00, 0x28, 0x00, 0x03, 0xC0, 0x00, 0x1C, 0x00, 0x06, 0x00, 0x00,
0x00, 0x30, 0x00, 0x08, 0x80, 0x00, 0x48, 0x00, 0x02, 0x20, 0x00, 0x22, 0x00, 0x01, 0x80, 0x00,
0x00, 0x50, 0x00, 0x00, 0x80, 0x00, 0x7C, 0x00, 0x02, 0x20, 0x00, 0x22, 0x00, 0x01, 0x40, 0x00,
0x00, 0x08, 0x00, 0x00, 0x80, 0x00, 0x08, 0x00, 0x02, 0x20, 0x00, 0x22, 0x00, 0x02, 0x00, 0x00,
0x00, 0x08, 0x00, 0x01, 0x00, 0x00, 0x08, 0x00, 0x01, 0xC0, 0x00, 0x1C, 0x00, 0x02, 0x00, 0x00,
0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00,
0x00, 0x38, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x04, 0x70, 0x00,
0x00, 0x44, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x88, 0x00,
0x00, 0x44, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x40, 0x10, 0x11, 0x00, 0x00, 0x00, 0x04, 0x88, 0x00,
0x00, 0x44, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x22, 0x20, 0x11, 0x00, 0x00, 0x00, 0x04, 0x88, 0x00,
0x00, 0x44, 0x00, 0x00, 0x00, 0xFB, 0xE0, 0x22, 0x27, 0x3B, 0x9C, 0x00, 0x00, 0x04, 0x88, 0x00,
0x00, 0x44, 0x00, 0x00, 0x01, 0x0A, 0x10, 0x22, 0x20, 0x91, 0x22, 0x00, 0x00, 0x04, 0x88, 0x00,
0x00, 0x44, 0x00, 0x00, 0x01, 0x0A, 0x17, 0x15, 0x47, 0x91, 0x18, 0x00, 0x00, 0x04, 0x88, 0x00,
0x00, 0x44, 0x00, 0x00, 0x01, 0x0A, 0x10, 0x15, 0x48, 0x91, 0x04, 0x00, 0x00, 0x04, 0x88, 0x00,
0x00, 0x38, 0x00, 0x00, 0x01, 0x0A, 0x10, 0x08, 0x88, 0x91, 0x22, 0x00, 0x00, 0x04, 0x70, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xFB, 0xE0, 0x08, 0x87, 0x88, 0x9C, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
void setup()
{
unefois=true;
pinMode(analogInput, INPUT); // analog input
//display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // needed for SH1306 display
display.begin(SH1106_SWITCHCAPVCC, 0x3C);
une_fois();
display.clearDisplay(); // clears display from any library info displayed
}
void loop()
{
sample = analogRead(analogInput);
if(SM.update())
{
sample = map(sample,0,1023,0,1000); // ajuste aiguil a max position defaut 95
MeterValue = sample - 50; // ajuste aiguil a zero position defaut 50
display.clearDisplay(); // refresh display for next step
display.drawBitmap(0, 0, VUMeter, 128, 64, WHITE); // draws background
int a1 = (hMeter + (sin(MeterValue / 57.296) * rMeter)); // meter needle horizontal coordinate
int a2 = (vMeter - (cos(MeterValue / 57.296) * rMeter)); // meter needle vertical coordinate
display.drawLine(a1, a2, hMeter, vMeter, WHITE); // draws needle
display.display();
}
}
//fonction
void une_fois()
{
if(unefois)
{
float sensor = analogRead(A2);
float volt = map(sensor, 0, 1023, 0, 5700); // calcul pour 0 - 30 volts avec resistance 10k et 100k
//float volt = map(sensor, 0, 1023, 0, 500); // calcul pour 0 - 5 volts sans resistance
display.setTextColor(WHITE);
display.clearDisplay();
display.setTextSize(2);
display.setCursor(0, 10);
display.print(volt/100,1); // explication: valeur diviser par 100 et (,1) pour afficher un chiffre apres le point
display.print(" Volts");
display.setCursor(25, 40);
display.print("Meter");
display.display();
delay(100);
{
unefois=false;
}
}
}
Если что-то не получится, пишите в комментариях, постараюсь помочь.
Спасибо за внимание и до новых встреч!
Внимание: если вы читаете эту статью в "Одноклассниках" - знайте, весь контент внутри "Одноклассников" под авторством "Меандр Радиолюбитель", скопирован "Одноклассниками" очень хитрым способом. Все ссылки внутри статей, будут вас водить по скопированным статьям, там же в "Ок.ru". Там вы не сможете задать мне вопрос по интересующей теме, а так же, все ваши лайки/дизлайки так и останутся незамеченными мною на ресурсе с которого "ОК" это всё умыкнул. Так-что если хотите взаимодействовать с оригинальным контентом в первоисточнике, переходите по этой ссылке на мой Дзен канал и там, уже внутри канала, читайте, комментируйте, оценивайте.