- Вход / Регистрация
Пультоскоп v.2 Осциллограф + генератор | Генератор, Осциллограф |
Пока я собрался с мыслями сделать новый портативный осциллограф, «Pultoscope» уже был на стадии разработки второй версии. Его автор, bodriy2014, адаптировал код для двух дисплеев: Nokia 3310 (китайский дисплей 5110) и цветного дисплея 240x320 SPFD5408. У меня в корпусе уже стоял дисплей от Nokia 3410, так что пришлось переделывать скетч под него. Общаясь с автором, и делая самостоятельные коррективы, получился результат, который привожу в этой статье.
Все составляющие легко поместились в имеющийся корпус.
Схема осциллографа «Pultoscope v.2» не сложная, проста в сборке. В отличии от стандартной сборки, я добавил в нее встроенный делитель 1:3, под который заточил программный код. При необходимости, можно добавить в нее дополнительные делители, усилители и т.д. Единственное, что хочу отметить, для портативной версии лучше собирать преобразователь питания на микросхеме типа MC34063, т.к. китайский DC-DC повышающий преобразователь показал себя не в лучшем виде. В частности, при разгоне arduino mini и замене кварца до 25Mhz, падала стабильность устройства, уходила нулевая линия отображения сигнала и проявлялись прочие проблемы, которые не наблюдались при включении от стабильного сетевого источника питания. По этим причинам я оставил свою версию прибора без замены кварца, хотя у автора установлен кварц с частотой 27Mhz.
Рассматривая дисплей «пультоскопа» в режиме работы осциллографа, можно выделить информативных 10 полей. 1 – шкала отображения вольтажа, имеет автоматические градации 0-1v, 0-5v, 0-15v, 0-3.3v (при опорном напряжении 1.1v). 2 – поле с сеткой, подстраиваемой под шкалу 1, на котором отображается график сигнала. 3 – максимальное напряжение просматриваемого сигнала. 4 – частота сигнала до 2MHz. Частота сигнала до 1.8 вольт измеряется программным способом, свыше – аппаратным (более точным). 5 – первый пункт меню, выбор опорного напряжения (5 или 1.1v). 6 – второй пункт меню, выбор развертки (0-8). 7 – третий пункт, масштаб (1:1, 2:1, 3:1). 8 – четвертый пункт, позиционирование (1-9). Позиционирование поднимает или опускает график сигнала. 9 – пятый пункт, режим паузы. 10 – шестой пункт, синхронизация.
В режиме генератора 3 информативных поля. 1 – отображение ШИМ в процентах; 2 – отображение генерируемой частоты; 3 – выбор множителя для изменения частоты или переключение изменения ШИМ.
Хочу отметить такой момент, что проект «Пультоскоп» не стоит на месте и планируется разработка новой (третьей) версии. В ней должен присутствовать внешний АЦП, возможно, встроенный ОУ и прочие необходимые доработки.
Файлы печатной платы осциллографа / генератора в формате *.lay6, скетч - *.ino и необходимые библиотеки для работы с дисплеем от Nokia 3410 выкладываю отдельным архивом ЗДЕСЬ.
tolya10, Не выбирает, т.к. в коде идет сравнение и значение "2" никак не получить таким путем:
if(digitalRead(levo)==HIGH){delay(200);pultoskop=!pultoskop;}
if(digitalRead(pravo)==HIGH){delay(200);pultoskop=!pultoskop;}
Пробуйте вставить код из файла: ptscp_3410_new_func.ino. Я здесь "набросал" так, как бы сделал сам, но не проверял. Пины прописывайте свои.
Спасибо огромное!!!! Так как Вы написали не заработало, НО я обратил внимание на выскакивающую ошибку nvalid use of Boolean expression as operand to 'operator--' ну методом тыка начал смотреть почему -- не работает. Если я ставил -1 или +1 то меню работало но более 2-х пунктов опять не выбирало. Короче открыл ваш и автора скетчи и начал сравнивать построчно и НАШЕЛ почему меню не идет дальше у Вас прописано bool pultoskop=1; //флаг выбора генератора или осциллографа у автора byte pultoskop=0; //флаг выбора генератора или осциллографа после смены bool на byte меню стало идти дальше ( но не -- и ++, а -1 и +1) короче так :
while(digitalRead(ok)==LOW){
display.clearDisplay();
display.setCursor(15,10);
display.println(utf8rus("Осциллограф"));
display.setCursor(15,20);
display.println(utf8rus("Генератор"));
display.setCursor(15,30);
display.println(utf8rus("Новая Функция"));
display.setCursor(5,55);
display.print(utf8rus("Батарея "));
display.print(batt);
display.println(utf8rus(" в"));
if(pultoskop==0) display.setCursor(5,10);
if(pultoskop==1) display.setCursor(5,20);
if(pultoskop==2) display.setCursor(5,30);
display.print(">");
display.display();
if(digitalRead(levo)==HIGH){delay(200);pultoskop=pultoskop-1;}
if(digitalRead(pravo)==HIGH){delay(200);pultoskop=pultoskop+1;}
if(pultoskop>2){pultoskop=0;}
Еще раз ОГРОМНОЕ СПАСИБО !!!
tolya10, поздравляю!
Когда получите стабильный результат, поделитесь прошивкой и пришлите пару фото. Думаю, людям будет интересно.
tolya10 пожалуйста отправить мне твой версия схема и прошивка
arthur_1993, у меня еще ни схема не прошивка не готова.но однозначно часть для осциллографа будет как здесь у admin, остальное может подтяну диодами к питанию. так сказать защита от дурака. По прошивке не могу прикрутить терминал ( нужен в ремонте) мешает утф8 шрифт надо отказываться, или курить мануалы дальше.
tolya10, Спасибо,когда закончите, поделитесь фотки
Доделал код, работает стабильно. Единственно пришлось отказаться от русского 🙁 но и так все понятно. Добавил DDS просто как рисунок синуса, пилы итд. Добавил терминал, с роутером и планшетом работает на ура, виден весь процесс загрузки. вот код:
По схеме как у best-chart только сильно плывет контраст и я подключил все выводы экрана через резистивные делители 1кОм на пин Ардуино/2кОм на землю. Терминал подключил через резистор от 300 Ом до 600 Ом и Стабилитрон на 5,1в на землю, С выводом ДДС можно заморочиться и сделать фильтр для чистоты сигнала типа так
устройство еще не готово обкатываю на макетной плате.
не те схема 🙂 И под спойлер код не прячет ;(
вот
Чего то часть кода не вставилась :(. Админ убери тот я еще вставлю или перезапиши пожалуйста.
//Страница проэкта http://srukami.inf.ua/pultoscop_v25110.html
//Переделка под дисплей от Nokia 3410 и оптимизация кода https://best-chart.ru
#include
#include
#include
#include
#include
#define led 9 //пин для генератора сигналов (Только 9й или 10й пин)
#define dds 10 // пин для генератора dds (не менять)
//#################№№№№№№####пользовательские настройки
#define levo 13 //кнопка ЛЕВО(можно любой пин)
#define ok 12 //кнопка ОК(можно любой пин)
#define pravo 11 //кнопка ПРАВО(можно любой пин)
#define akb A6 //любой свободный аналоговый пин для измерения напряжения АКБ
#define overclock 16 //Частота на которой работает Ардуино
Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 4, 3, 2);//пины к которым у вас подключен дисплей
byte cont=75;//контрастность дисплея
byte SinU=5; //уровень синхронизации 0 до 255
int PWM = 100;//стартовое значение ШИМ от 0 до 255
float fiveV = 5.13; //наши 5v, меряем мультиметром
int32_t frequency = 5000; //стартовое значение частоты в Гц
//###########################################################
float maxV = 0.0; // вычисление вольтажа
float printV = 0.0; // вывод вольтажа
float batt =0.00; // для вывода вольтажа батареи
int d=0;
const long PROGMEM ttlM[13]={300,600,1200,2400,4800,9600,19200,38400,56000,57600,115200,230400,250000};
long speedTTL=9600; //скорость терминала
byte menuTTL=0;
byte hag=0;
int mnog=0;
boolean flag=0;
byte mass[256];
byte x=0;
byte menu=0;//переменная выбора меню
bool opornoe=1; //флаг опорного напряжения
bool paus=0; //флаг режима паузы
byte pultoskop=0; //флаг выбора генератора или осциллографа
byte razv=6;
byte sinhMASS=0;
long countX=0;
byte zoom=1; //Приближение по умолчанию 1:1
byte poz=8; //Позиционирование
int koef=1; //коэффициент для синхронизации
int newpoz=0;
unsigned long count =0;
void setup(){
display.begin();
display.setContrast(cont);
display.clearDisplay();
display.setCursor(5,10);
display.setTextColor(BLACK);
display.print("Pultoscope v.");
display.setCursor(82,3);
display.setTextSize(2);
display.print("2");
display.setTextSize(1);
display.setCursor(3,30);
display.println(" For LCD 3410");
display.setCursor(10,45);
display.print("best-chart.ru");
display.setCursor(34,55);
display.print("WAIS");
batt=analogRead(akb)*fiveV/1024;
display.display();
delay(2000);
while(digitalRead(ok)==LOW){
display.clearDisplay();
display.setCursor(15,10);
display.println("Oscilloscope");
display.setCursor(15,20);
display.println("Generator");
display.setCursor(15,30);
display.println("DDS-Generator");
display.setCursor(15,40);
display.println("UART-Terminal");
display.setCursor(5,55);
display.print("Battery ");
display.print(batt);
display.println(" v");
if(pultoskop==0) display.setCursor(5,10);
if(pultoskop==1) display.setCursor(5,20);
if(pultoskop==2) display.setCursor(5,30);
if(pultoskop==3) display.setCursor(5,40);
display.print(">");
display.display();
if(digitalRead(levo)==HIGH){delay(200);pultoskop=pultoskop-1;}
if(digitalRead(pravo)==HIGH){delay(200);pultoskop=pultoskop+1;}
if(pultoskop>3){pultoskop=0;}
}
if(pultoskop==0){FreqCount.begin(1000);}
if(pultoskop==1){InitTimersSafe();bool success = SetPinFrequencySafe(led, frequency);}
if(pultoskop==2){InitTimersSafe(); bool success = SetPinFrequencySafe(led,200000);}
display.setTextColor(BLACK);
delay(500);
}
void Zamer(){
if (razv>=6){ADCSRA = 0b11100010;}//delitel 4
if (razv==5){ADCSRA = 0b11100011;}//delitel 8
if (razv==4){ADCSRA = 0b11100100;}//delitel 16
if (razv==3){ADCSRA = 0b11100101;}//delitel 32
if (razv==2){ADCSRA = 0b11100110;}//delitel 64
if (razv<2){ADCSRA = 0b11100111;}//delitel 128
if (razv==0){
for(byte i=0;i<255;i++){
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
delayMicroseconds(500);
mass[i]=ADCH;
}
}
if (razv>0){
for(byte i=0;i<255;i++){
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
mass[i]=ADCH;
}
}
}
void loop() {
if(pultoskop==0){
String text="";
byte test;
if(opornoe==0){ADMUX = 0b11100100;}//выбор внутреннего опорного 1,1В
if(opornoe==1){ADMUX = 0b01100100;}//Выбор внешнего опорного
delay(5);
if(paus==0){Zamer();}
//#######################################определение точки синхронизации
maxV = 0;
for(int y=1;y<85;y++){
if(maxV=85) koef=1;
else {
if(maxV>=17) koef=3;
else koef=15;
}
}
bool flagSINHRO=0;
bool flagSINHRnull=0;
for(int y=1;y<255;y++){
if(flagSINHRO==0){if(mass[y]*koefSinU){flagSINHRO=1;sinhMASS=y;}}
}
}
//#######################################отрисовка графика
x=10;
if (zoom==2) x=5;
if (zoom==3) x=3;
if(poz==9) newpoz=-14;
if(poz==8) newpoz=0;
if(poz==7) newpoz=7;
if(poz==6) newpoz=14;
if(poz==5) newpoz=21;
if(poz==4) newpoz=28;
if(poz==3) newpoz=35;
if(poz==2) newpoz=42;
if(poz==1) newpoz=49;
display.clearDisplay();
display.fillCircle(91,45-SinU/5.8, 2, BLACK);//рисуем уровень синхронизации
for(int y=sinhMASS;y<=95) { display.drawLine(x*zoom, (46+newpoz)-(mass[y]/5.6*koef)*zoom, (x+1)*zoom, (46+newpoz)-(mass[y+1]/5.6*koef)*zoom, BLACK); } } sinhMASS=0; //#######################################отрисовка графика for(int i=0; i<=45; i+=5) { display.drawPixel(24,i, BLACK); display.drawPixel(49,i, BLACK); display.drawPixel(74,i, BLACK); }//разметка экрана вертикальная if(opornoe==0) { for(int i=9; i<95; i+=5) { display.drawPixel(i,4, BLACK); display.drawPixel(i,17, BLACK); display.drawPixel(i,31, BLACK); } display.drawFastHLine(0,11,9, BLACK); display.drawFastHLine(0,25,9, BLACK); display.drawFastHLine(0,39,9, BLACK); display.drawChar (1, 1, '3', 1, 0, 1); display.drawChar (1, 14, '2', 1, 0, 1); display.drawChar (1, 28, '1', 1, 0, 1); } else { for(int i=45;i>=0;i=i-9){display.drawFastHLine(0,i,9, BLACK);}
for(int i=9; i<95; i+=5) {
display.drawPixel(i,18, BLACK);
display.drawPixel(i,36, BLACK);
}
display.drawChar (0, 14, '9', 1, 0, 1);
display.drawChar (0, 33, '3', 1, 0, 1);
if(maxV<85) {
display.drawChar (0, 14, '3', 1, 0, 1);
display.drawChar (0, 33, '1', 1, 0, 1);
}
if(maxV<17) {
display.drawChar (-1, 14, '.', 1, 0, 1);
display.drawChar (-1, 33, '.', 1, 0, 1);
display.drawChar (3, 14, '6', 1, 0, 1);
display.drawChar (3, 33, '2', 1, 0, 1);
}
}
//#######################################отрисовка menu
display.fillRect(0, 47, 95, 18, 0);
display.setCursor(2, 48);
display.setTextColor(BLACK);
if(opornoe==0){display.print("1");}
if(opornoe==1){display.print("5");}
display.setCursor(14, 48);
display.setTextColor(BLACK);
display.print("R:");
display.print(razv);
display.setCursor(38, 48);
display.setTextColor(BLACK);
display.print("1:");
display.print(zoom);
display.setCursor(62, 48);
display.setTextColor(BLACK);
display.print("P:");
display.print(poz);
if(menu==0){
if(digitalRead(levo)==HIGH){opornoe=!opornoe;}
if(digitalRead(pravo)==HIGH){opornoe=!opornoe;}
display.drawRect(0, 46, 9, 11, BLACK);
}
if(menu==1){
if(digitalRead(levo)==HIGH){razv=razv-1;if(razv==255){razv=0;}}
if(digitalRead(pravo)==HIGH){razv=razv+1;if(razv==9){razv=8;}}
display.drawRect(12, 46, 21, 11, BLACK);
}
if(menu==2){
if(digitalRead(levo)==HIGH){zoom=zoom-1;if(zoom==0){zoom=1;}}
if(digitalRead(pravo)==HIGH){zoom=zoom+1;if(zoom==4){zoom=3;}}
display.drawRect(36, 46, 21, 11, BLACK);
}
if(menu==3){
if(digitalRead(levo)==HIGH) {poz=poz-1;if(poz==0){poz=1;}}
if(digitalRead(pravo)==HIGH){poz=poz+1;if(poz==10){poz=9;}}
display.drawRect(60, 46, 21, 11, BLACK);
}
if(menu==4){
paus=1;
if(digitalRead(levo)==HIGH){Zamer();}
if(digitalRead(pravo)==HIGH){Zamer();}
display.drawRect(82, 46, 11, 11, BLACK);
}
if(menu==5){
paus=0;
if(digitalRead(levo)==HIGH){if(SinU>=25){SinU=SinU-20;}}
if(digitalRead(pravo)==HIGH){if(SinU<=225){SinU=SinU+20;}} display.fillCircle(91,45-SinU/5.8, 3, BLACK); display.fillCircle(91,45-SinU/5.8, 2, WHITE); } if(digitalRead(ok)==HIGH){menu++;if(menu==6){menu=0;paus=0;}}//перебор меню if (FreqCount.available()) {count = FreqCount.read();}//вывод частоты по готовности счетчика countX=count*(overclock/16.0); if(countX==0) { //#######################################частоты сигнала byte Frec1=0; int Frec=0; bool flagFrec1=0; bool flagFrec2=0; bool flagFrec3=0; for(int y=1;y<255;y++){ if(flagFrec1==0){if(mass[y]*koefSinU){flagFrec1=1;Frec1=y;}}}
if(flagFrec1==1){if(mass[y]*koefSinU){
if (razv>=6){Frec=1000000/((y-Frec1-1)*3.27);}//delitel 4
if (razv==5){Frec=1000000/((y-Frec1)*3.27)/2;}//delitel 8
if (razv==4){Frec=1000000/((y-Frec1)*3.27)/4;}//delitel 16
if (razv==3){Frec=1000000/((y-Frec1)*3.27)/8;}//delitel 32
if (razv==2){Frec=1000000/((y-Frec1)*3.27)/16;}//delitel 64
if (razv==2){Frec=1000000/((y-Frec1)*3.27)/32;}//delitel 128
if (razv==1){Frec=1000000/((y-Frec1)*3.27)/32;}//delitel 128
if (razv==0){Frec=1000000/((y-Frec1)*500);}//delitel 128
flagFrec1=0;flagFrec3=0;}}}
//#######################################частоты сигнала
countX=Frec*(overclock/16.0);
}
if(opornoe==1) printV=maxV*fiveV/255*3,2; //if(opornoe==1) printV=maxV*fiveV/255*3,2;
if(opornoe==0) printV=maxV*1.10/255*3,2; // напряжение на делителе 1.1в
display.setCursor(1, 58);
display.print(printV);display.print("v ");
display.print(countX);display.print("Hz");
display.fillRect(85, 48, 2, 7, 1);
display.fillRect(88, 48, 2, 7, 1);
//#######################################отрисовка menu
display.display();
delay(300);
}
if(pultoskop==1){Generator();}
if(pultoskop==2){DDSGenerator();}
if(pultoskop==3){TTL();}
}
//#######################################режим ренератора
void Generator(){
display.clearDisplay();
if (flag==0){//флаг выборов режима настройки ШИМ или Частоты
if(digitalRead(levo)==HIGH){
frequency=frequency-mnog;
if(frequency<0){frequency=0;}
bool success = SetPinFrequencySafe(led, frequency);
delay(3);//защита от дребезга
}
if(digitalRead(pravo)==HIGH){
frequency=frequency+mnog;
bool success = SetPinFrequencySafe(led, frequency);
delay(3);//защита от дребезга
}
}
if (flag==1){//флаг выборов режима настройки ШИМ или Частоты
if(digitalRead(levo)==HIGH){
PWM=PWM-3;
if(PWM<0){PWM=255;}
delay(3);//защита от дребезга
}
if(digitalRead(pravo)==HIGH){
PWM=PWM+3;
if(PWM>255){PWM=0;}
delay(3);//защита от дребезга
}
}
if(digitalRead(ok)==HIGH){//переключение разряда выбора частоты
delay(3);//защита от дребезга
hag++;
if(hag>=5){hag=0;}
}
////////////
display.setTextSize(1);
display.setCursor(20,15);
display.print("PWM = ");
display.print(PWM*100/255);
display.print("%");
display.drawRect(2,2,92,10, BLACK);
display.fillRect(2,2,92*PWM/255.0,10, BLACK);
///////////
display.setCursor(5,30);
display.setTextSize(2);
long frequencyX=frequency*(overclock/16.0);
if(frequencyX<1000){display.print(frequencyX);display.setTextSize(1);display.println("Hz");}
if(frequencyX>=1000){if(frequencyX<10000){display.print((frequencyX/1000.0),3);display.setTextSize(1);display.println("KHz");}}
if(frequencyX>=10000){if(frequencyX<100000){display.print((frequencyX/1000.0),3);display.setTextSize(1);display.println("KHz");}}
if(frequencyX>=100000){display.print((frequencyX/1000.0),2);display.setTextSize(1);display.println("KHz");}
display.setCursor(15,55);
display.setTextSize(1);
display.print(">> X ");
if(hag==0){//выбор множителя частоты
display.print(1*(overclock/16.0),1);
mnog=1;
flag=0;
}
if(hag==1){//выбор множителя частоты
display.print(10*(overclock/16.0),0);
mnog=10;
}
if(hag==2){//выбор множителя частоты
display.print(100*(overclock/16.0),0);
mnog=100;
}
if(hag==3){//выбор множителя частоты
display.print(1000*(overclock/16.0),0);
mnog=1000;
}
if(hag==4){//выбор PWM
display.print("PWM");
flag=1;
}
display.print(" <<"); pwmWrite(led, PWM); display.display(); delay(300); } // === 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 byte ddsCount=0; // Рисуем DDS-генератор display.clearDisplay(); for (byte i=0; i<96;) display.drawLine(i, 36-pgm_read_byte(&ddsWave[menu][i%32])/10, i, 36-pgm_read_byte(&ddsWave[menu][(i++)%32])/10, BLACK); display.display(); // отрисовали все while(!digitalRead(pravo)==HIGH) { // выводим выбранный сигнал, пока не нажали кнопку pwmWrite(dds, pgm_read_byte(&ddsWave[menu][(ddsCount++)&0x1F])); } if (++menu==4) menu = 0; // нажали кнопку - переключаем режим delay(200); // чтоб кнопки нормально нажимались } /////////////////////DDS ////////////////////TTL void TTL(){ int speedTTLindex=0; while (pgm_read_dword(&ttlM[speedTTLindex])!=speedTTL) {speedTTLindex++; if(speedTTLindex>12){speedTTLindex=0;} }
display.clearDisplay();
display.setCursor(33,10); display.println("Speed:");
display.setTextColor(WHITE, BLACK);
display.setCursor(76, 30); display.println("+");
display.setCursor(13, 30); display.print("-");
display.setTextColor(BLACK);
display.setCursor(33, 30);
display.print(speedTTL);
display.println(" ");
display.setCursor(20,50); display.println("OK - start");
if(digitalRead(pravo)==HIGH){speedTTLindex++; delay(100); if(speedTTLindex>12){speedTTLindex=0;}}
if(digitalRead(levo)==HIGH) {speedTTLindex--; delay(100); if(speedTTLindex<0){speedTTLindex=12;}}
speedTTL=pgm_read_dword(&ttlM[speedTTLindex]);
if(digitalRead(ok)==HIGH){
Serial.begin(speedTTL*(16.0/overclock));
display.clearDisplay();
delay(200);
display.display();
int x=0;
int y=0;
while(1){
char incomingBytes;
if (Serial.available() > 0) { // Если в буфере есть данные
incomingBytes=Serial.read(); // Считывание байта в переменную incomeByte
display.setCursor(x,y);
display.print(incomingBytes); // Печать строки в буффер дисплея
display.display(); x=x+6;
if(x==90){x=0;y=y+8;}
if(y==64){x=0;y=0;
display.clearDisplay();
delay(100);
display.display();}}
}}
delay(200);
display.display();
}
/////////////////////TTL
tolya10, спасибо, что поделились результатом. Spoiler починил.
подскажите где этот делитель на схеме и в коде. что то я совсем не вкурил. или может я не так понял. делительо по напряжению или частоте?
AndrySmart, делитель включается программно.
это делитель частоты?
я так понял в коде это переменная zoom?
только сейчас посмотрел видео и все стало ясно.
а подскажите. если резистор нижнего плеча входного делителя подключить на выходной порт. точнее сделать два резистора и записывая в порт 0 подключать его для измерения в нужном диапазоне. (а незадействованный в этот момент пин порта настраивать на вход (что бы перевести в состояние высокого импеданса )
естественно это все програмно сделать. так сойдет? или точность будет не приемлемая?
AndrySmart, экспериментируйте. Там дела на 5 минут, проверьте на практике свои подозрения.
а как переделать на nokia 1100 .Aто я слабак в коде
lsm, тема с обсуждением модернизации этого устройства и подключение разных дисплеев освещалась здесь: http://arduino.ru/forum/proekty/pultoskop-na-arduino-27mgts Возможно, там есть схема подключения Вашего дисплея. Задайте вопрос там.
Добрго дня!
Я не прогрпммист, подскажите, пожалуйста, можно ли поменять код, чтоб вместо кнопок использовать енкодер?
serhiy58, добрый день. Можно.
А какие изменения нужно внести в скетч? Помогите, пожолуйста. Собираюсь повторить последгюю версию с теримналом.
Спасибо.
serhiy58, спросите на форуме, где взяли скетч версии с терминалом. Там, по моему, встречалась версия с энкодером.
Я посмотрел скетч с терминалом и отказался от него по тй причине, что там дисплей 84х48, а я хочу 96х65, так что буду повторять Вашу версию. И если будет Ваша добрая воля, то прошу Вас помочь с кодом под енкодер. Сам я не осилю данную задачу.
Спасибо. 🙂
serhiy58, посмотрите примеры как работает энкодер, и замените в коде ту часть, которая отвечает за нажатия кнопок. Начните разбираться, Вам понравится.
У меня сейчас нет времени вносить изменения, отлаживать, перепроверять.
А что слышно о третей версии с АЦП?
Есть такой вариант, я собрал, но он сыроват, синхронизация желает быть лучше, точнее там нет синхронизации по входному сигналу, - а так - полоса на порядок шире... Есьб другой проект, но там только код, скетча нет... дисплей на 96х65 не поменяешь и хтелок не добавишь...
serhiy58, автор пультоскопа прекратил какие-либо разработки, а он делал основной костяк по этой работе. Все остальные, как и я - дорабатывали его код и схему под свои нужды. Никто не взялся за реализацию новой версии устройства. К сожалению, без автора - никуда, т.к. он главный генератор и исполнитель этой идеи.
Очень жаль!
Как можно рассчитать по схеме и прошивке, 0-15v вместо 0-20v