С чего ли? Ставя пин на выход мы по дефолту подтягиваем его к земле. и ни чего там не будет страшного
Не знаю что должно быть по теории, а вот в практике, когда я делал пробный запуск своего, без резисторов на землю входы кнопок жили своей жизнью. Так что мой совет остаётса, это реально из практики.
(так наглядней и быстрей выполнить, дабы не тратить время на обдумывание как и куда скроссировать проводники)
дисплей (его Vcc) запитал от падения напряжения на его белых светодиодах. параллельно добавил кондер smd 1мкф на всяк случай . это видно на фото с лицевой стороны. там на подсветке еще оказался большого сопротивления резистор 470 ом , просто добавил ему в параллель 100 ом для увеличения яркости подсветки.
скетч немного переделал под кнопки без внешних подтягивающих резисторов, с удобным подключением дисплея как на фото, с навигацией в главном меню по + и - .
//Страница проэкта http://srukami.inf.ua/pultoscop_v25110.html
//подредактированный под кнопки с общим минусом, без резисторов.
//изменено подключение дисплея и кнопок. (а то светодиод на 13 пине мешает кнопке с общим минусом)
//
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
#include <FreqCount.h>
#include <PWM.h>
#include <CyberLib.h>
#define led 9 //пин для генератора сигналов (не менять)
#define dds 10 //пин для генератора dds (не менять)
//#################№№№№№№####пользовательские настройки
#define power 8 //пин который опрашивает кнопку включения
#define OFF A1 //пин который управляет ключем питания
#define timepowerON 50 //время удержания кнопки выключения
#define levo A0 // 13 //кнопка ЛЕВО(можно любой пин)
#define ok 12 //кнопка ОК(можно любой пин)
#define pravo 11 //кнопка ПРАВО(можно любой пин)
#define akb A5 //любой своюодный аналоговый пин для измерения напряжения АКБ
#define overclock 16 //Частота на которой работает Ардуино
// Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 4, 3, 2);//пины к которым у вас подключен дисплей оригинал
Adafruit_PCD8544 display = Adafruit_PCD8544(2, 3, 4, 6, 7);//пины к которым у вас подключен дисплей
byte cont=52;//контрастность дисплея
byte SinU=30; //уровень синхронизации 0 до 255
int PWM = 128;//стартовое значение ШИМ от 0 до 255
int32_t frequency = 500; //стартовое значение частоты в Гц
float VCC=5.0; //напряжение питания, меряем мультиметром
//###########################################################
int d=0;
byte menuDDS=0;
byte sinM[32]={1,6,15,29,48,69,92,117,143,168,191,212,229,243,251,255,254,248,237,222,203,181,156,131,106,81,59,39,22,10,3,1};
byte pilaM[32]={1,9,17,25,33,41,49,57,65,73,81,89,97,105,113,121,129,137,145,153,161,169,177,185,193,201,209,217,225,235,245,255};
byte RpilaM[32]={250,246,238,230,222,214,206,198,190,182,174,166,158,150,142,134,126,118,110,102,94,86,78,70,62,54,41,33,25,17,9,1};
byte trianglM[32]={1,18,35,52,69,86,103,120,137,154,171,188,205,222,239,255,239,223,207,191,175,159,143,127,111,95,79,63,47,31,15,1};
int powerON=0;//состояние кнопки питания
byte hag=0;
int mnog=0;
boolean flag=0;
byte mass[701];
byte x=0;
byte menu=0;//переменная выбора меню
bool opornoe=1; //флаг опорного напряжения
bool paus=0; //флаг режима паузы
byte pultoskop=0; //флаг выбора генератора или осциллографа
byte razv=6;
unsigned long count =0;
byte sinX=30;
byte meaX=83;
int Vmax=0;// максимальное напряжение
byte sinhMASS=0;
long countX=0;
long speedTTL=9600; //скорость терминала
int prokr=0;
void setup(){
// активация подтягив. резисторов к +5в
digitalWrite(levo,HIGH);
digitalWrite(ok,HIGH);
digitalWrite(pravo,HIGH);
digitalWrite(power,HIGH);
// pinMode(A4,INPUT); // за ненадобностью закоментен
digitalWrite(OFF,HIGH);//включем питание
//Serial.begin(9600);
display.begin();
display.setContrast(cont);
while(digitalRead(ok)==HIGH){
/////////////////////////////////////////удержание кнопки отключения
if(digitalRead(power)==LOW){powerON++;delay(10);}
if(powerON>=timepowerON){digitalWrite(OFF,LOW);}///отключаем питание
/////////////////////////////////////////удержание кнопки отключения
if(pultoskop==0){
display.clearDisplay();
display.setCursor(10,0);
display.setTextColor(WHITE, BLACK); // 'inverted' text
display.println("Пультоскоп");
display.setCursor(10,10);
display.setTextColor(BLACK);
display.println("Генератор");
display.setCursor(10,20);
display.println("DDSгенератор");
display.setCursor(10,30);
display.println("Терминал");
display.setCursor(0,40);
display.print("Батарея=");
display.print(analogRead(akb)*5.0/1024);
display.print("В");
}
if(pultoskop==1){
display.clearDisplay();
display.setCursor(10,0);
display.setTextColor(BLACK); // 'inverted' text
display.println("Пультоскоп");
display.setCursor(10,10);
display.setTextColor(WHITE, BLACK); // 'inverted' text
display.println("Генератор");
display.setTextColor(BLACK); // 'inverted' text;
display.setCursor(10,20);
display.println("DDSгенератор");
display.setCursor(10,30);
display.println("Терминал");
display.setCursor(0,40);
display.setTextColor(BLACK);
display.print("Батарея=");
display.print(analogRead(akb)*5.0/1024);
display.print("В");
}
if(pultoskop==2){
display.clearDisplay();
display.setCursor(10,00);
display.setTextColor(BLACK); // 'inverted' text
display.println("Пультоскоп");
display.setCursor(10,10);
display.println("Генератор");
display.setTextColor(WHITE, BLACK); // 'inverted' text;
display.setCursor(10,20);
display.println("DDSгенератор");
display.setTextColor(BLACK);
display.setCursor(10,30);
display.println("Терминал");
display.setCursor(0,40);
display.setTextColor(BLACK);
display.print("Батарея=");
display.print(analogRead(akb)*5.0/1024);
display.print("В");
}
if(pultoskop==3){
display.clearDisplay();
display.setCursor(10,00);
display.setTextColor(BLACK); // 'inverted' text
display.println("Пультоскоп");
display.setCursor(10,10);
display.println("Генератор");
display.setTextColor(BLACK);
display.setCursor(10,20);
display.println("DDSгенератор");
display.setTextColor(WHITE, BLACK);
display.setCursor(10,30);
display.println("Терминал");
display.setCursor(0,40);
display.setTextColor(BLACK);
display.print("Батарея=");
display.print(analogRead(akb)*5.0/1024);
display.print("В");
}
if(digitalRead(levo)==LOW){delay(300); if (pultoskop>0) pultoskop=pultoskop-1; else pultoskop=3;}
if(digitalRead(pravo)==LOW){delay(300);pultoskop=pultoskop+1;}
if(pultoskop>3){pultoskop=0;}
delay(50);
display.display(); }
if(pultoskop==2){InitTimersSafe(); bool success = SetPinFrequencySafe(led,200000);}
if(pultoskop==0){FreqCount.begin(1000);}
if(pultoskop==1){InitTimersSafe(); bool success = SetPinFrequencySafe(led, frequency);}
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(int i=0;i<700;i++){
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
delayMicroseconds(500);
mass[i]=ADCH;
}
}
if (razv>0){
for(int i=0;i<700;i++){
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
mass[i]=ADCH;
}
}
}
void loop() {
/////////////////////////////////////////удержание кнопки отключения
if(digitalRead(power)==LOW){powerON++;delay(10);}
if(powerON>=timepowerON){digitalWrite(OFF,LOW);}///отключаем питание
/////////////////////////////////////////удержание кнопки отключения
if(pultoskop==0){
if(opornoe==0){ADMUX = 0b11100011;}//выбор внутреннего опорного 1,1В
if(opornoe==1){ADMUX = 0b01100011;}//Выбор внешнего опорного
delay(5);
if(paus==0){Zamer();}
//#######################################определение точки синхронизации
bool flagSINHRO=0;
bool flagSINHRnull=0;
for(int y=1;y<255;y++){
if(flagSINHRO==0){if(mass[y]<SinU){flagSINHRnull=1;}}
if(flagSINHRO==0){if(flagSINHRnull==1){if(mass[y]>SinU){flagSINHRO=1;sinhMASS=y;}}}}
//#######################################определение точки синхронизации
//максимальное значение сигнала##########################
Vmax=0;
for(int y=1;y<255;y++){if(Vmax<mass[y]){Vmax=mass[y];} }
//максимальное значение сигнала##########################
//#######################################определение точки синхронизации
//#######################################отрисовка графика
if(paus==0){
display.clearDisplay();
display.fillCircle(80,47-SinU/7, 2, BLACK);//рисуем уровень синхронизации
x=3;
for(int y=sinhMASS;y<sinhMASS+80;y++){
if(razv<7){x++;}
if(razv==7){x=x+2;}
if(razv==8){x=x+3;}
display.drawLine(x, 47-mass[y]/7, x+1, 47-mass[y+1]/7, BLACK);
display.drawLine(x+1, 47-mass[y]/7+1, x+2, 47-mass[y+1]/7+1, BLACK);
}
sinhMASS=0;}
if(paus==1){
display.clearDisplay();
display.drawLine(prokr/8,8,prokr/8+6,8, BLACK);//шкала прокрутки
display.drawLine(prokr/8,9,prokr/8+6,9, BLACK);//шкала прокрутки
x=3;
for(int y=prokr;y<prokr+80;y++){
if(razv<7){x++;}
if(razv==7){x=x+2;}
if(razv==8){x=x+3;}
display.drawLine(x, 47-mass[y]/7, x+1, 47-mass[y+1]/7, BLACK);
display.drawLine(x+1, 47-mass[y]/7+1, x+2, 47-mass[y+1]/7+1, BLACK);
}}
//#######################################отрисовка графика
for(byte i=47;i>5;i=i-7){display.drawPixel(0,i, BLACK);display.drawPixel(1,i, BLACK);display.drawPixel(2,i, BLACK);}//разметка экрана вертикальная
//////////////////////////////////////////////////сетка
for(byte i=47;i>5;i=i-3){display.drawPixel(21,i, BLACK);display.drawPixel(42,i, BLACK);display.drawPixel(63,i, BLACK);}
for(byte i=3;i<84;i=i+3){display.drawPixel(i,33, BLACK);display.drawPixel(i,19, BLACK);}
//////////////////////////////////////////////////сетка
//#######################################отрисовка menu
if(menu==0){
display.setCursor(0,0);
display.setTextColor(WHITE,BLACK);
if(opornoe==0){display.print("1.1");}
if(opornoe==1){display.print(VCC,1);}
display.setTextColor(BLACK);
display.print(" ");
display.print(razv);
display.print(" P");
if(digitalRead(levo)==LOW){opornoe=!opornoe;}
if(digitalRead(pravo)==LOW){opornoe=!opornoe;}
}
if(menu==1){
display.setCursor(0,0);
display.setTextColor( BLACK);
if(opornoe==0){display.print("1.1");}
if(opornoe==1){display.print(VCC,1);}
display.setTextColor(WHITE, BLACK); // 'inverted' text
display.print(" ");
display.print(razv);
display.setTextColor( BLACK); // 'inverted' text
display.print(" P");
if(digitalRead(levo)==LOW){razv=razv-1;if(razv==255){razv=0;}}
if(digitalRead(pravo)==LOW){razv=razv+1;if(razv==9){razv=8;}}
}
if(menu==2){
display.setCursor(0,0);
display.setTextColor( BLACK);
if(opornoe==0){display.print("1.1");}
if(opornoe==1){display.print(VCC,1);}
display.print(" ");
display.print(razv);
display.setTextColor(WHITE, BLACK); // 'inverted' text
display.print(" P");
paus=1;
if(digitalRead(levo)==LOW){prokr=prokr-10;if(prokr<0){prokr=0;}}
if(digitalRead(pravo)==LOW){prokr=prokr+10;if(prokr>620){prokr=620;}}
}
if(menu==3){
prokr=0;
paus=0;
display.setCursor(0,0);
display.setTextColor( BLACK);
if(opornoe==0){display.print("1.1");}
if(opornoe==1){display.print(VCC,1);}
display.print(" ");
display.print(razv);
display.setTextColor(BLACK);
display.print(" P");
if(digitalRead(levo)==LOW){SinU=SinU-20;if(SinU<20){SinU=20;}}
if(digitalRead(pravo)==LOW){SinU=SinU+20;if(SinU>230){SinU=230;}}
display.fillCircle(80,47-SinU/7, 5, BLACK);
display.fillCircle(80,47-SinU/7, 2, WHITE);
}
if(digitalRead(ok)==LOW){menu++;if(menu==4){menu=0;paus=0;}}//перебор меню
if (FreqCount.available()) { count = FreqCount.read();}//вывод частоты по готовности счетчика
//#######################################частоты сигнала
byte Frec1=0;
long Frec=0;
bool flagFrec1=0;
bool flagFrec2=0;
bool flagFrec3=0;
for(int y=1;y<255;y++){
if(flagFrec1==0){if(mass[y]<SinU){flagFrec2=1;}}
if(flagFrec1==0){if(flagFrec2==1){if(mass[y]>SinU){flagFrec1=1;Frec1=y;}}}
if(flagFrec1==1){if(mass[y]<SinU){flagFrec3=1;}}
if(flagFrec3==1){if(mass[y]>SinU){
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;}}}
//#######################################частоты сигнала
display.setTextColor( BLACK);
if(opornoe==1){
if((Vmax*VCC/255)>2.5){countX=count*(overclock/16.0);}
if((Vmax*VCC/255)<2.5){countX=Frec*(overclock/16.0);}}
if(opornoe==0){countX=Frec*(overclock/16.0);}
if(countX<1000){display.print(" ");display.print(countX);display.print("Hz");}
if(countX>1000){float countXK=countX/1000.0;display.print(countXK,1);display.print("KHz");}
if(opornoe==1){display.setCursor(0,40);display.setTextColor(BLACK);
display.print(Vmax*VCC/255,1);}
if(opornoe==0){display.setCursor(0,40);display.setTextColor(BLACK);
display.print(Vmax*1.1/255,1);}
display.print("V");
//#######################################отрисовка menu
delay(200);
display.display();
}
if(pultoskop==1){Generator();}
if(pultoskop==2){DDSGenerator();}
if(pultoskop==3){TTL();}
}
//#######################################режим ренератора
void Generator(){
display.clearDisplay();
if (flag==0){//флаг выборов режима настройки ШИМ или Частоты
if(digitalRead(levo)==LOW){
frequency=frequency-mnog;
if(frequency<0){frequency=0;}
bool success = SetPinFrequencySafe(led, frequency);
delay(3);//защита от дребезга
}
if(digitalRead(pravo)==LOW){
frequency=frequency+mnog;
bool success = SetPinFrequencySafe(led, frequency);
delay(3);//защита от дребезга
}
}
if (flag==1){//флаг выборов режима настройки ШИМ или Частоты
if(digitalRead(levo)==LOW){
PWM=PWM-1;
if(PWM<0){PWM=255;}
delay(3);//защита от дребезга
}
if(digitalRead(pravo)==LOW){
PWM=PWM+1;
if(PWM>255){PWM=0;}
delay(3);//защита от дребезга
}
}
if(digitalRead(ok)==LOW){//переключение разряда выбора частоты
delay(3);//защита от дребезга
hag++;
if(hag>=5){hag=0;}
}
////////////
display.setTextSize(1);
display.setCursor(0,5);
display.print("PWM=");
display.print(PWM*100.0/255);
display.print(" %");
display.drawLine(0,0,83*PWM/255.0,0, BLACK);
display.drawLine(0,1,83*PWM/255.0,1, BLACK);
display.drawLine(0,2,83*PWM/255.0,2, BLACK);
display.drawLine(0,15,83*PWM/255.0,15, BLACK);
display.drawLine(0,16,83*PWM/255.0,16, BLACK);
display.drawLine(0,17,83*PWM/255.0,17, BLACK);
///////////
display.setCursor(5,20);
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),2);display.setTextSize(1);display.println("KHz");}}
if(frequencyX>=10000){if(frequencyX<100000){display.print((frequencyX/1000.0),1);display.setTextSize(1);display.println("KHz");}}
if(frequencyX>=100000){display.print((frequencyX/1000.0),0);display.setTextSize(1);display.println("KHz");}
display.setCursor(0,40);
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 ");
display.print(PWM*100.0/255);
display.print("%");
flag=1;
}
display.print("<<");
pwmWrite(led, PWM);
delay(300);
display.display();
}
/////////////////////DDS d11
void DDSGenerator(){
int fr=10;
if(menuDDS==0){
display.clearDisplay();
display.setTextColor(WHITE, BLACK); // 'inverted' text
display.setCursor(10,0);
display.println("Синус");
display.setTextColor(BLACK);
display.setCursor(10,10);
display.println("Треугольник");
display.setCursor(10,20);
display.println("Пила");
display.setCursor(10,30);
display.println("Пила Обр");
display.setTextColor(BLACK);
display.setCursor(0,40);
//display.print("Частота=");
//display.print(57);
//display.print("Гц");
delay(100);
display.display();
while(D11_Read==HIGH){
PWM=sinM[d];
pwmWrite(dds,PWM);
//delayMicroseconds(fr);
d++;
if(d==32){d=0;}}
menuDDS++;
delay(200);}
if(menuDDS==1){
display.clearDisplay();
display.setTextColor(BLACK); // 'inverted' text
display.setCursor(10,0);
display.println("Синус");
display.setTextColor(WHITE, BLACK);
display.setCursor(10,10);
display.println("Треугольник");
display.setTextColor(BLACK);
display.setCursor(10,20);
display.println("Пила");
display.setCursor(10,30);
display.println("Пила Обр");
display.setTextColor(BLACK);
//display.setCursor(0,40);
//display.print("Частота=");
// display.print(57);
//display.print("Гц");
delay(100);
display.display();
while(D11_Read==HIGH){
PWM=trianglM[d];
pwmWrite(dds,PWM);
//delayMicroseconds(fr);
d++;
if(d==32){d=0;}}
menuDDS++;
delay(200);}
if(menuDDS==2){
display.clearDisplay();
display.setTextColor(BLACK); // 'inverted' text
display.setCursor(10,0);
display.println("Синус");
display.setTextColor(BLACK);
display.setCursor(10,10);
display.println("Треугольник");
display.setTextColor(WHITE, BLACK);
display.setCursor(10,20);
display.println("Пила");
display.setTextColor(BLACK);
display.setCursor(10,30);
display.println("Пила Обр");
display.setTextColor(BLACK);
//display.setCursor(0,40);
//display.print("Частота=");
// display.print(57);
//display.print("Гц");
delay(100);
display.display();
while(D11_Read==HIGH){
PWM=pilaM[d];
pwmWrite(dds,PWM);
// delayMicroseconds(fr);
d++;
if(d==32){d=0;}}
menuDDS++;
delay(200);}
if(menuDDS==3){
display.clearDisplay();
display.setTextColor(BLACK); // 'inverted' text
display.setCursor(10,0);
display.println("Синус");
display.setTextColor(BLACK);
display.setCursor(10,10);
display.println("Треугольник");
display.setTextColor(BLACK);
display.setCursor(10,20);
display.println("Пила");
display.setTextColor(WHITE, BLACK);
display.setCursor(10,30);
display.println("Пила Обр");
display.setTextColor(BLACK);
//display.setCursor(0,40);
//display.print("Частота=");
// display.print(57);
// display.print("Гц");
delay(100);
display.display();
while(D11_Read==HIGH){
PWM=RpilaM[d];
pwmWrite(dds,PWM);
//delayMicroseconds(fr);
d++;
if(d==32){d=0;}}
menuDDS++;
delay(200);}
if(menuDDS==4){menuDDS=0;}
}
/////////////////////DDS
/////////////////////TTL
void TTL(){
display.clearDisplay();
display.setTextColor(BLACK);
display.setCursor(10,0);
display.println("Терминал");
display.setCursor(10,10);
display.println("Скорость");
display.setCursor(10,20);
display.print("-");
display.print(speedTTL);
display.println("+");
display.setCursor(0,30);
display.println("Нажми ОК-старт");
if(digitalRead(pravo)==LOW){speedTTL=speedTTL+100;}
if(digitalRead(levo)==LOW){speedTTL=speedTTL-100;}
if(speedTTL<0){speedTTL=250000;}
if(speedTTL>250000){speedTTL=0;}
if(digitalRead(ok)==LOW){Serial.begin(speedTTL*(16/overclock));
display.clearDisplay();
delay(100);
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==84){x=0;y=y+8;}
if(y==48){x=0;y=0;
display.clearDisplay();
delay(100);
display.display();}}
}}
delay(100);
display.display();
}
/////////////////////TTL
// конечно про переключение - и ~ путем добавления последовательно кондера - это не профи для АЧХ, но на точность измерения не претендую. Параллельно Vcc и GND на ардуине , прицепил стабилитрон 5,1в так на всяк случай ( при выходе внешнего стаба , чтоб atmega328 жива осталась) . На вход пина A3 (осцила) не рекомендую тупо ставить стабилитрон 5.1в - он имеет утечку и емкость несколько nF ) , уж лучше smd 1n4148 диоды на GND и Vcc , чтоб переполюсовку и излишек на входе пина A3 скидывали на питание.
если подержать родную кнопку включения на этом повербанке, или быстро жамкнуть ее 3 раза , то повербанк выдает на USB 5в, от него и запитал повышайку на 7,5-5в для ровных и точных 5.0в от параметрического стаба на плате арруино, чтобы не зависеть от просадки доп нагрузки на USB. Выключается 2-3 сек. нажатием на кнопку.
Для некоторых типов повербанков, надо вешать доп нагрузку на USB , а то из-за маленького потребления arduino , повербанк выключает свой преобразователь. или просто подключить повышайку mt3608 через механический выключатель прям на литий.
bodriy2014 , если будете что нибудь добавлять в прогу, мож рассмотрите еще какие нибудь хотелки , если будет интерес конечно, такие как счетчик импульсов, подсчет оборотов простых двигателей , раз уж памяти еще хватает
Sketch uses 19 176 bytes (62%) of program storage space. Maximum is 30 720 bytes.
а т.к. оперативная почти исчерпана, так можно использовать переменные с соседних функций, все равно же с момента включения пультоскопа используем только одну функцию. а затем либо выкл/вкл , либо кнопка сброс на ардуине.
Можно помимо напряжения акб, на главном экране, еще вывести температуру от внутреннего датчика atmega328 (здесь на сайте об этом тема была).
можно и доп. автомобильных оборотов - тахометр; проверка датчиков ds18b20, типа рисование графика по изменению температуры с 4-10 датчиков.
просьба 240265, пожалуйста добавте в предыдущий Ваш пост, там где фотки - коротко ссылки, в каком посту именно этот скетч, какой дисплей, схема. Так будет здоровски удобно и понятно :) Спасибо.
измеряемая частота подается на pin 5 (для FreqCount), причем, похоже, что изменить их на другие в исходных текстах этих библиотек невозможно, поскольку они связаны с конкретными входами таймеров Arduino
Решил на старости лет приобщитмя к микропроцессорной технике и начать с вашего проекта. нашел дисплей от нокии 5210 собрал схемку, залил скетч и ..... на экране изображение есть но буквы зеркально развернуты и счет строк идет не с верху, а снизу. в общем поковырялся я в библиотеке развернул буковки а с реверсом строк ничего не получилось-не разобрался где копать, поэтому перерисовал интерфейс непосредственно в коде программы. все работает. теперь разбираюсь с настройкой достоверности показаний напряжения и частоты. доделаю отпишусь и сброшу фотки.
подскажите пожалуйста какой можно придумать фильтр чтобы расчет был при наличии импульсов, так-как при отсутствии останавливается на расчете в ожидании изменения уровней? Пока проверял в эмуляторе на Arduino не тестил,читает с 5 порта частомера.
#include "SPI.h"
#include "Adafruit_GFX.h"// Core graphics library
#include "Adafruit_ILI9341.h"
//страничка проекта <a data-cke-saved-href="<a href="http://srukami.inf.ua/pultoscop_v2.html" rel="nofollow">http://srukami.inf.ua/pultoscop_v2.html</a>" href="<a href="http://srukami.inf.ua/pultoscop_v2.html" rel="nofollow">http://srukami.inf.ua/pultoscop_v2.html</a>" rel="nofollow"><a href="http://srukami.inf.ua/pultoscop_v2.html" rel="nofollow">http://srukami.inf.ua/pultoscop_v2.html</a></a>
//дистплей TFT SPFD5408
//#include <Adafruit_ILI9340.h> // Hardware-specific library
//#if defined(__SAM3X8E__)
//#undef __FlashStringHelper::F(string_literal)
//#define F(string_literal) string_literal
//#endif
// These are the pins used for the UNO
// for Due/Mega/Leonardo use the hardware SPI pins (which are different)
#define TFT_DC 7
#define TFT_CS A0
#define TFT_MOSI 11
#define TFT_CLK 13
#define TFT_RST 8
#define TFT_MISO 12
#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFF
#define GREY 0x7BEF
#define maxString 21
char target[maxString + 1] = "";
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_MOSI, TFT_CLK, TFT_RST, TFT_MISO);
//пользовательские настройки!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#define levo 4
#define ok 3
#define pravo 2
#define vertikal 2 //размер вертикальной сеткаи(если "0" отключениа)
//пользовательские настройки!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
byte mass[501];//массив АЦП
byte massDEL[501];
byte menu = 1; //переменная верхнего меню
byte razv = 0; //значение развертки
float x = 60; //счетчик оси Х
int Vmax = 0; // максимальное напряжение
float Vakb = 0; //напряженеиЕКБ
unsigned long t = 0; //переменная для ращета развертки
unsigned long pause = 0; //переменная для замены Delay
int t_del = 0; //значение цены деления развертки в микросекундах
bool t_dell = 0; //флаг расчета коэффициента заполнения
int setka = 0;
bool opornoe = 1; //флаг опорного напряжения
bool paus = 0; //флаг режима паузы
bool clen_p = 0; //флаг чистки паузы
bool fullDisp = 0;
bool setka2 = 0;
bool st = 0;
bool flag = 0;
bool izmHz = 0;
uint32_t tic1;
uint32_t tic2;
int duty;
void setup() {
tft.begin();
tft.cp437(true);
Vakb = analogRead(A2) * 5.3 / 1024; //проверка напряжения на АКБ
if (opornoe == 0) {
ADMUX = 0b11100011; //выбор внутреннего опорного 1,1В
}
if (opornoe == 1) {
ADMUX = 0b01100011; //Выбор внешнего опорного
}
delay(50);
tft.fillScreen(BLACK);
delay(500);
Setka1();
Opornoe();
}
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) {
t = micros();
for (int i = 0; i < 500; i++) {
while ((ADCSRA & 0x10) == 0);
ADCSRA |= 0x10;
delayMicroseconds(100);
mass[i] = ADCH;
}
t = micros() - t;
t_del = t * 25 / 501;
}
if (razv > 0) {
t = micros();
for (int i = 0; i < 500; i++) {
while ((ADCSRA & 0x10) == 0);
ADCSRA |= 0x10;
mass[i] = ADCH;
}
t = micros() - t;
t_del = t * 25 / 501;
}
Vmax = 0;
for (int i = 0; i < 500; i++) {
if (Vmax < mass[i]) {
Vmax = mass[i];
}
}
if (fullDisp == 0) {
for (int i = 0; i < 500; i++) {
mass[i] = 190 - (mass[i] * 0.7);
}
}
else {
for (int i = 0; i < 500; i++) {
mass[i] = 230 - (mass[i] * 0.88);
}
}
if (t_dell == 0){
tic1 = asm_func(1);
tic2 = asm_func(0);
duty=(1/((float)tic1/tic2))*100;
t_dell=1;
}
}
void loop() {
if (paus == 0) {
Zamer();
}
Graf();
Menu();
}
void Menu() {
bool flag = 0;
if (digitalRead(ok) == HIGH) {
flag = 0;
delay (10);
while (digitalRead(ok) == HIGH) {
if (digitalRead(pravo) == HIGH) {
opornoe = !opornoe;
Opornoe();
Zamer();
Graf();
flag = 1;
}
if (digitalRead(levo) == HIGH) {
fullDisp = !fullDisp;
Zamer();
Setka1();
Opornoe();
Graf();
flag = 1;
}
}
if (flag == 0) {
paus = !paus;
}
}
if (paus == 0) {
if (digitalRead(pravo) == HIGH) { //доработать скорость
tft.setRotation(0);
if (fullDisp == 0) {
tft.fillRect(45, 60, 190, 260, BLACK);
}
else {
tft.fillRect(9, 10, 230, 310, BLACK);
}
razv++;
if (razv == 11) {
razv = 10;
}
}
if (digitalRead(levo) == HIGH) { //доработать скорость
tft.setRotation(0);
if (fullDisp == 0) {
tft.fillRect(45, 60, 190, 260, BLACK);
}
else {
tft.fillRect(9, 10, 230, 310, BLACK);
}
razv--;
if (razv == 255) {
razv = 0;
}
}
}
else {
if (digitalRead(levo) == HIGH) {
int flag = 0;
delay(50);
if (fullDisp == 0) {
while (digitalRead(levo) == HIGH) {
if (digitalRead(ok) == HIGH) {
IzmHz();
tft.setRotation(0);
tft.fillRect(45, 60, 190, 260, BLACK);
MenuT();
st = 1;
Graf();
flag = 1;
}
}
}
if (flag == 0) {
setka2 = !setka2;
if (setka2 == 1) {
Setka2();
}
else {
if (fullDisp == 0) {
tft.setRotation(0);
tft.fillRect(45, 60, 190, 260, BLACK);
}
else {
tft.setRotation(0);
tft.fillRect(9, 10, 230, 310, BLACK);
}
st = 1;
Graf();
}
delay(300);
}
}
}
}
void MenuT() { //перерисовка нижнего меню
tft.setTextColor(RED);
tft.setTextSize(2);
tft.setRotation(0);
tft.fillRect(0, 0, 20, 340, BLACK); //стирание поля меню низ
t_dell=0;
tft.setRotation(1);
tft.setCursor(0, 220);
if (razv < 7) {
tft.print(t_del);
}
if (razv == 7) {
tft.print(t_del / 2);
}
if (razv == 8) {
tft.print(t_del / 3);
}
if (razv == 9) {
tft.print(t_del / 4);
}
if (razv == 10) {
tft.print(t_del / 5);
}
tft.print("us ");
tft.print("Vm=");
if (opornoe == 0) {
tft.print(Vmax * 1.1 / 255);
}
if (opornoe == 1) {
tft.print(Vmax * 5.3 / 255);
}
tft.setTextSize(1);
tft.setCursor(180, 230);
tft.print(utf8rus("Бат="));
tft.print(Vakb);
tft.setCursor(180, 220);
tft.print(utf8rus("Кзап="));
tft.print(duty);
tft.print("%");
tft.setTextSize(2);
tft.setCursor(240, 220);
tft.print(utf8rus("Разв"));
tft.print(razv);
if (setka == 1) {
tft.print(" ");
tft.print("S");
}
}
void Opornoe() {
if (opornoe == 0) {
ADMUX = 0b11100011; //выбор внутреннего опорного 1,1В
}
if (opornoe == 1) {
ADMUX = 0b01100011; //Выбор внешнего опорного
}
if (fullDisp == 0) {
tft.setRotation(0);
tft.fillRect(65, 0, 170, 50, BLACK);//стирание напряжения
tft.fillRect(45, 60, 190, 260, BLACK);//стиране поля графика
tft.setRotation(1);
tft.setTextColor(RED);
tft.setTextSize(2);
if (opornoe == 0) {
tft.setCursor(30, 190); tft.println("0");
tft.setCursor(0, 146); tft.println("0.22");
tft.setCursor(0, 112); tft.println("0.44");
tft.setCursor(0, 78); tft.println("0.66");
tft.setCursor(0, 44); tft.println("0.88");
tft.setCursor(0, 10); tft.println("1.1V");
}
if (opornoe == 1) {
tft.setCursor(30, 190); tft.println("0");
tft.setCursor(0, 146); tft.println("1.00");
tft.setCursor(0, 112); tft.println("2.00");
tft.setCursor(0, 78); tft.println("3.00");
tft.setCursor(0, 44); tft.println("4.00");
tft.setCursor(0, 10); tft.println("5.0V");
}
delay(100);
}
}
void Graf() {
if (paus == 0) {
if (fullDisp == 0) {
MenuT();
if (setka2 == 1) {
Setka2();
}
int z = 0;
if (razv < 7) {
z = 1;
}
if (razv == 7) {
z = 2;
}
if (razv == 8) {
z = 3;
}
if (razv == 9) {
z = 4;
}
if (razv == 10) {
z = 5;
}
x = 60;
tft.setRotation(1);
for (int y = 0; y < 260 || x < 320; y++) {
x = x + z;
tft.drawLine(x, massDEL[y], x + 1, massDEL[y + 1], BLACK); //стираем график
tft.drawLine(x, mass[y], x + 1, mass[y + 1], GREEN); //график
}
for (int i = 0; i < 500; i++) {
massDEL[i] = mass[i];
}
}
if (fullDisp == 1) {
if (setka2 == 1) {
Setka2();
}
x = 10;
int z = 0;
if (razv < 7) {
z = 1;
}
if (razv == 7) {
z = 2;
}
if (razv == 8) {
z = 3;
}
if (razv == 9) {
z = 4;
}
if (razv == 10) {
z = 5;
}
tft.setRotation(1);
for (int y = 0; y < 310; y++) {
x = x + z;
tft.drawLine(x, massDEL[y], x + 1, massDEL[y + 1], BLACK); //стираем график
tft.drawLine(x, mass[y], x + 1, mass[y + 1], GREEN); //график
}
for (int i = 0; i < 500; i++) {
massDEL[i] = mass[i];
}
}
}
if (paus == 1) { //режим паузы
if (setka2 == 1) {
Setka2();
}
if (fullDisp == 0) {
if (digitalRead(pravo) == HIGH || st == 1) { //листаем
Zamer();
st = 0;
tft.setRotation(0);
tft.fillRect(45, 60, 190, 260, BLACK);//стиране графика
x = 60;
int z = 0;
if (razv < 7) {
z = 1;
}
if (razv == 7) {
z = 2;
}
if (razv == 8) {
z = 3;
}
if (razv == 9) {
z = 4;
}
if (razv == 10) {
z = 5;
}
tft.setRotation(1);
for (int y = 0; y < 260; y++) {
x = x + z;
tft.drawLine(x, mass[y], x + 1, mass[y + 1], GREEN); //график
}
for (int i = 0; i < 500; i++) {
massDEL[i] = mass[i];
}
MenuT();
}
}
if (fullDisp == 1) {
if (digitalRead(pravo) == HIGH || st == 1) { //листаем
Zamer();
st = 0;
tft.setRotation(0);
tft.fillRect(9, 10, 230, 310, BLACK);//стиране графика
x = 10;
int z = 0;
if (razv < 7) {
z = 1;
}
if (razv == 7) {
z = 2;
}
if (razv == 8) {
z = 3;
}
if (razv == 9) {
z = 4;
}
if (razv == 10) {
z = 5;
}
tft.setRotation(1);
for (int y = 0; y < 310; y++) {
x = x + z;
tft.drawLine(x, mass[y], x + 1, mass[y + 1], GREEN); //график
}
for (int i = 0; i < 500; i++) {
massDEL[i] = mass[i];
}
}
}
}
}
void Setka1() {
tft.setRotation(0);
tft.fillRect(0, 0, 240, 360, BLACK);
if (fullDisp == 0) {
//ось напряжения##########################################
tft.drawFastHLine(44, 60, 185, BLUE); tft.drawFastHLine(44, 59, 185, BLUE); tft.drawFastHLine(44, 58, 185, BLUE);
tft.drawFastVLine(50, 50, 10, BLUE); tft.drawFastVLine(84, 50, 10, BLUE); tft.drawFastVLine(118, 50, 10, BLUE);
tft.drawFastVLine(152, 50, 10, BLUE); tft.drawFastVLine(186, 50, 10, BLUE); tft.drawFastVLine(220, 50, 10, BLUE);
//ось времени#############################################
tft.drawFastVLine(44, 60, 270, RED); tft.drawFastVLine(43, 60, 270, RED); tft.drawFastVLine(42, 60, 270, RED);
tft.drawFastHLine(35, 60, 10, RED); tft.drawFastHLine(35, 85, 10, RED); tft.drawFastHLine(35, 110, 10, RED); tft.drawFastHLine(35, 135, 10, RED);
tft.drawFastHLine(35, 160, 10, RED); tft.drawFastHLine(35, 185, 10, RED); tft.drawFastHLine(35, 210, 10, RED); tft.drawFastHLine(35, 235, 10, RED);
tft.drawFastHLine(35, 260, 10, RED); tft.drawFastHLine(35, 285, 10, RED); tft.drawFastHLine(35, 310, 10, RED);
//ось времени#############################################
}
if (fullDisp == 1) {
tft.setRotation(0);
//ось напряжения##########################################
tft.drawFastHLine(0, 0, 240, BLUE); tft.drawFastHLine(0, 1, 240, BLUE); tft.drawFastHLine(0, 2, 240, BLUE);
tft.drawFastVLine(10, 0, 10, BLUE); tft.drawFastVLine(51, 0, 10, BLUE); tft.drawFastVLine(93, 0, 10, BLUE);
tft.drawFastVLine(134, 0, 10, BLUE); tft.drawFastVLine(176, 0, 10, BLUE); tft.drawFastVLine(217, 0, 10, BLUE);
//ось времени#############################################
tft.drawFastVLine(0, 0, 320, RED); tft.drawFastVLine(1, 0, 320, RED); tft.drawFastVLine(2, 0, 320, RED);
tft.drawFastHLine(0, 10, 10, RED); tft.drawFastHLine(0, 35, 10, RED);
tft.drawFastHLine(0, 60, 10, RED); tft.drawFastHLine(0, 85, 10, RED); tft.drawFastHLine(0, 110, 10, RED); tft.drawFastHLine(0, 135, 10, RED);
tft.drawFastHLine(0, 160, 10, RED); tft.drawFastHLine(0, 185, 10, RED); tft.drawFastHLine(0, 210, 10, RED); tft.drawFastHLine(0, 235, 10, RED);
tft.drawFastHLine(0, 260, 10, RED); tft.drawFastHLine(0, 285, 10, RED); tft.drawFastHLine(0, 310, 10, RED);
//ось времени#############################################
}
}
void Setka2 () {
if (fullDisp == 0) {
tft.setRotation(0);
tft.drawFastHLine(44, 310, 185, GREY);
tft.drawFastHLine(44, 285, 185, GREY);
tft.drawFastHLine(44, 260, 185, GREY);
tft.drawFastHLine(44, 235, 185, GREY);
tft.drawFastHLine(44, 210, 185, GREY);
tft.drawFastHLine(44, 185, 185, GREY);
tft.drawFastHLine(44, 160, 185, GREY);
tft.drawFastHLine(44, 135, 185, GREY);
tft.drawFastHLine(44, 110, 185, GREY);
tft.drawFastHLine(44, 85, 185, GREY);
}
if (fullDisp == 1) {
tft.setRotation(0);
tft.drawFastHLine(10, 310, 220, GREY);
tft.drawFastHLine(10, 285, 220, GREY);
tft.drawFastHLine(10, 260, 220, GREY);
tft.drawFastHLine(10, 235, 220, GREY);
tft.drawFastHLine(10, 210, 220, GREY);
tft.drawFastHLine(10, 185, 220, GREY);
tft.drawFastHLine(10, 160, 220, GREY);
tft.drawFastHLine(10, 135, 220, GREY);
tft.drawFastHLine(10, 110, 220, GREY);
tft.drawFastHLine(10, 85, 220, GREY);
tft.drawFastHLine(10, 60, 220, GREY);
tft.drawFastHLine(10, 35, 220, GREY);
}
}
void IzmHz() {
delay(200);
tft.setTextColor(RED);
tft.setTextSize(2);
tft.setRotation(0);
tft.fillRect(0, 0, 20, 340, BLACK); //стирание поля меню низ
tft.setRotation(1);
tft.setCursor(0, 220);
int z = 0;
if (razv < 7) {
z = 1;
tft.print(t_del);
}
if (razv == 7) {
z = 2;
tft.print(t_del / 2);
}
if (razv == 8) {
z = 3;
tft.print(t_del / 3);
}
if (razv == 9) {
z = 4;
tft.print(t_del / 4);
}
if (razv == 10) {
z = 5;
tft.print(t_del / 5);
}
tft.print("us ");
int x1 = 0;
int xIzm1 = 60;
int xIzm2 = 0;
int xIzm1del = 60;
int xIzm2del = 0;
int i = 0;
int Speed = 0;
while (i < 2) {
if (digitalRead(ok) == HIGH) {
i++;
if (i == 1) {
xIzm2 = xIzm1;
}
delay(300);
}
if (i == 0) {
if (digitalRead(levo) == HIGH) {
Speed++;
xIzm1 -= Speed;
if (xIzm1 < 60) {
xIzm1 = 60;
}
}
if (digitalRead(pravo) == HIGH) {
Speed++;
xIzm1 += Speed;
if (xIzm1 > 320) {
xIzm1 = 320;
}
}
}
else {
if (digitalRead(levo) == HIGH) {
Speed++;
xIzm2 -= Speed;
if (xIzm2 < xIzm1) {
xIzm2 = xIzm1;
}
}
if (digitalRead(pravo) == HIGH) {
Speed++;
xIzm2 += Speed;
if (xIzm2 > 320) {
xIzm2 = 320;
}
}
}
if (digitalRead(pravo) == LOW && digitalRead(levo) == LOW) {
Speed = 0;
}
tft.setRotation(1);
x = 60;
for (int y = 0; y < 260; y++) {
x = x + z;
tft.drawLine(x, massDEL[y], x + 1, massDEL[y + 1], BLACK); //стираем график
tft.drawLine(x, mass[y], x + 1, mass[y + 1], GREEN); //график
}
tft.setRotation(1);
tft.drawFastVLine(xIzm1del, 10, 185, BLACK);
tft.drawFastVLine(xIzm1, 10, 185, GREY);
xIzm1del = xIzm1;
if (i == 1) {
tft.drawFastVLine(xIzm2del, 10, 185, BLACK);
tft.drawFastVLine(xIzm2, 10, 185, GREY);
xIzm2del = xIzm2;
tft.fillRect(100, 220, 200, 20, BLACK);
tft.setCursor(100, 220);
tft.print(1000000 / ((((xIzm2 - xIzm1)*t) / 501) / z));
tft.print("Hz");
}
}
}
/////////////////////Коэффициент заполнения
uint32_t asm_func(uint8_t flag){
asm volatile (
"cli" "\n\t"
"mov r21,%0" "\n\t" // флаг что считывать
//конфигурация таймеров
"ldi r18,0x83" "\n\t" // GTCCR=0x83
"out 0x23,r18" "\n\t" // GTCCR=0x83
"sts 0x80,__zero_reg__" "\n\t" // TCCR1A=0
"ldi r19,0x4" "\n\t"
"sts 0x81,r19" "\n\t" // TCCR1B=1<<CS12
"sts 0x85, __zero_reg__" "\n\t"//TCNT1L=0
"sts 0x84, __zero_reg__" "\n\t"//TCNT1H=0
"sts 0xB0,__zero_reg__" "\n\t" // TCCR2A=0
"ldi r20,0x1" "\n\t"
"sts 0xB1,r20" "\n\t" // TCCR2B=1<<CS20
"sts 0xB2,__zero_reg__" "\n\t" // TCNT2=0
"sts 0x70,__zero_reg__" "\n\t" // TIMSK2=0
// пройти если ноль
"wait_begin:" "\n\t"
"sbic 0x9,5" "\n\t" // Порт D5
"rjmp wait_begin" "\n\t"
// пройти если единица -> первый импульс
"wait_start:" "\n\t"
"sbis 0x9,5" "\n\t"
"rjmp wait_start" "\n\t"
"sts 0x43,__zero_reg__" "\n\t" // GTCCR=0 старт синхра
// импульс пошёл, ждём ноль
"wait_pause:" "\n\t"
"sbic 0x9,5" "\n\t"
"rjmp wait_pause" "\n\t"
"cpi r21,__zero_reg__" "\n\t" //
"brne duty" "\n\t"
// импульс кончился, ждём конца периода (единицу)
"wait_end:" "\n\t"
"sbis 0x9,5" "\n\t"
"rjmp wait_end" "\n\t"
"duty:" "\n\t"
"ldi r18,0x00" "\n\t" // GTCCR=0x00
"out 0x23,r18" "\n\t" // GTCCR=0x00 старт таймеры
//вывод 3х байт
"lds r22, 0xB2" "\n\t" // tctn2 0 байт
"lds r23, 0x84" "\n\t" // TCNT1L 1 байт
"lds r24, 0x85" "\n\t" // TCNT1H 2 байт
"lds r25, __zero_reg__" "\n\t" // пустой 3 байт
"sei" "\n\t"
::"r" (flag): ); }
/////////////////////Коэффициент заполнения
Эти все не идут комплектом с дуней. Принято указвать в комментах линки от куда бралась библа и ее версия.
240265 пишет:
А к какому скетчу посмотрите несколькими постами выше. А лучше всю ветку перечитайте ! Я им больше не занимаюсь !
Я тут с самого начала, но очень быстро ветка перешла в воду и я бросил наблюдать. А вот вчера вечером решил собрать, ибо желание дикое возникло. А тут как раз Ваш коммент.
А так спасибо. Как я понимаю без ОУ - это самая-самая версия?
есть проблема,Сразу после запуска он сам переключает режимы,как будто я нажимаю кнопки,плату осмотрел...
Может не установили резисторы подтяжки на землю? Если установили, проверте, всё ли там в порядке. Без резисторов будет бардак там.
есть проблема,Сразу после запуска он сам переключает режимы,как будто я нажимаю кнопки,плату осмотрел...
Может не установили резисторы подтяжки на землю? Если установили, проверте, всё ли там в порядке. Без резисторов будет бардак там.
С чего ли? Ставя пин на выход мы по дефолту подтягиваем его к земле. и ни чего там не будет страшного
Скажите, будут ли на основной страничке пультоскопа полные комплекты материалов вариантов от Slider, Sasha80 ? Спасибо.
С чего ли? Ставя пин на выход мы по дефолту подтягиваем его к земле. и ни чего там не будет страшного
Не знаю что должно быть по теории, а вот в практике, когда я делал пробный запуск своего, без резисторов на землю входы кнопок жили своей жизнью. Так что мой совет остаётса, это реально из практики.
тоже без кнопок запускал, неудачно, пришлось на макетке паять, попробуйте резисторы дальше видно будет...
И этот заливал
У меня лишь пины другие и резисторы R4-R8 на 5.1кОм,а R1-R2 на 10
Bosch
Все три варианта, требуют подтяжки пина к змле резисторами 10-100 КОм.
Без них пины висят в воздухе и ловят наводки от них и срабатывают.
Хорошо,спасибо,сегодня подтяну)
Скажите, будут ли на основной страничке пультоскопа полные комплекты материалов вариантов от Slider, Sasha80 ? Спасибо.
bodriy2014 на своем сайте обозначил главное, а там уже кому как заблагорассудится реализовать.
по поводу как делал в постах (разобрал, схему накидал, обычно схемы в голове, т.к. оригинал изменяется по мере изготовления желаемого результата)
comment-2161 и comment-2168
напомню
схема получилась такая:
(так наглядней и быстрей выполнить, дабы не тратить время на обдумывание как и куда скроссировать проводники)
дисплей (его Vcc) запитал от падения напряжения на его белых светодиодах. параллельно добавил кондер smd 1мкф на всяк случай . это видно на фото с лицевой стороны. там на подсветке еще оказался большого сопротивления резистор 470 ом , просто добавил ему в параллель 100 ом для увеличения яркости подсветки.
все необходимые библиотеки с оболочкой, взял с сайта bodriy2014 : https://drive.google.com/file/d/0BxfSZik0BpsAZHNDbjBUVzY4dlU
скетч немного переделал под кнопки без внешних подтягивающих резисторов, с удобным подключением дисплея как на фото, с навигацией в главном меню по + и - .
// конечно про переключение - и ~ путем добавления последовательно кондера - это не профи для АЧХ, но на точность измерения не претендую. Параллельно Vcc и GND на ардуине , прицепил стабилитрон 5,1в так на всяк случай ( при выходе внешнего стаба , чтоб atmega328 жива осталась) . На вход пина A3 (осцила) не рекомендую тупо ставить стабилитрон 5.1в - он имеет утечку и емкость несколько nF ) , уж лучше smd 1n4148 диоды на GND и Vcc , чтоб переполюсовку и излишек на входе пина A3 скидывали на питание.
если подержать родную кнопку включения на этом повербанке, или быстро жамкнуть ее 3 раза , то повербанк выдает на USB 5в, от него и запитал повышайку на 7,5-5в для ровных и точных 5.0в от параметрического стаба на плате арруино, чтобы не зависеть от просадки доп нагрузки на USB. Выключается 2-3 сек. нажатием на кнопку.
Для некоторых типов повербанков, надо вешать доп нагрузку на USB , а то из-за маленького потребления arduino , повербанк выключает свой преобразователь. или просто подключить повышайку mt3608 через механический выключатель прям на литий.
bodriy2014 , если будете что нибудь добавлять в прогу, мож рассмотрите еще какие нибудь хотелки , если будет интерес конечно, такие как счетчик импульсов, подсчет оборотов простых двигателей , раз уж памяти еще хватает
Sketch uses 19 176 bytes (62%) of program storage space. Maximum is 30 720 bytes.
а т.к. оперативная почти исчерпана, так можно использовать переменные с соседних функций, все равно же с момента включения пультоскопа используем только одну функцию. а затем либо выкл/вкл , либо кнопка сброс на ардуине.
Можно помимо напряжения акб, на главном экране, еще вывести температуру от внутреннего датчика atmega328 (здесь на сайте об этом тема была).
можно и доп. автомобильных оборотов - тахометр; проверка датчиков ds18b20, типа рисование графика по изменению температуры с 4-10 датчиков.
Или дисплей SPI ILI9341 320х240 приделать в догонку
Я уже приделал)))
man_200: "Или дисплей SPI ILI9341 320х240 приделать в догонку"
Так вон чуть выше скетч от ST7735 переделан под ILI9341, правда не до конца но наверное работает...
Bosch вроде пробовал
На самом деле,был использован скетч от 9340,а схема от 7735)
Уважаемый Slider, очень Вам признателен за пояснения и код к Вашему варианту, Спасибо!
На самом деле,был использован скетч от 9340,а схема от 7735)
Второй скетч - мой ,переделаный. Шапку в скетче прочитайте.
Причем старый. Вот новый под ST 7735
Так он пойдет на 9341? Как скорость отрисовки?
пошел плату рисовать. У меня на рассыпухе будет
Так он пойдет на 9341? Как скорость отрисовки?
пошел плату рисовать. У меня на рассыпухе будет
под ST 7735, под 9341 Bosch вроде бы переделал, спросите у него.
Я больше ЕГО ковырять не буду, сейчас ковыряю потихоньку на STM32F303.
... сейчас ковыряю потихоньку на STM32F303.
Это Вы про вариацию осциллографа "Fusion-Мурзик"? Или может другое?
Да, Fusion-IVL-Мурзик :))
просьба 240265, пожалуйста добавте в предыдущий Ваш пост, там где фотки - коротко ссылки, в каком посту именно этот скетч, какой дисплей, схема. Так будет здоровски удобно и понятно :) Спасибо.
А я и не претендовал на авторство)Спасибо за новую версию!Но мне хотелось бы больше функций,как для 128*160,но там нужно много редактировать(
Экран ST7735 160x128
Схема пост #2308
Скетч пост 2318
Фото пост 2320
А я и не претендовал на авторство)Спасибо за новую версию!Но мне хотелось бы больше функций,как для 128*160,но там нужно много редактировать(
Авторство bodriy2014 , остальное доработки. Доделайте если есть интерес под 9341 Народ Вам спасибо скажет.
У меня там тоже не все гладко. Но чтото смотреть можно.
Сейчас использую как генератор.

Интерес-то есть,да только в программировании я не шарю(
Интерес-то есть,да только в программировании я не шарю(
Если работает то там нужно количество точек подкорректировать везде где вывод на экран.
Скажите пожалуйста, 240265, что за корпус это у Вас использован?
Скажите пожалуйста, 240265, что за корпус это у Вас использован?
предполагаю с алиэкспресса за 50 рублей штука
Интерес-то есть,да только в программировании я не шарю(
Пришел от кумовей, вечерю носили немного «веселый»,
прочитал ваш пост и сразу на душе потеплело и настроение еще поднялось!!!)
Вот ради таких ощущений многие вещи и выкладываю в сеть!)
Скажите пожалуйста, 240265, что за корпус это у Вас использован?
Aha, понял про коробочку, Спасибо. 5 штук за 3 доллара - неплохо :)
Ребят,а к каким входам вы подключали щуп?А то на всех схемах лишь один вход
Ребят,а к каким входам вы подключали щуп?А то на всех схемах лишь один вход
А как в скетче установить другие пины?
Строки кода определяющие вход АЦП A3 или A4 http://arduino.ru/forum/proekty/pultoskop-na-arduino-27mgts?page=13#comment-177453
А если у меня D5 занят?Как его изменить в скетче?
http://arduino.ru/forumy/programmirovanie
http://arduino.ru/forum/proekty/pultoskop-na-arduino-27mgts
если я правильно понял для измерения частоты в пультоскопе подключается либа FreqCount https://www.pjrc.com/teensy/td_libs_FreqCount.html
http://arduino.ru/forum/apparatnye-voprosy/chastotomer-na-arduino-uno-i-lcd-keypad-shield
измеряемая частота подается на pin 5 (для FreqCount), причем, похоже, что изменить их на другие в исходных текстах этих библиотек невозможно, поскольку они связаны с конкретными входами таймеров Arduino
FreqCountTimers.h
.
.
.
// Arduino Duemilanove, Diecimila, LilyPad, Mini, Fio, etc
#elif defined(__AVR_ATmega328P__) || defined(__AVR_ATmega168__)
#define COUNTER_USE_TIMER1 // T1 is pin 5
#define TIMER_USE_TIMER2
.
.
.
Схема и скетч немного не совпадают , вот подправил.
Выходы D11-D13 лучше не менять (Hard SPI)
Решил на старости лет приобщитмя к микропроцессорной технике и начать с вашего проекта. нашел дисплей от нокии 5210 собрал схемку, залил скетч и ..... на экране изображение есть но буквы зеркально развернуты и счет строк идет не с верху, а снизу. в общем поковырялся я в библиотеке развернул буковки а с реверсом строк ничего не получилось-не разобрался где копать, поэтому перерисовал интерфейс непосредственно в коде программы. все работает. теперь разбираюсь с настройкой достоверности показаний напряжения и частоты. доделаю отпишусь и сброшу фотки.
240265, а к какому это скетчу?
Еще как я понял PWM эта та либа? http://arduino.ru/forum/programmirovanie/pwm-biblioteka-shim-arduino
Ну и адафруит https://github.com/adafruit/Adafruit-ST7735-Library Выкладывайте сразу линки на нестандартные библы.
и еще. собрал, а на выходе кракозябры. скинь либу с руссификатором. спасибо.
Надумал поиграться и импортировать в проект "Коэффициент заполнения" с предыдущей страницы, что заметил: функция останавливает таймеры и нужно опять запустить-в скетче исправил,руссификация по совету от сюда http://arduino.ru/forum/programmirovanie/rusifikatsiya-biblioteki-adafruit-gfx-i-vyvod-russkikh-bukv-na-displei-v-kodi?page=3,
подскажите пожалуйста какой можно придумать фильтр чтобы расчет был при наличии импульсов, так-как при отсутствии останавливается на расчете в ожидании изменения уровней? Пока проверял в эмуляторе на Arduino не тестил,читает с 5 порта частомера.
240265, а к какому это скетчу?
Еще как я понял PWM эта та либа? http://arduino.ru/forum/programmirovanie/pwm-biblioteka-shim-arduino
Ну и адафруит https://github.com/adafruit/Adafruit-ST7735-Library Выкладывайте сразу линки на нестандартные библы.
и еще. собрал, а на выходе кракозябры. скинь либу с руссификатором. спасибо.
Во Вы спросили. где брал, полгода прошло.
Саму ардуину и библиотеки отсюда http://srukami.inf.ua/pultoscop_v25110.html и http://srukami.inf.ua/pultoscop_v2.html . Русский шрифт находится в Adafruit GFX. А под ST 7735 на сайте Adafruit посмотрите.
Или в гугле.
А к какому скетчу посмотрите несколькими постами выше. А лучше всю ветку перечитайте ! Я им больше не занимаюсь !
http://arduino.ru/forum/proekty/pultoskop-na-arduino-27mgts?page=46#comment-249660
И нету там нестандартных библиотек .
http://arduino.ru/forum/proekty/pultoskop-na-arduino-27mgts?page=46#comment-249660
И нету там нестандартных библиотек .
#include <Adafruit_GFX.h> // Core graphics library
010
#include <Adafruit_ST7735.h> // Hardware-specific library
012
#include <FreqCount.h>
013
#include <PWM.h>
Эти все не идут комплектом с дуней. Принято указвать в комментах линки от куда бралась библа и ее версия.
А к какому скетчу посмотрите несколькими постами выше. А лучше всю ветку перечитайте ! Я им больше не занимаюсь !
Я тут с самого начала, но очень быстро ветка перешла в воду и я бросил наблюдать. А вот вчера вечером решил собрать, ибо желание дикое возникло. А тут как раз Ваш коммент.
А так спасибо. Как я понимаю без ОУ - это самая-самая версия?
Входная часть на Ваше усмотрение.
Скетч переделывался из LS020.
Но в принипе это смотрелка. Посерьезней уже навалом простых проектов.
У меня не заработал русский шрифт