#define power 8 //пин который опрашивает кнопку включения
#define OFF 14//пин который управляет ключем питания
#define timepowerON 50 //время удержания кнопки выключения
#define levo 13 //кнопка ЛЕВО(можно любой пин)
#define ok 12 //кнопка ОК(можно любой пин)
#define pravo 11 //кнопка ПРАВО(можно любой пин)
#define akb A5 //любой своюодный аналоговый пин для измерения напряжения АКБ
Конкретно D8(пин который опрашивает кнопку включения) на схеме не показан
Дак дисплей этот очень долго так работал. Тем более на плате у самого дисплея распаяны делители. Я переписал прогу под него, запустил и все. Кирдык ему. Могу поделиться скетчем убицом таких дисплеев)))) Или может он мехаеически пострадал. В общем не до конца понятно что случилось)
Здравствуйте, сделал осциллограф с усилителем и смещением нуля, возникла проблема как измерить напряжение входного сигнала? Может у кого нибудь есть идеи? https://youtu.be/si_QmqxYATE
Наткнулся тут на старинький скетч От Electronik83 ver 17032017, попробовал в работе - довольно шустрый. От себя заменил терминал на меню контрастности и вкл. откл. подсветки с сохранением в EEPROM. Работает, но уже немного с задержкой из меню переходит в подменю))). Скетч для 5110 (делитель 100к10к), если кому не лень, то работа над ошибками приветствуется.
Ну ещё полезно тем кто любит рисовать Image2Bitmap
//Страница проэкта http://srukami.inf.ua/pultoscop_v25110.html
// ---------------------------------------------------------------
// От Electronik83 (mailto: gsmkillersevsk@mail.ru): ver 17032017
// 1. В режиме генератора PWM в процентах в целых числах (без дробей), нарисовал график сигнала PWM
// 2. В генераторе пофиксил/оптимизировал вывод частоты (1000 герц не показывало)
// 3. Автоматическое определение схемы подключения кнопок (при включении лучше ничего не нажимать:) :
// a). Как у автора - кнопки к питанию и резюки на массу
// b). Как я хочу - кнопки к земле и без всяких резюков
// 4. Отправил вэйвы для DDS генератора во флэш - оперативы больше стало свободной
// 5. Реализовал перезапуск при зажатии кнопок "+" и "-" (из осцилла не работает (не знаю, как исправить!))
// 6. Убрал развертки 7 и 8 (программное растягивание)
// 7. На DDS - генераторе видно форму выводимого сигнала, оптимизировал, сделал свои формы - ваще клевый стал...
// 8. Переделал меню генератора - вроде удобней стало.
// 9. В терминале можно выбирать стандартные скорости
// 10. Координально переделал некоторые куски кода, например - вывод меню....
// 11. От smokok, заменил терминал на меню контрастности и вкл. откл. подсветки с сохранением в EEPROM
// 12. Сломал перезагрузку менюхи кнопками + и -, но прошива очень шустрая однако!!!
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
#include <FreqCount.h>
#include <PWM.h>
#include <EEPROM.h>
// ---- UserSpace ---- //
// Подключение дисплея
// (clk(scl, sck), din(sda, mosi), dc, ce (cs), rst)
#define Ekran 8 //Экран/////////////////////////////////Подсвет
Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 4, 3, 2); // пины к которым подключен дисплей
// #define contrast 52 // контрастность дисплея////////////////////////////////////////
#define key_down 11 // кнопка минус (можно любой пин)
#define key_ok 12 // кнопка ОК (можно любой пин)
#define key_up 13 // кнопка плюс (можно любой пин)
#define akb A5 // любой свободный аналоговый пин для измерения напряжения АКБ
#define overclock 16 // частота на которой работает Ардуино
float VCC=5.10; // напряжение питания, меряем мультиметром
// ---- UserSpace_End ---- //
// A3 !! // пин подключиния входа осцилла (для отображения формы сигнала)
// D5 !! // пин подключиния входа осцилла (для аппаратного измерения частоты через таймер (в FreqCount.h))
#define led 9 // пин для генератора сигналов (не менять)
#define dds 10 // пин для генератора dds (не менять)
// ---- Глобальные переменные ---- //
byte contrast;
byte Set=0; ///////////////////////Экран/////////////////////////////////
bool BL; /////////////////////////Экран///////////////////////////////
bool flag_key; // нужно для разных подключений кнопок
byte mode=0; // режим работы прибора
byte menu=0; // подменю
const char* const modeStr[] PROGMEM= { " Осциллоскоп ", "PWM-генератор", "DDS-генератор", "* * Экран * *"};
// ---- Переменые для осциллоскопа ---- //
#define BUFSIZE 700
byte adcBuf[BUFSIZE]; // буфер проебразований АЦП
byte syncLevel=30; // уровень синхронизации 0 до 255
byte razv=6; // развертка
bool pause=0; // флаг режима паузы
bool opornoe=0; // флаг опорного напряжения
int pauseOffset=0; // смещение графика в режиме паузы (прокрутка)
long count=0; // для подсчета частоты сигнала
// bool magnify=0; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// ---- Переменные для генератора ---- //
unsigned long stepFreq=0;
int PWM = 50; // стартовое значение ШИМ от 0 до 100 для генератора
unsigned long freq = 500; // стартовое значение частоты в Гц для генератора
void ShowMode(char m, char y) {
display.setCursor(3, y);
switch (m) {
case 0: display.print(modeStr[0]); break;
case 1: display.print(modeStr[1]); break;
case 2: display.print(modeStr[2]); break;
case 3: display.print(modeStr[3]); break;
}
}
void ShowModeInv(char y) {
display.setTextColor(WHITE, BLACK);
display.setCursor(0, y); display.println(" "); display.setCursor(77, y); display.println(" "); // для красоты только
ShowMode(mode, y);
display.setTextColor(BLACK);
}
// ==== Инициализация всего :) ==== //
void setup() {
delay(300); // ждем, пока питание устаканится (меньше глюков чтоб потом ловить)
////////////////////////////Экран//////////////////////////////
// Примечание. Экран становится темным, решение проблемы.///////////////////////////////////////
// EEPROM.write(0, 50); // Записать закрытую строку, Обновить и начать использовать.
contrast = EEPROM.read(0);
BL = EEPROM.read(1);
pinMode(Ekran, OUTPUT);
digitalWrite(Ekran, BL);
byte key_test=0;
digitalWrite(key_up, HIGH); digitalWrite(key_down, HIGH); digitalWrite(key_ok, HIGH);
if (digitalRead(key_up)) key_test++;
if (digitalRead(key_down)) key_test++;
if (digitalRead(key_ok)) key_test++;
if (key_test>1) {
flag_key=0;
}
else {
digitalWrite(key_up, LOW); digitalWrite(key_down, LOW); digitalWrite(key_ok, LOW);
flag_key=1;
}
display.begin();
display.setContrast(contrast);
while(flag_key-digitalRead(key_ok)) {
display.clearDisplay();
//////////////////////////////////////////////////////
// автодетект кнопок
byte key_test=0;
//pinMode(key_up, INPUT); pinMode(key_down, INPUT); pinMode(key_ok, INPUT);
// подтянули кнопки к питанию
digitalWrite(key_up, HIGH); digitalWrite(key_down, HIGH); digitalWrite(key_ok, HIGH);
// автодетект подключения кнопок при включении..
if (digitalRead(key_up)) key_test++; // если подтяжка к питанию осталась (не стоят резюки на массу) - плюсуем
if (digitalRead(key_down)) key_test++; // если подтяжка к питанию осталась (не стоят резюки на массу) - плюсуем
if (digitalRead(key_ok)) key_test++; // если подтяжка к питанию осталась (не стоят резюки на массу) - плюсуем
if (key_test>1) { // определили подключение кнопок на массу
flag_key=0;
}
else { // определили подключение кнопок на питание + резюки на массу
digitalWrite(key_up, LOW); digitalWrite(key_down, LOW); digitalWrite(key_ok, LOW); // убрали подтяжку
flag_key=1;
}
// если автодетект работает неверно (менюха скачет постоянно), то нужно расскомментировать одну из следующих строчек:
// flag_key = 0; // кнопки просто подключены к земле, резюков нету.
// flag_key = 1; // кнопки подключены к питанию и резюки на землю
while(flag_key-digitalRead(key_ok)) { // выводим меню, пока не выбран режим работы прибора
display.clearDisplay(); // чистим дисплей
// выводим главное меню
for (char i=0; i<4; i++) {
if (i==mode) ShowModeInv(i*10); else ShowMode(i, i*10);
}
delay(50);
display.setCursor(12,40); display.print("Бат="); // выводим напряжение батареи
display.print(analogRead(akb)*VCC/1024);
display.print("v");
// перемещаемся по меню
if (flag_key-!digitalRead(key_up) ) { mode++; if (mode>3) mode=0; delay(100); }
if (flag_key-!digitalRead(key_down)) { mode--; if (mode == 0xFF) mode=3; delay(100); }
display.display(); // выводим все на экран
}
// выбран режим работы...
if (mode==0) FreqCount.begin(1000);
if (mode==1) { InitTimersSafe(); SetPinFrequencySafe(led, freq); }
if (mode==2) { InitTimersSafe(); SetPinFrequencySafe(led, 200000); }
delay(200);
}
}
// безконечный цикл - по сути прыгаем в подпрограммы
void loop() {
if (mode==0) Oscill(); // "выпадаем" в осцилл
if (mode==1) Generator(); // "выпадаем" в генератор
if (mode==2) DdsGenerator(); // "выпадаем" в DDS генератор
if (mode==3) Menu_ekrana(); // "выпадаем" в Menu Экрана
}
// читаем с АЦП данные и помещаем их в буфер...
void ReadAdc() {
if (razv) { // (razv>0) // если развертка без задержек всяких
ADCSRA = 0b11100000 | (8-razv); // установили делитель (/2 - не работает, так что начинаем с /4)
for(int i=0; i<BUFSIZE; i++) { // цикл для чтения
while ((ADCSRA & 0x10)==0); // ждем готовность АЦП
ADCSRA|=0x10; // запускаем следующее преобразование
adcBuf[i]=ADCH; // записываем данные в массив
}
} else { // развертка с задержками (delay)
ADCSRA = 0b11100111; // делитель на /128
for(int i=0; i<BUFSIZE; i++) { // цикл для чтения
while ((ADCSRA & 0x10)==0); // ждем готовность АЦП
ADCSRA|=0x10; // запускаем следующее преобразование
// delayMicroseconds(500); // делаем задержку /////////////спасибо, ArduinoFart///////////////////////
adcBuf[i]=ADCH; // записываем данные в массив
}
}
}
//////////////////////////////// РЕЖИМ ОСЦИЛЛОСКОПА//////////////////////////////
void Oscill() {
if(opornoe) ADMUX = 0b01100011; // выбор внешнего опорного
else ADMUX = 0b11100011; // выбор внутреннего опорного 1,1В
delay(100);
if(!pause) ReadAdc(); // если паузы нет, то считываем сигнал в буфер
// определение точки синхронизации
bool flagSync=0; // флаг, когда сигнал ниже уровня синхронизации
int syncOffset=0; // смещение для вывода с синхронизацией
// считаем максимальное и минимальное значение сигнала (для вывода на экран)
byte Vmax=0, Vmin=255; // тут будем хранить максимальное и минимальное напряжение
for(int y=0; y<BUFSIZE; y++) { if(Vmin>adcBuf[y]) Vmin=adcBuf[y]; if(Vmax<adcBuf[y]) Vmax=adcBuf[y]; }
//syncLevel = (Vmax-Vmin) / 2 + Vmin;
// считаем смещение графика по уровню синхронизации
for(int y=0; y<BUFSIZE-80; y++) {
if(adcBuf[y]<syncLevel) flagSync=1;
if(flagSync && adcBuf[y]>syncLevel) { syncOffset = y; break; }
}
// отрисовка графика
display.clearDisplay(); // чистим дисплей
byte x=3; // задаем смещение графика немного вправо
if(pause) { // если в режиме паузы, то рисуем с прокруткой...
display.drawLine(pauseOffset/8,8,pauseOffset/8+6,8, BLACK); //шкала прокрутки
display.drawLine(pauseOffset/8,9,pauseOffset/8+6,9, BLACK); //шкала прокрутки
for(int y=pauseOffset; y<pauseOffset+80; y++) { // рисуем форму сигнала
display.drawLine(++x, 47-adcBuf[y]/7, x+1, 47-adcBuf[y+1]/7, BLACK); //линия сигнала/////////
//display.drawLine(x+1, 47-adcBuf[y]/7+1, x+2, 47-adcBuf[y+1]/7+1, BLACK); //тоньше линия сигнала/////////
}
} else { // если паузы нет, то рисуем немного по другому))..
display.fillCircle(80,47-syncLevel/7, 2, BLACK); //рисуем уровень синхронизации
for(int y=syncOffset; y<syncOffset+80; y++) { // рисуем форму сигнала
display.drawLine(++x, 47-adcBuf[y]/7, x+1, 47-adcBuf[y+1]/7, BLACK); //линия сигнала/////////
//display.drawLine(x+1, 47-adcBuf[y]/7+2, x+1, 47-adcBuf[y+1]/7+1, BLACK); //тоньше линия сигнала/////////
}
}
// отрисовка сетки
for(byte i=47;i>5;i-=7) { display.drawPixel(0, i, BLACK); display.drawPixel(1, i, BLACK); display.drawPixel(2, i, BLACK); }
for(byte i=47;i>5;i-=3) { display.drawPixel(21,i, BLACK); display.drawPixel(42,i, BLACK); display.drawPixel(63,i, BLACK); }
for(byte i=3;i<84;i+=3) { display.drawPixel(i,33, BLACK); display.drawPixel(i,19, BLACK); }
// отрисовка menu
display.setCursor(0,0);
if (menu==0) {
display.setTextColor(WHITE, BLACK);
if(flag_key-!digitalRead(key_down) || flag_key-!digitalRead(key_up)) { opornoe=!opornoe; }
} else display.setTextColor(BLACK);
if(opornoe) display.print(VCC,1); else display.print("1.1");
if (menu==1) {
display.setTextColor(WHITE, BLACK);
if(flag_key-!digitalRead(key_down)) { razv--; if(razv==255) razv=6; }
if(flag_key-!digitalRead(key_up) ) { razv++; if(razv==7) razv=0; }
} else display.setTextColor(BLACK);
display.print(" "); display.print(razv);
if (menu==2) {
display.setTextColor(WHITE, BLACK);
pause=1;
if(flag_key-!digitalRead(key_down)) { pauseOffset-=27; if(pauseOffset<0) pauseOffset=0; }
if(flag_key-!digitalRead(key_up) ) { pauseOffset+=27; if(pauseOffset>619) pauseOffset=619; }
} else display.setTextColor(BLACK);
display.print("~");
display.setTextColor(BLACK);
if(menu==3) {
pauseOffset=0;
pause=0;
if(flag_key-!digitalRead(key_down)) { syncLevel-=20; if(syncLevel<20) syncLevel=20; }
if(flag_key-!digitalRead(key_up) ) { syncLevel+=20; if(syncLevel>230) syncLevel=230; }
display.fillCircle(80,47-syncLevel/7, 5, BLACK);
display.fillCircle(80,47-syncLevel/7, 2, WHITE);
}
if (flag_key-!digitalRead(key_ok)) { menu++; if(menu==4) { menu=0; pause=0; }}//перебор меню
// забираем частоту сигнала, полученную аппаратно (через таймер)
if (FreqCount.available()) count = FreqCount.read(); // забираем по готовности счетчика
// считаем программно частоту сигнала
byte Freq1=0;
long Freq=0;
bool flagFreq1=0, flagFreq2=0, flagFreq3=0;
for(int y=1; y<255; y++) {
if(!flagFreq1 && adcBuf[y]<syncLevel) flagFreq2=1; // тут можно че то оптимизировать, тока не могу понять, что [El83]
if(!flagFreq1 && flagFreq2 && adcBuf[y]>syncLevel) { flagFreq1=1; Freq1=y; }
if( flagFreq1 && adcBuf[y]<syncLevel) flagFreq3=1;
if( flagFreq3 && adcBuf[y]>syncLevel) {
switch (razv) { // тут позже оптимизирую! ////////!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!11
case 6: Freq=1000000/((y-Freq1-1)*3.27); break; // делитель 4
case 5: Freq=1000000/((y-Freq1)*3.27)/2; break; // делитель 8
case 4: Freq=1000000/((y-Freq1)*3.27)/4; break; // делитель 16
case 3: Freq=1000000/((y-Freq1)*3.27)/8; break; // делитель 32
case 2: Freq=1000000/((y-Freq1)*3.27)/16; break; // делитель 64
case 1: Freq=1000000/((y-Freq1)*3.27)/32; break; // делитель 128
case 0: Freq=1000000/((y-Freq1)*500); break; // делитель 128
}
flagFreq1=0; flagFreq3=0;
}
}
// отрисовка частоты сигнала
if (opornoe && ((Vmax*VCC/255)>2.5)) count=count*(overclock/16.0);
else count=Freq *(overclock/16.0);
if (count<1000) { display.print(" "); display.print(count); display.print("Hz"); }
else { display.print(count/1000.0, 1); display.print("KHz"); }
// отрисовка максимального напряжения сигнала
display.setCursor(0,40);
if (opornoe) display.print(Vmax*VCC/255*11.15,1); else display.print(Vmax*1.1/255*11.15,1);
display.print("v");
//delay(200);
display.display(); // вываливаем все на экран
}
//////////////////////////////// РЕЖИМ ГЕНЕРАТОРА//////////////////////////////
void Generator() {
// обработка кнопок и отрисовка одновременно
display.clearDisplay();
ShowModeInv(0);
if(flag_key-!digitalRead(key_ok)) { if(menu++==7) menu=0; delay(200); } // переходим по разрядам / меняем ШИМ
if (menu==7) { // меняем ШИМ
if(flag_key-!digitalRead(key_down)) { PWM--; if(PWM<0) PWM=100; delay(200); }
if(flag_key-!digitalRead(key_up)) { PWM++; if(PWM>100) PWM=0; delay(200); }
pwmWrite(led, PWM*2.55); // задали ШИМ
display.setTextColor(WHITE, BLACK); // если меняем шим, то рисуем его инверсным
display.drawLine(15, 39, 68+(PWM==100?6:0)+(PWM<10?-6:0), 39, BLACK); // сверху полоска для большей инверсности
} else { // меняем частоту
if(flag_key-!digitalRead(key_down)) {
if (freq>stepFreq) freq-=stepFreq; // не даем выйти за допустимый диаппазон
SetPinFrequencySafe(led, freq/(overclock/16.0)); // задали частоту
delay(200); // задержка для кнопок
}
if(flag_key-!digitalRead(key_up)) {
if ((freq+stepFreq)<10000000) freq+=stepFreq; // не даем выйти за допустимый диаппазон
SetPinFrequencySafe(led, freq/(overclock/16.0)); // задали частоту
delay(200); // задержка для кнопок
}
display.setTextColor(BLACK); // если ШИМ не меняем, то выбираем обычный текст
#define XFREQ 12 // ======== // и, выделяем декаду частоты полосочками
stepFreq=pow(10, (byte)menu); if (menu>1) stepFreq++; // устраняем глючность pow, почему 10 в степени 2 = 99?
byte menu_t = menu; if (menu>2) menu_t++; if (menu==6) menu_t++; // делаем табуляцию частоты
menu_t = 54 - menu_t * 6; // считаем положение полосочек
display.drawLine(menu_t, XFREQ-2, menu_t+4, XFREQ-2, BLACK); // рисуем полоски
display.drawLine(menu_t, XFREQ-3, menu_t+4, XFREQ-3, BLACK);
display.drawLine(menu_t, XFREQ+8, menu_t+4, XFREQ+8, BLACK);
display.drawLine(menu_t, XFREQ+9, menu_t+4, XFREQ+9, BLACK);
}
// рисуем уровень ШИМ (инверсия текста задана ранее)
display.setCursor(15, 40); // ставим курсор))
display.print(" PWM="); display.print(PWM); display.print("% "); // выводим уровень ШИМ
display.setTextColor(BLACK); // убираем инверсию при выводе частоты
// рисуем частоту с табуляцией
display.setCursor(6, XFREQ);
for (unsigned long freq_t = 1000000; freq_t>0; freq_t/=10) {
if (freq>=freq_t) {
display.print((freq/freq_t)%10); if (freq_t==1000000 || freq_t==1000) display.print("'"); } else {
display.print("_"); if (freq_t==1000000 || freq_t==1000) display.print(" "); }
}
display.print(" Hz");
// отрисовка графика PWM
for (char x=17; x<67; ) {
if (PWM!=0) display.drawLine(x, 25, x+PWM/4, 25, BLACK); x+=PWM/4; // верх
if (PWM!=0 && PWM!=100) display.drawLine(x, 25, x, 36, BLACK); // спад
if (PWM!=100) display.drawLine(x, 36, x+25-PWM/4, 36, BLACK); x+=25-PWM/4; // низ
if (PWM!=0 && PWM!=100 && x<43) display.drawLine( x, 36, x, 25, BLACK); // подъем
}
display.display(); // вываливаем буфер на дисплей
}
//////////////////////////////// DDS генератор//////////////////////////////
void DdsGenerator() {
static const byte ddsWave[][32] PROGMEM = {
2,10,21,37,57,79,103,127,152,176,198,218,234,245,253,255,253,245,233,218,198,176,152,128,103,79,57,37,21,10,2,0, // El83_sinNew
16,32,48,64,80,96,112,128,143,159,175,191,207,223,239,255,239,223,207,191,175,159,143,128,112,96,80,64,48,32,16,0, // El83_treugNew
8,16,25,33,41,49,58,66,74,82,90,99,107,115,123,132,140,148,156,165,173,181,189,197,206,214,222,230,239,247,255,0, // El83_pilaNew
255,247,239,230,222,214,206,197,189,181,173,165,156,148,140,132,123,115,107,99,90,82,74,66,58,49,41,33,25,16,8,0 }; // El83_pilaObrNew
const char* const ddsStr[] PROGMEM = { " Синус", " Треугольник", " Пила", "Обратная пила"};
byte ddsCount=0;
// Рисуем DDS-генератор
display.clearDisplay();
ShowModeInv(0);
for (byte i=0; i<84;) display.drawLine(i, 37-pgm_read_byte(&ddsWave[menu][i%32])/9, i, 37-pgm_read_byte(&ddsWave[menu][(i++)%32])/9, BLACK);
display.setCursor(3, 40); display.print(ddsStr[menu]); display.display(); // отрисовали все
// выводим выбранный сигнал, пока не нажали кнопку
while(flag_key-digitalRead(key_up) && flag_key-digitalRead(key_down) && flag_key-digitalRead(key_ok)) {
pwmWrite(dds, pgm_read_byte(&ddsWave[menu][(ddsCount++)&0x1F]));
}
if (++menu==4) menu = 0; // нажали кнопку - переключаем режим
delay(200); // чтоб кнопки нормально нажимались
}
//////////////////////////////Экран/////////////////////////////////
void Menu_ekrana() {
Set=0;delay(300);
while (flag_key-digitalRead(key_ok)){
display.clearDisplay();
if (Set == 0) display.setTextColor(WHITE, BLACK); else display.setTextColor(BLACK);
display.setCursor(0 , 0); display.println("Контраст:"); display.setTextColor(BLACK);
display.setCursor(60 , 0); display.println(contrast);
display.setCursor(0 , 10); display.println("Подсветк:"); display.setTextColor(BLACK);
if (BL == 1) { display.setCursor(60 , 10); display.println("Вкл");} else
{ display.setCursor(60 , 10); display.println("Отк");} display.display();
if (flag_key-!digitalRead(key_up)) contrast++;
if (flag_key-!digitalRead(key_down)) contrast--;
if (contrast<30) contrast=30;
if (contrast>70) contrast=70;
display.setContrast(contrast);
delay(150);
}
Set=1; delay(300);
while (flag_key-digitalRead(key_ok)){
display.clearDisplay();
display.setCursor(0 , 0); display.println("Контраст:");
display.setCursor(60 , 0); display.println(contrast);
if (Set == 1) display.setTextColor(WHITE, BLACK); else display.setTextColor(BLACK);
display.setCursor(0 , 10); display.println("Подсветк:"); display.setTextColor(BLACK);
if (BL == 1) { display.setCursor(60 , 10); display.println("Вкл"); digitalWrite(Ekran, BL); } else
{ display.setCursor(60 , 10); display.println("Отк"); digitalWrite(Ekran, BL); }
if (flag_key-!digitalRead(key_up)) BL=1;
if (flag_key-!digitalRead(key_down)) BL=0;
display.display();
delay(150);
}
display.display();
display.clearDisplay();
EEPROM.write(0, contrast);
EEPROM.write(1, BL);
setup();
}
Значит уже не нужно))). Ну прошивочка класс, шустрая хоть и старая. Хорошо что её нашёл, спасибо. Вот только когда добавил сохранение настроек экрана в епром, то посыпались ошибки при сборке на код перезапуск кнопками, пришлось вырезать не разобравшись. И из главного меню включение какого нибудь режима нужно кнопку давить около секунды. Может что в код дописать нужно? Цыфры менял, результат не увидел. Посмотри пожалуйста.
<Может кто к такому экрану подключал LCR-T4(T3)NoStripGrid ? Было бы удобно два в одном и от двух атмег
Добрый вечер. Начал с фото (т.к. первый раз и не был уверен, что получится), но после фото комментарий не вписывается; пишу отдельно. В таком корпусе собрал пультоскоп. Питание от внешнего БП (9 вольт), щуп из двухкубового шприца. Почему-то от вспышки на дисплее пропадает изображение: приходится выключить и включить питание чтобы изображение появилось. А это макет-демоверсия.
Корпус от выпрямителя для волос. Дисплей по центру приложить не получилось (ножки не дают), но я думаю идея понятна. А ещё нашёл я как-то нерабочий блок розжига ксеноновых ламп фирмы michi. В металлическом корпусе плата залита рыхлым компаундом; его я удалил отвёрткой. Плату можно вставить свою и сделать пультоскоп. А у ардуино DUE - один мегасемпл в секунду. Если хочется больше - нужен внешний АЦП. Например как в схеме Импульс-5110 на сайте РАДИОСКОТ.
Подскажите, пожалуйста, куда подключать обозначенный на схеме pultoscop v2 пин "А6 - АКБ"?
Замеры производить щупами на пине А5 и пине А6?
FCC- понятно, питание сталилизированное.
Подождём))). Тема хорошая, особенно для переменного делителя.
Запустил экранчик от Нокия 6210 (96х60) на Adafruit_PCD8544.h. Распиновка подошла от 3310 (8 пин). Немного полазил по библиотеке, но ни как не удаётся убрать мусор в низу экрана и в режиме осцила происходит бутлуп экрана. Жалко что библиотека не подходит.
Подождём))). Тема хорошая, особенно для переменного делителя.
Запустил экранчик от Нокия 6210 (96х60) на Adafruit_PCD8544.h. Распиновка подошла от 3310 (8 пин). Немного полазил по библиотеке, но ни как не удаётся убрать мусор в низу экрана и в режиме осцила происходит бутлуп экрана. Жалко что библиотека не подходит.
Мусор почти весь убрал, остался только немного с права, постоянно движется типо не четко дублируя вольтаж батареи, осталось победить экран, (победил))) и естественно пересовать сетку и график под разрешение 96х60.
D5- для частотомера
C3-аналоговый вход для пультоскопа
D5- для частотомера
C3-аналоговый вход для пультоскопа
Спасибо за оперативный ответ.
Замечу, что на сайте http://srukami.inf.ua/pultoscop_v25110.html в схеме либо коде есть неточности
Конкретно D8(пин который опрашивает кнопку включения) на схеме не показан
В функции setup() А4 настроен на вход. Возможно речь о А5 (АКБ)
Код взят с сайта
Да и настроек пинов кнопок тоже не заметил
а зачем А5 настраивать на вход?
Я пробовал пультоскоп на Massduino UNO LC c тактовой частотой 16 Ьгц.
Получил,можно ваш скетч?
Работоспособна схема при питании ардуины строго +5 вольт. ....
Тут теряется весь смысл измерения напряжения питания arduino .
Я пошел другим путем - взял за основу код от форумчанина DIMAX, за что ему спасибо - ТУТ .
Измерение производится внутренней коммутацией, не используя внешние аналоговые входы, причем довольно точно.
Заинтересовало, только так и не смог ничего измерить. В порт выводит inf
..... ((((((
Спасибо!
Много знакомых строчек))) Рекомендую спрятать в спойлер.
В транзистор тестере не такой ли экран стоит?
И вообще, хорошим тоном считается указывать под какой экран заточен скейтч.
Хоть пару строк описания....
Достал после переезда коробку с ардуинами. Буду заниматься этим проектом дальше. В планах:
1. Создать мини faq (раньше давно был);
2. Перенос версии 18 на omaled ssd (забыл как называется);
3. Исправление ошибки с отображением частоты (спектрум тыкал - там как то с частотами не то);
4. Перезагрузка с кнопок.
5. Очень хочу добавить сохранение настроек всех значений пользователя в еепром! Но вышел затык с контрастом....
6. Непонятка с питанием от лития и измерения напряжений- надо разобраться.
7. Просмотрел много скейтчев - в одном из них увидел вольтметр - на кой черт он нужен?!?!
И вообще, хорошим тоном считается указывать под какой экран заточен скейтч.
Skaytch ? Слово Sketch по-русски и по-английски произносится как скетч.
Мне это слово сразу не понравилось. Приму к сведенью))))
Дисплей ST7735S.
Входные пины А3 Д8. Д8 определен библиотекой FreqMeasure. Она занимает меньше места.
Функция ZAMER для massduino и wemos NANO у меня заработала только в таков виде, хотя это одно и тоже
парни добрый день кто подскажет как можно сделать может кто делал развертку (сек/дел) больше чем у оригинала?
мне просто надо что бы было 1-2 сек на деление
Дак в моей версии там есть.....
а где ознакомится можно?
https://yadi.sk/d/OWt4M28A3ULLcf
Последняя нормальная версия... для 5110
спасибо я посматрел но на 0 тоже самое ( а это много
спасибо я посматрел но на 0 тоже самое ( а это много
Там отдельный режим сделан - снятие АЧХ. Он медленный.
да спасибо нашел)
Чет у меня походу SSD1306 накрылся..... блин я в печали... хотел переписать под него и не работатет экранчик....
вот блин а я так ждал.... и что теперь делать? как по мне этот экран рожден для пультоскопа.
эх.. и я ждал (
Чет у меня походу SSD1306 накрылся..... блин я в печали... хотел переписать под него и не работатет экранчик....
подикась напрямую к ардуине зацепляли , без делителей ?
MIK22, вроде massduino может работать на 32МГц ? по идее , после заливки скетча с настройками надо перепаять кварц, должно заработать.
Дак дисплей этот очень долго так работал. Тем более на плате у самого дисплея распаяны делители. Я переписал прогу под него, запустил и все. Кирдык ему. Могу поделиться скетчем убицом таких дисплеев)))) Или может он мехаеически пострадал. В общем не до конца понятно что случилось)
Здравствуйте, сделал осциллограф с усилителем и смещением нуля, возникла проблема как измерить напряжение входного сигнала? Может у кого нибудь есть идеи? https://youtu.be/si_QmqxYATE
Буду благодарен за любую информацию
сомневаюсь, что можно программно убить дисплей, поэтому готов рискнуть одним из своих)
Дисплеи умирают от того, что не рассчитаны на работу с 5-вольтовыми МК. Недавно писал как узнать совместимый с 5в дисплей.
я сразу себе делители поставил.
dimax
Разрещите обратиться к Вам в личку.
MIK22, тут лички нет :)
Наткнулся тут на старинький скетч От Electronik83 ver 17032017, попробовал в работе - довольно шустрый. От себя заменил терминал на меню контрастности и вкл. откл. подсветки с сохранением в EEPROM. Работает, но уже немного с задержкой из меню переходит в подменю))). Скетч для 5110 (делитель 100к10к), если кому не лень, то работа над ошибками приветствуется.
Ну ещё полезно тем кто любит рисовать Image2Bitmap
удалил
а точно делитель 100/10k? а то что то показания у меня не правильные по напряжению.
ложная тревога. поставил делитель 20/2k и теперь все ок. по ошибке не тот резистор попал.
по ошибке не тот резистор попал.
Ребята, как вернуть развёртку 7 - 8 в тот скетч что выше? И почему через делитель не ту частоту показывает?
Развертку 7...8 я вырезал. Это по сути 6-ая развертка с растягиванием формы сигнала. Зачем это нужно то?
<Может кто к такому экрану подключал LCR-T4(T3)NoStripGrid ? Было бы удобно два в одном и от двух атмег
Добрый вечер. Начал с фото (т.к. первый раз и не был уверен, что получится), но после фото комментарий не вписывается; пишу отдельно. В таком корпусе собрал пультоскоп. Питание от внешнего БП (9 вольт), щуп из двухкубового шприца. Почему-то от вспышки на дисплее пропадает изображение: приходится выключить и включить питание чтобы изображение появилось. А это макет-демоверсия.
Корпус от выпрямителя для волос. Дисплей по центру приложить не получилось (ножки не дают), но я думаю идея понятна. А ещё нашёл я как-то нерабочий блок розжига ксеноновых ламп фирмы michi. В металлическом корпусе плата залита рыхлым компаундом; его я удалил отвёрткой. Плату можно вставить свою и сделать пультоскоп. А у ардуино DUE - один мегасемпл в секунду. Если хочется больше - нужен внешний АЦП. Например как в схеме Импульс-5110 на сайте РАДИОСКОТ.
Вообще-то, масштабирование убивает напрочь разрешение адц. Лучше на Aref через RC подавать ШИМ с PWM вывода самой ардуино. На много лучше получится.
Подскажите, пожалуйста, куда подключать обозначенный на схеме pultoscop v2 пин "А6 - АКБ"?
Замеры производить щупами на пине А5 и пине А6?
FCC- понятно, питание сталилизированное.
Спасибо.
Ребята, помогите пожалуйста реализовать код в скетч для подачи звукового сигнала предупреждения при превышении 5 Вольт на щуп.
Я бы помог, но на отдыхе сейчас)))
Я бы помог, но на отдыхе сейчас)))
Подождём))). Тема хорошая, особенно для переменного делителя.
Запустил экранчик от Нокия 6210 (96х60) на Adafruit_PCD8544.h. Распиновка подошла от 3310 (8 пин). Немного полазил по библиотеке, но ни как не удаётся убрать мусор в низу экрана и в режиме осцила происходит бутлуп экрана. Жалко что библиотека не подходит.
Я бы помог, но на отдыхе сейчас)))
Подождём))). Тема хорошая, особенно для переменного делителя.
Запустил экранчик от Нокия 6210 (96х60) на Adafruit_PCD8544.h. Распиновка подошла от 3310 (8 пин). Немного полазил по библиотеке, но ни как не удаётся убрать мусор в низу экрана и в режиме осцила происходит бутлуп экрана. Жалко что библиотека не подходит.
Возможно дисплей китайский ?
Возможно дисплей китайский ?
Сомневаюсь что это чистый китай, так как выдрал его из старого тела MADE BY NOKIA. Просто нужно правильно отредактировать драйвер под этот котроллер. Распиновку брал тут http://radiomaster.com.ua/uploads/posts/2009-09/thumbs/1253098427_nokia.gif
Про мусор читал тут https://radiokot.ru/articles/29/ и возможно вы найдёте решение для своего экрана 3310.
Мусор почти весь убрал, остался только немного с права, постоянно движется типо не четко дублируя вольтаж батареи, осталось победить экран, (победил))) и естественно пересовать сетку и график под разрешение 96х60.
Потому что это экран 3410. Я под него хотел сделать изначально прибор, есть парочка с телефонов. Я вроде вопрос задавал тут.
Del....