Пультоскоп на Arduino 27МГц!!!

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

cilentlekx пишет:

я использовал за основу скетч с tft 2.4 ,а синхронизацию с последнего финального с 5110

Я поэтому и спросил, я сразу сделал синхронизацию и на этот дисплей но не выкладывал.

Дайте почту я скину вам последний неопубликованный скетч, там есть синхронизация и стирание графика черной линией.

Мне в коментах на ютюбе написали что его можно ускорить пока не разберусь как сделать быстрым не будет публичных видео и прошивок по нему.

cilentlekx
Offline
Зарегистрирован: 14.12.2014
    cilentlekx@ya.ru

 

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

cilentlekx пишет:

    cilentlekx@ya.ru

 

Скинул на почту, обкатаете если окажется лучше того что есть выложу для всех!)

cilentlekx
Offline
Зарегистрирован: 14.12.2014

bodriy2014 пишет:

cilentlekx пишет:

я использовал за основу скетч с tft 2.4 ,а синхронизацию с последнего финального с 5110

Я поэтому и спросил, я сразу сделал синхронизацию и на этот дисплей но не выкладывал.

Дайте почту я скину вам последний неопубликованный скетч, там есть синхронизация и стирание графика черной линией.

Мне в коментах на ютюбе написали что его можно ускорить пока не разберусь как сделать быстрым не будет публичных видео и прошивок по нему.

спасибо! получил. только теперь вопрос а с каким дисплеем? Там пины под дополнительные кнопки а уменя они заняты дисплеем

cilentlekx
Offline
Зарегистрирован: 14.12.2014

вот мой скетч.Может сможете подправить?то есть синхронизация работает,но только если рисование графика происходит со стиранием области

// проекта страничка 
// Дистплей TFT SPFD5408
#include <Adafruit_GFX.h> // Основные графическая библиотека
#include <Adafruit_TFTLCD.h> // Аппаратно-конкретной библиотеки
// # включить "MedianFilter.h"
// # включить "AvgFilter.h" 

// # Определить PAUSE 500
// # Определить INPUT_PIN A5
// Медианный фильтр медианный фильтр (5); 


#define LCD_CS A3 // Chip Select идет Analog 3
#define LCD_CD A2 // Command / Data идет аналоговый 2
#define LCD_WR A1 // LCD Запись идет с аналогового входа 1
#define LCD_RD A0 // LCD Чтение переходит в аналоговый 0
#define LCD_RESET A4 // Может попеременно просто подключить к Arduino сброса ПИН в
#define ЧЕРНЫЙ 0x0000
#define СИНИЙ 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define ЖЕЛТЫЙ 0xFFE0
#define WHITE 0xFFFF
Adafruit_TFTLCD TFT (LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
// Пользовательские настройки !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!
#define лево- 12
#define ОК 11
#define 10 и право
// Пользовательские настройки !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!
// Байт масса [1301]; // массив АЦП
// INT масса [130]; // массив АЦП
байт масса [501]; // массив АЦП
байт massDEL [501];
Меню байт = 0; // переменная верхнего меню
байт razv = 0; // значение развертки
байт SINU = 20;
плавать х = 48; // счетчик оси Х
INT Vmax = 0; // максимальное напряжение 
плавать Vakb = 0; // напряженеиЕКБ
без знака длиной т = 0; // переменная для ращета развертки
неподписанных длинная пауза = 0; // переменная для замены Задержка
INT t_del = 0; // Значение цены деления развертки в микросекундах
BOOL opornoe = 1; // Флаг опорного напряжения
BOOL Paus = 0; // Флаг режима паузы
BOOL clen_p = 0; // флаг чистки паузы
Int я;
плавать Вэл = 0;
INT сырец;
байт sinhMASS = 0;
 INT = 5 SX;

////////////////////////////////////////////////// ////////////////////////////////////////////
недействительными установки () {  
    Vakb = analogRead (A6) * 5,3 / 1024; // проверка напряжения на АКБ
    // Если (opornoe == 0) {ADMUX = 0b00100101;} // выбор внутреннего опорного 1,1В
    // Если (opornoe == 0) {ADMUX = 0b11100101;} // выбор внутреннего опорного 1,1В
    // Если (opornoe == 1) {ADMUX = 0b01100101;} // Выбор внешнего опорного
    /////// A4 /////////////////////
    если (opornoe == 0) {ADMUX = 0b11100100;} // выбор внутреннего опорного 1,1В
    если (opornoe == 1) {ADMUX = 0b01100100;} // Выбор внешнего опорного
    Идентификатор uint16_t = tft.readID ();  
    tft.begin (идентификатор);
    tft.setRotation (1);
    задержка (50);
    tft.fillScreen (BLACK);
    Задержка (500);
   // PinMode (A5, INPUT);
}
аннулированию Zamer () {// заполнение буфера АЦП
  если (razv> = 6) {ADCSRA = 0b11100010;} // delitel 4
  если (razv == 5) {ADCSRA = 0b11100011;} // delitel 8
  если (razv == 4) {ADCSRA = 0b11100100;} // delitel 16
  если (razv == 3) {ADCSRA = 0b11100101;} // delitel 32
  если (razv == 2) {ADCSRA = 0b11100110;} // delitel 64
  если (razv <2) {ADCSRA = 0b11100111;} // delitel 128
  если (razv == 0) {
      т = MICROS (); 
      для (INT I = 0; я <500; я ++) { 
          в то время как ((ADCSRA & 0x10) == 0);
          ADCSRA | = 0x10;
          delayMicroseconds (100);
          масса [г] = ADCH;                           
      }
      т = MICROS () - т;
      t_del = т * 25/501;
  }  
  если (razv> 0) {
      т = MICROS ();
      для (INT I = 0; я <500; я ++) { 
          в то время как ((ADCSRA & 0x10) == 0);
          ADCSRA | = 0x10;
          масса [г] = ADCH;          
      }
      т = MICROS () - т;
      t_del = т * 25/501;
  }  
}

////////////////////////////////////////////////// ////////////////////////////////////////////////
недействительным Graf ()
{   
  //tft.fillCircle(100+SinU/2,35, 2, CYAN); // рисуем уровень синхронизации 
  tft.fillRect (24,43,300,162, черный);
   
      х = 23;
      для (Int у = sinhMASS, Y <= sinhMASS + 290, Y ++) {
      // Для (INT у = 0; у <= 290; у ++) {
      
          если (razv <7) {х ++;}
         если (razv == 7) {х = х + 2;}
         если (razv == 8) {х = х + 3;}
          если (razv == 9) {х = х + 4;}
          если (razv == 10) {х = х + 5;}          
             tft.drawLine (х, 195-massDEL [у] /1.85, х + 1195-massDEL [у + 1] /1.85+1, черный); // стираем график
      tft.drawLine (х, 195-масса [у] /1.85, х + 1,195 массы [у + 1] /1.85+1, ЗЕЛЕНЫЙ); // график        
  }
  // SinhMASS = 0;
 // MassDEL [I] = масса [г];
  
  // Для (INT I = 0; я <300; я ++) {massDEL [I] = масса [I];} // sinhMASS = 0;}
  sinhMASS = 0;           
      }     
//////////////////////////////////////////////////////////////////////////////////////////////////////

аннулированию Menut () {// перерисовка нижнего меню     
    tft.setTextSize (2); 
    tft.fillRect (20,220,80,22, черный); // стирание времени развертки
     tft.setTextColor (Cyan);
    tft.setCursor (0220);
    tft.print ( "т =");
    если (razv <7) {tft.print (t_del);}
    если (razv == 7) {tft.print (t_del / 2);}
    если (razv == 8) {tft.print (t_del / 3);}
    если (razv == 9) {tft.print (t_del / 4);}
    если (razv == 10) {tft.print (t_del / 5);}
    tft.print ( "MC");
    tft.setTextColor (RED);
    tft.setCursor (120220);
    tft.print ( "Vmax =");
    tft.fillRect (180,220,50,22, черный);
    если (opornoe == 0) {tft.print (Vmax * 1,1 / 255);}
    если (opornoe == 1) {tft.print (Vmax * 5.3 / 255);}
    tft.setTextColor (ЗЕЛЕНЫЙ);
    tft.setCursor (245220);
    tft.print ( "Bt");
    tft.fillRect (275,220,50,22, черный);
    tft.print (Vakb);
    ////////////////////////////////////////////////// //////////////////////////
   // Вэл = pulseIn (A5, HIGH);
 // Tft.setCursor (195,28);
 // Tft.fillRect (195,28,80,14, черный);
  //tft.print(1000000/val/2,0);
  //tft.print(medianFilter.process(raw),DEC);     
}

аннулируются петля () {
Zamer (); 

 // ####################################### Определение точки синхронизации
BOOL flagSINHRO = 0;
BOOL flagSINHRnull = 0;
для (INT у = 0; у <255; у ++) {
  если (flagSINHRO == 0) {
    если (масса [г] <SINU) {
      flagSINHRnull = 1;}}
      
  если (flagSINHRO == 0) {
    если (flagSINHRnull == 1) {
      если (масса [г]> SINU) {
        flagSINHRO = 1; sinhMASS = у;}}}}

  
// Отрисовка и перебор меню ###############################
если (меню == 1) {
  //tft.fillRect(35,30,SinU,5,BLACK);
  tft.setTextColor (RED);
   tft.setTextSize (2); 
  tft.setCursor (5,29);
  tft.print ( "синхр.");
  tft.setTextSize (2);  
 tft.fillRect (0, 0, 95, 25, Cyan);
//tft.setTextColor(CYAN);
  tft.setCursor (5,5);
  если (opornoe == 0) {tft.print ( "оп-1.1V");}
  если (opornoe == 1) {tft.print ( "оп-5.3V");}
  если (digitalRead (Pravo) == HIGH) { 
    tft.fillRect (0,37,38, 150, черный); // стирание напряжения
    ! Opornoe = opornoe;}
  если (digitalRead (лево-) == HIGH) { 
    tft.fillRect (0,32,38,150, черный); // стирание напряжения
    ! Opornoe = opornoe;}
  tft.setTextSize (2); 
   tft.setTextColor (RED);  
  tft.print ( "Razv *");
  tft.print (razv);
  tft.setCursor (195,5);
  tft.print ( "Pause-OFF"); 
}
если (меню == 2) {
  tft.setTextColor (RED);
  tft.setTextSize (2);
  tft.setCursor (5,29);
  tft.print ( "синхр."); 
  tft.fillRect (95, 0105, 25, CYAN);
  tft.setCursor (5,5);
  если (opornoe == 0) {tft.print ( "оп-1.1V");}
  если (opornoe == 1) {tft.print ( "оп-5.3V");}
  если (digitalRead (Pravo) == HIGH) {// доработать скорость
    tft.fillRect (23,46,300,150, черный);
  razv ++;
  если (razv == 11) {razv = 10;} 
  }
  если (digitalRead (лево-) == HIGH) {// доработать скорость
    tft.fillRect (23,46,300,150, черный);
  razv--;
  если (razv == 255) {razv = 0;} 
  }
   //tft.setTextColor(CYAN);
  tft.print ( "Razv *");
   //tft.setTextColor(RED);
  tft.print (razv);
  tft.setCursor (195,5);
  tft.print ( "Pause-OFF");
}
если (меню == 3) {// пауза
  Paus = 1;
  если (clen_p == 0) {
  clen_p = 1;  
  tft.setTextColor (RED);
  tft.setTextSize (2);
  tft.setCursor (5,29);
  tft.print ( "синхр."); 
  tft.fillRect (205, 0110, 25, CYAN);
  tft.setCursor (5,5);
  если (opornoe == 0) {tft.print ( "оп-1.1V");}
  если (opornoe == 1) {tft.print ( "оп-5.3V");}
  tft.print ( "Razv *");
  tft.print (razv);
  //tft.setCursor(195,5);
  //tft.print ( "Pause-OFF");
   //tft.setTextColor(CYAN);
  tft.setCursor (200,5);
  если (Paus == 0) {tft.print ( "Pause-OFF");}
  tft.setCursor (195,5);
  если (Paus == 1) {tft.print ( "Pause-ON");}
}
}
////////////////////////////////////////////////// //////
если (меню == 0) {// пауза
  Paus = 0;
 // Если (clen_p == 0) {
  // Clen_p = 1;  
  tft.setTextColor (ЗЕЛЕНЫЙ);
  tft.setTextSize (2);
  tft.setCursor (5,29);
  tft.print ( "синхр."); 
  //tft.fillRect(205, 0110, 25, CYAN);
  tft.setTextColor (RED);
  tft.setCursor (5,5);
  если (opornoe == 0) {tft.print ( "оп-1.1V");}
  если (opornoe == 1) {tft.print ( "оп-5.3V");}
  tft.print ( "Razv *");
  tft.print (razv);
  tft.setCursor (195,5);
  tft.print ( "Pause-OFF");
  
 если (digitalRead (лево-) == HIGH) {
  задержка (100);
  tft.fillRect (80,35,240,5, черный);
      SINU = SINU-20;      
      если (SINU <20) {SINU = 20;}
      }
      
    если (digitalRead (Pravo) == HIGH) {
      задержка (100);
      SINU = SINU + 20;
       = SX + 5 SX;
       
      если (SINU> = 240) {SINU = 240;}
      если (SX> = 60) {= 60 SX;}
     
}
 tft.fillRect (80,35, Sx, 5, Magenta);
}
////////////////////////////////////////////////// //////////////
 
если (digitalRead (ОК) == HIGH) {
  Меню ++;
  если (меню == 4) {
    задержка (100);
    Меню = 0; Paus = 0; clen_p = 0;}
   // Меню = 0; Paus = 0;}
  tft.fillRect (0, 0320, 25, черный);    
}
// Отрисовка и перебор меню ###############################
// Выбор опорного #########################################  
если (opornoe == 0) {ADMUX = 0b11100101;} // выбор внутреннего опорного 1,1В
если (opornoe == 1) {ADMUX = 0b01100101;} // Выбор внешнего опорного
задержка (5);
// Выбор опорного #########################################  
; 
// Ось напряжения ##########################################
////////////////// пунктир
для (я = 21; г <320; я + = 10) {
     tft.drawPixel (я, 129, синий);}
для (я = 21; г <320; я + = 10) {
     tft.drawPixel (я, 64, синий);}
     
tft.drawLine (21,46,21,205, RED);
tft.drawLine (11,64,21,64, ЗЕЛЕНЫЙ); // Риска напряжения
tft.drawLine (11,90,21,90, ЗЕЛЕНЫЙ); // Риска напряжения
tft.drawLine (11,116,21,116, ЗЕЛЕНЫЙ); // Риска напряжения
tft.drawLine (11,142,21,142, ЗЕЛЕНЫЙ); // Риска напряжения
tft.drawLine (11,168,21,168, ЗЕЛЕНЫЙ); // Риска напряжения
tft.drawLine (11,194,21,194, ЗЕЛЕНЫЙ); // Риска напряжения
// Ось времени #############################################
для (я = 46; я <205; я + = 10) {
     tft.drawPixel (146, я, синий);}

     для (я = 46; я <205; я + = 10) {
     tft.drawPixel (271, я, синий);}
     
tft.drawLine (22205320205, Magenta);
tft.drawLine (0,26,320,26, синий);
////////////////////////////////////////////////// //////
tft.drawLine (21,205,21,215, Magenta); // Риска времени Proba ///////////////////////////////////////////// /
tft.drawLine (46,205,46,210, RED); // Риска времени
tft.drawLine (71,205,71,210, Magenta); // Риска времени
tft.drawLine (96,205,96,210, RED); // Риска времени
tft.drawLine (121205121210, Magenta); // Риска времени
tft.drawLine (146205146215, RED); // Риска времени
tft.drawLine (171205171210, Magenta); // Риска времени
tft.drawLine (196205196210, RED); // Риска времени
tft.drawLine (221205221210, Magenta); // Риска времени
tft.drawLine (246205246210, RED); // Риска времени
tft.drawLine (271205271215, Magenta); // Риска времени
tft.drawLine (296205296210, RED); // Риска времени

// Ось времени ############################################# 
tft.setTextColor (RED);
tft.setTextSize (1);
// Шкала напряжения ########################################
если (opornoe == 0) {tft.setTextColor (Cyan);
    tft.setCursor (11, 184); tft.println ( "V"); 
    tft.setCursor (2, 184); tft.println ( "0"); 
    tft.setCursor (0, 158); tft.println ( "0,2"); 
    tft.setCursor (0, 132); tft.println ( "0,4"); 
    tft.setCursor (0106); tft.println ( "0.6"); 
    tft.setCursor (0, 80); tft.println ( "0,8"); 
    tft.setCursor (0, 54); tft.println ( "1.1");   
}
если (opornoe == 1) {tft.setTextColor (Cyan);
    tft.setCursor (11, 184); tft.println ( "V"); 
    tft.setCursor (2, 184); tft.println ( "0"); 
    tft.setCursor (0, 158); tft.println ( "1,0"); 
    tft.setCursor (0, 132); tft.println ( "2.0"); 
    tft.setCursor (0106); tft.println ( "3.0"); 
    tft.setCursor (0, 80); tft.println ( "4.0"); 
    tft.setCursor (0, 54); tft.println ( "5.0");   
}
// Шкала напряжения ########################################
если (Paus == 0) {Menut ();}
// Максимальное значение сигнала ##########################
Vmax = 0; 
для (INT I = 0; я <500; я ++) {  
        если (Vmax <масса [я]) {Vmax = масса [I];} 
}
// Максимальное значение сигнала ##########################
// Отрисовка графика№№№№№№№№№№№№№№№№№№№№№
если (Paus == 0) { 
  Graf ();
}
если (Paus == 1) {// режим паузы
    если (digitalRead (Pravo) == HIGH) {// листаем    
      Graf ();
      Menut ();
    }
    если (digitalRead (лево-) == HIGH) {// листаем
     Graf ();
      Menut ();
    }     
}
// Отрисовка графика№№№№№№№№№№№№№№№№№№№№№
}

 

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

cilentlekx пишет:

спасибо! получил. только теперь вопрос а с каким дисплеем? Там пины под дополнительные кнопки а уменя они заняты дисплеем

дисплей тот что и раньше //дистплей TFT SPFD5408,

кнопки подключать только эти

#define levo 12
#define ok 11
#define pravo 10

больше не нужно.

cilentlekx
Offline
Зарегистрирован: 14.12.2014

то есть синхронизация работает,но только если рисование графика происходит со стиранием области

cilentlekx
Offline
Зарегистрирован: 14.12.2014

а если стираю черной линией предыдущую, то происходит наложение линий графика

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

cilentlekx пишет:

а если стираю черной линией предыдущую, то происходит наложение линий графика

свой код держу в голове и если сяду за этот прибор снова то выпущу качественно новую прошивку, в нем помимо отрисовки графика нехватает частотомера. Чужой код вникать и править для меня тежело, делаю это только в исключительных случаях.

Ковыряйте ту прошивку что скинул или ждите новую улучшенную, извините большим помочь не могу.

cilentlekx
Offline
Зарегистрирован: 14.12.2014

понял,спасибо!

karl2233
Offline
Зарегистрирован: 05.07.2015

bodriy2014 пишет:
 ждите новую улучшенную

ооо! зер гут! )

вот что подумал - а что если кнопки засадить на один пин? есть же вариант через резисторы цепляют на аналоговый вход. тогда получим 2 свободных пина.

или это лишнее усложнение?

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

karl2233 пишет:

bodriy2014 пишет:
 ждите новую улучшенную

ооо! зер гут! )

вот что подумал - а что если кнопки засадить на один пин? есть же вариант через резисторы цепляют на аналоговый вход. тогда получим 2 свободных пина.

или это лишнее усложнение?

Можно и так, только зачем свободные пины, что к ним цеплять? Небось ваши любимые ТТ Маркуса?)))

karl2233
Offline
Зарегистрирован: 05.07.2015

не-не. я только в Ваш прибор прикручу тестер батареек(то же Ваш) и, если смогу, Люксомер. так что мне пинов хватит ))

а вот строк в меню может не хватить - влазит 4 +1.

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

karl2233 пишет:

не-не. я только в Ваш прибор прикручу тестер батареек(то же Ваш) и, если смогу, Люксомер. так что мне пинов хватит ))

а вот строк в меню может не хватить - влазит 4 +1.

Я бы не планировал так много в него совать, там есть свободное место и оперативка у меня на нее планы по части улучшения отображения сигнала осциллограммы.

karl2233
Offline
Зарегистрирован: 05.07.2015

ок, учту про память. но вроде скетчи батарейкомера и люксомера не занимают много места и вывод в порт я уберу из Вашего(мне он просто не нужен).

ну или откажусь от чего-то: Пультоскоп важнее =)

bpl
Offline
Зарегистрирован: 15.02.2016

bodriy2014 – кстати по поводу наших любимых ТТ вы знакомы с проектом

может и здесь зделать что-то подобное Makefile у народа дисплеев разных полно выбрал нужный скомпилировал добавил нужный функционал меню на разный язык и т.д. Конечно тоже надо разбираться но ведь проект интересен и популярен и из за этого.

karl2233
Offline
Зарегистрирован: 05.07.2015

bpl, зачем?

проект открытый, можно и так всё сделать. кроме того, тот кто умеет компилировать в готовом коде точно разберётся.

bpl
Offline
Зарегистрирован: 15.02.2016

компилировать это самое простое а вот разбираться с кодом для многих не то что сложно а просто невозможно.

karl2233
Offline
Зарегистрирован: 05.07.2015

ну хз... я вот прошивки ТТ никак не научусь компилировать, а вот в коде Пультоскопа по тихоньку разбираюсь и даж добавил меню =)

а вот по поводу начинки Пультоскопа мысля посетила мну: генератор используется частенько в связке с осцилом. вот и получается что не совсем удобное соседство...

 

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

bpl пишет:

bodriy2014 – кстати по поводу наших любимых ТТ вы знакомы с проектом

может и здесь зделать что-то подобное Makefile у народа дисплеев разных полно выбрал нужный скомпилировал добавил нужный функционал меню на разный язык и т.д. Конечно тоже надо разбираться но ведь проект интересен и популярен и из за этого.

Чтоб так делать нужно еще при написании кода это учесть и писать не на ардуино IDE а на С минимум.

Ардуиновские библиотеки экранов не стандартизированы относительно функций вывода, те кто пишут эти библиотеки как хотят так и организовывают вывод и функции вывода, под единый сборщик разные дисплеи не подошьешь.

fly245
fly245 аватар
Offline
Зарегистрирован: 25.08.2013

bodriy2014 пишет:

Чтоб так делать нужно еще при написании кода это учесть и писать не на ардуино IDE а на С минимум.

Ардуиновские библиотеки экранов не стандартизированы относительно функций вывода, те кто пишут эти библиотеки как хотят так и организовывают вывод и функции вывода, под единый сборщик разные дисплеи не подошьешь.

Есть одна либа -в ней многие экраны задействованы- U8glib

deserteagle3113
Offline
Зарегистрирован: 07.12.2015

Поддерживаю автора !  Проект на самом деле хорош ...  Спасибо !

bpl
Offline
Зарегистрирован: 15.02.2016

Присоединяюсь к высказыванию проект и приборчик просто замечательный. Уже было много успешных повторений на разных экранах и дополнительными функциями.

LCD  Siemens S65 L2F50

LCD  Siemens S65  ls020

Nokia LCD3410

TFT  Color 1.44” 128x128 контроллер ILI9163

Извиняюсь если что-то пропустил, информация раскидана по разным местам, было еще много интересных доработок, кто-то прикручивал энкондер, karl2233 пытается добавить люксомерт, и т.д. уже становится сложно что-то быстро найти.

Это хорошо что у автора разработки пультоскопа есть свой сайт где размещены основные разработки на экранах

LCD Nokia 5110  и  TFT 2.4 240x320 SPFD5408 с последними версиями схем и прошивок.

bodriy2014 – прошу вас разместить на своем сайте если это конечно возможно для ускорения поиска информации ссылки по теме на наиболее интересные и успешные работы для примера и добавлять новые чтобы это не кануло в бездну.

Прошу также пользователей форума дать ссылки на другие интересные и полезные наработки то этой теме из этого сайта или других источников.

схема входного тракта с сдвигом нуля

фильтр для DDS и делители

печатка для пультоскопа

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

Не проблема размещу, для того и сайт держу чтоб выкладывать для скачивания и не лазать па форумам.

Xumuk
Xumuk аватар
Offline
Зарегистрирован: 03.03.2016

VetalST пишет:

Xumuk пишет:
Повезло мне купил я наконец ls020 дисплей. Не могли бы скинуть скетч осцилографа или у вас другой экран? Хотелось бы повторить

Скетч я сегодня выложу. А пока поищите в инете библиотеку под ls020.

У меня есть но под старую версию arduino-0023 . Там есть примеры попробуйте загрузить и проверьте работу экрана. Если будут работать примеры то скетч осцилографа у вас тоже пойдет команды для экрана одинаковые.

Скачать Библиотеку под ls020  http://yadi.sk/d/hHmPJl5Hpy6VW

Скачать arduino-0023  http://www.arduino.cc/en/Main/OldSoftwareReleases#previous

добрый день не могли бы вы еще раз выложить библиотеку для дисплея, заранее благодарен

Xumuk
Xumuk аватар
Offline
Зарегистрирован: 03.03.2016

VetalST пишет:

Xumuk пишет:
Повезло мне купил я наконец ls020 дисплей. Не могли бы скинуть скетч осцилографа или у вас другой экран? Хотелось бы повторить

Скетч я сегодня выложу. А пока поищите в инете библиотеку под ls020.

У меня есть но под старую версию arduino-0023 . Там есть примеры попробуйте загрузить и проверьте работу экрана. Если будут работать примеры то скетч осцилографа у вас тоже пойдет команды для экрана одинаковые.

Скачать Библиотеку под ls020  http://yadi.sk/d/hHmPJl5Hpy6VW

Скачать arduino-0023  http://www.arduino.cc/en/Main/OldSoftwareReleases#previous

добрый день не могли бы вы еще раз выложить библиотеку для дисплея, заранее благодарен

slider
Offline
Зарегистрирован: 17.06.2014

bodriy2014 пишет:

.....что его можно ускорить пока не разберусь как сделать быстрым не будет публичных видео и прошивок по нему.

Отпишитесь мне на емайл (в своей теме про дисплеи от сотиков , указывал неоднократно), протестю скорость на разных либах и подключениях. Или черкните свой емайл. //Стирать линию можно не только закрашивая ее черными точками из массива ее нарисованности , но и применяя команды самого контроллера дисплея, но т.к. еще много инфы вокруг, которую не надо каждый раз стирать, то пока проще использовать все же затирание из массива. массив естественно из типа переменных byte

VetalST
Offline
Зарегистрирован: 29.12.2015

Xumuk пишет:

добрый день не могли бы вы еще раз выложить библиотеку для дисплея ls020, заранее благодарен

Удалил и эту не работает. Завтра скину рабочие.

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

bpl пишет:

.....

bodriy2014 – прошу вас разместить на своем сайте если это конечно возможно для ускорения поиска информации ссылки по теме на наиболее интересные и успешные работы для примера и добавлять новые чтобы это не кануло в бездну.

Прошу также пользователей форума дать ссылки на другие интересные и полезные наработки то этой теме из этого сайта или других источников.

схема входного тракта с сдвигом нуля

фильтр для DDS и делители

печатка для пультоскопа

ссылки добавил, и буду добавлять если нужно.

cilentlekx
Offline
Зарегистрирован: 14.12.2014

bodriy2014,Здравствуйте! Подскажите какие фьюзы нужно выставить для меги328 ,что бы можно было включить кварц на 27мгц.? За ранее спасибо!

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

cilentlekx пишет:

bodriy2014,Здравствуйте! Подскажите какие фьюзы нужно выставить для меги328 ,что бы можно было включить кварц на 27мгц.? За ранее спасибо!


Стандартные фьюзы ардуино, они есть в board.txt или в гугле.
Пишу с смартфона посмотреть не могу.

bpl
Offline
Зарегистрирован: 15.02.2016

Фьюзы установленные в Arduino Uno R3

Фьюзы считаны  AVR USB программатором USBasp  программой для прошивки SinaProg 2.1.1.RUS

LB-0F   HF-DE    EF-05   LF-FF

Atmega328 2.7V 8 MHz - external - внешний кварц 8MHz. Переход к загрузчику после сброса.

LB-0F      - лок-биты не выставляем - оставляем 0F или 3F

HF-DE    - Разрешить внутрисхемное программирование (SPI); [SPIEN=0]

               - Переход к загрузчику после сброса ; [BOOTRST=0]

EF-05     - VCC=2.7V  контроль напряжения питания микроконтроллера

LF-FF      - кварц-частота 8MHz (external - внешний кварц) 8 MHz.

               - Ext. Crystal Osc.; Frequency 8.0-MHz; Start-up time PWRDWN/RESET: 16K CK/14 CK + 65 ms;[CKSEL=1111 SUT=11]

         - Boot Flash section size=1024 words Boot start address=$3C00; [BOOTSZ=01]

Да с  Фьюзами не совсем понятно, сегодня знакомый собирал на Атмега328 в DIP корпусе  пультоскоп 5110(без ардуино на макетке m328-кварц27MHz-дисплей), по предыдущей версии, помогал ему прошивать (прошивал программатором USBasp  программой для прошивки SinaProg 2.1.1.RUS т.е. без ардуино IDE) ,  Фьюзы поставил такие как в UNO, запустили работает, т.е. есть меню, в режим осциллографа и генератора входим, к измерениям пока не приступали не успели. Так вот то что я выше приписал к фьюзам взято с Калькулятора фьюзов AVR не совсем понятно почему там стоит фиксированная частота   LF-FF - кварц-частота 8MHz (external - внешний кварц) 8 MHz. Хотя в UNO запаян на 16MHz. 

Если было бы вот так, то было бы понятнее.

LB:3F  - лок-биты не выставляем - оставляем 3F или 0F

EF:05  - VCC=2.7V - контроль напряжения питания микроконтроллера

НF:D9  - Разрешить внутрисхемное программирование (SPI); [SPIEN=0]

LF:F7  - (external-Ext. Full-swing Crystal - внешний кварц) X MHz.(какой поставим кварц такая будет и частота)

Надо будет попробовать.

Скетч из которого делал .HEX файлы

В связи с тем что в AtMega328 в корпусе DIP отсутствуют  2 пина A6 и A7, перевел  пин A6 который выделен в авторской прошивке для измерения напряжения АКБ, па пин A2. Проверил работает.

//Страница проэкта  http://srukami.inf.ua/pultoscop_v25110.html
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
#include <FreqCount.h> 
#include <PWM.h>
#define led  9   //пин для генератора сигналов (не менять)
//#################№№№№№№####пользовательские настройки
#define power 8 //пин который опрашивает кнопку включения
#define OFF 13//пин который управляет ключем питания
#define  timepowerON 50 //время удержания кнопки выключения
#define levo 10  //кнопка ЛЕВО(можно любой пин)
#define ok 11    //кнопка ОК(можно любой пин)
#define pravo 12 //кнопка ПРАВО(можно любой пин)
#define akb A2 //любой своюодный аналоговый пин для измерения напряжения АКБ 
#define overclock 27  //Частота на которой работает Ардуино 
Adafruit_PCD8544 display = Adafruit_PCD8544(2, 3, 4, 6, 7);//пины к которым у вас подключен дисплей          
byte cont=75;//контрастность дисплея
byte SinU=30;   //уровень синхронизации 0 до 255 
int PWM = 128;//стартовое значение ШИМ от 0 до 255        
int32_t frequency = 500; //стартовое значение частоты в Гц
float VCC=5.0;  //напряжение питания, меряем мультиметром
//###########################################################
int powerON=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; //флаг режима паузы
bool pultoskop=1; //флаг выбора генератора или осциллографа
byte razv=6;  
unsigned long count =0;
byte sinX=30; 
byte meaX=83;
int Vmax=0;// максимальное напряжение 
byte sinhMASS=0;
long countX=0;
void setup(){
digitalWrite(OFF,HIGH);//включем питание 
Serial.begin(9600);
display.begin();
display.setContrast(cont);  
while(digitalRead(ok)==LOW){  
/////////////////////////////////////////удержание кнопки отключения
if(digitalRead(power)==HIGH){powerON++;delay(10);}  
if(powerON>=timepowerON){digitalWrite(OFF,LOW);}///отключаем питание
/////////////////////////////////////////удержание кнопки отключения 
  if(pultoskop==1){
    display.clearDisplay();
    display.setCursor(10,10);
    display.setTextColor(WHITE, BLACK); // 'inverted' text
    display.println("Пультоскоп");
    display.setCursor(10,20);
    display.setTextColor(BLACK); 
    display.println("Генератор");
    display.setCursor(10,40);
    display.print("Батарея=");
    display.print(analogRead(akb)*5.0/1024);
    display.print("В");    
  }
    if(pultoskop==0){
    display.clearDisplay();
    display.setCursor(10,10);
    display.setTextColor(BLACK); // 'inverted' text
    display.println("Пультоскоп");
    display.setCursor(10,20);
    display.setTextColor(WHITE, BLACK); // 'inverted' text
    display.println("Генератор");
    display.setCursor(10,40);
    display.setTextColor(BLACK); 
    display.print("Батарея=");
    display.print(analogRead(akb)*5.0/1024);
    display.print("В");   
  } 
if(digitalRead(levo)==HIGH){delay(200);pultoskop=!pultoskop;}
if(digitalRead(pravo)==HIGH){delay(200);pultoskop=!pultoskop;}
delay(50);  
display.display(); 
}  
if(pultoskop==1){
    FreqCount.begin(1000);   
}
if(pultoskop==0){
   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(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(digitalRead(power)==HIGH){powerON++;delay(10);}  
if(powerON>=timepowerON){digitalWrite(OFF,LOW);}///отключаем питание
/////////////////////////////////////////удержание кнопки отключения    
if(pultoskop==1){  
if(opornoe==0){ADMUX = 0b11100100;}//выбор внутреннего опорного 1,1В
if(opornoe==1){ADMUX = 0b01100100;}//Выбор внешнего опорного
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];} }
//максимальное значение сигнала##########################


//#######################################определение точки синхронизации
//#######################################отрисовка графика  
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-1, BLACK);
      display.drawLine(x+1, 47-mass[y]/7+1, x+2, 47-mass[y+1]/7-1, BLACK);        
}
sinhMASS=0;
//#######################################отрисовка графика
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)==HIGH){opornoe=!opornoe;}
    if(digitalRead(pravo)==HIGH){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)==HIGH){razv=razv-1;if(razv==255){razv=0;}}
    if(digitalRead(pravo)==HIGH){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)==HIGH){Zamer();}
    if(digitalRead(pravo)==HIGH){Zamer();}    
}
if(menu==3){
    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)==HIGH){SinU=SinU-20;if(SinU<20){SinU=20;}}
    if(digitalRead(pravo)==HIGH){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)==HIGH){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==0){Generator();}
}
//#######################################режим ренератора
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(0,5);
display.print("PWM=");
display.print(PWM*100/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/255);
          display.print("%"); 
          flag=1;
      } 
display.print("<<");        
pwmWrite(led, PWM);
delay(300);  
display.display();
}

Os_AtMega328_DIP                                             http://https://yadi.sk/d/sQ6X3AkJoszLZ

cilentlekx
Offline
Зарегистрирован: 14.12.2014

Спасибо,за консультацию! Решил просто сделать-Мегу 328Р в DIPе просто кварцем обвязать с двумя кондерами и делитель для 3.3в на дисплей. USB ASP тоже себе смастерил.

VetalST
Offline
Зарегистрирован: 29.12.2015

Xumuk пишет:

добрый день не могли бы вы еще раз выложить библиотеку для дисплея ls020, заранее благодарен

Вот ардуино ID 0022 уже с библиотекой и примерами  http://yadi.sk/d/sPCSAXbaqB7Ta

Вот библиотека с примерами http://yadi.sk/d/wWKSj1OHqB7jF ее мне скинул форумчанин она работает только с ардуино ID 1.0.5. лежит тут  http://yadi.sk/d/NabTbzKdqB85J.

Подключение дисплея в обеих библиотеках 

 S65_CS_PIN          (8) //PORTB 0
 S65_RST_PIN         (7) // PORTD 7
 S65_RS_PIN          (10)//PORTB 2
 S65_DAT_PIN         (11)//PORTB 3
 S65_CLK_PIN         (13)//PORTB 5

На днях должны превезти  дисплея ls020 тогда смогу точно сказать какая лутше.

 

D.I.M
Offline
Зарегистрирован: 14.03.2016

Доброго времени суток. Давно слежу за данной темой, и хочу выразить благодарность всем участникам форума за создание такого нужного прибора. От себя хотел бы добавить переделанный  код пультоскопа финал 2 под OLED I2C  LCD 128x64 0.96" графический дисплей. Проверил, вроде работает.  Я пока только начинаю интересоваться ардуино, так, что если в коде что-то не верно прошу поправить. С ув.

//Страница проэкта  http://srukami.inf.ua/pultoscop_v25110.html
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <FreqCount.h> 
#include <PWM.h>
#define led  9   //пин для генератора сигналов (не менять)

//#################№№№№№№####пользовательские настройки
#define power 8 //пин который опрашивает кнопку включения
#define OFF 13//пин который управляет ключем питания
#define  timepowerON 50 //время удержания кнопки выключения
#define levo 10  //кнопка ЛЕВО(можно любой пин)
#define ok 11    //кнопка ОК(можно любой пин)
#define pravo 12 //кнопка ПРАВО(можно любой пин)
#define akb A6 //любой своюодный аналоговый пин для измерения напряжения АКБ 
#define overclock 16  //Частота на которой работает Ардуино

#define OLED_RESET 4 
Adafruit_SSD1306 display(OLED_RESET); 
         
byte SinU=30;   //уровень синхронизации 0 до 255 
int PWM = 128;//стартовое значение ШИМ от 0 до 255        
int32_t frequency = 500; //стартовое значение частоты в Гц
float VCC=5.0;  //напряжение питания, меряем мультиметром

//###########################################################
int powerON=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; //флаг режима паузы
bool pultoskop=1; //флаг выбора генератора или осциллографа
byte razv=5;  
unsigned long count =0;
byte sinX=30; 
byte meaX=83;
int Vmax=0;// максимальное напряжение 
byte sinhMASS=0;
long countX=0;

void setup()
{
digitalWrite(OFF,HIGH);//включем питание 
//Serial.begin(9600);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);

 while(digitalRead(ok)==LOW){  
/////////////////////////////////////////удержание кнопки отключения
if(digitalRead(power)==HIGH){powerON++;delay(10);}  
if(powerON>=timepowerON){digitalWrite(OFF,LOW);}///отключаем питание
/////////////////////////////////////////удержание кнопки отключения 
  if(pultoskop==1){
    display.clearDisplay();
    display.setCursor(26,15);
    display.setTextColor(BLACK,WHITE); // 'inverted' text
    display.println("OSCILLOSCOPE");
    display.setCursor(34,30);
    display.setTextColor(WHITE); 
    display.println("GENERATOR");
    display.setCursor(24,55);
    display.print("BATERRY=");
    display.print(analogRead(akb)*5.0/1024);
    display.print("V");    
 }
    if(pultoskop==0){
    display.clearDisplay();
    display.setCursor(26,15);
    display.setTextColor(WHITE); // 'inverted' text
    display.println("OSCILLOSCOPE");
    display.setCursor(34,30);
    display.setTextColor(BLACK,WHITE); // 'inverted' text
    display.println("GENERATOR");
    display.setCursor(24,55);
    display.setTextColor(WHITE); 
    display.print("BATERRY=");
    display.print(analogRead(akb)*5.0/1024);
    display.print("V");   
  } 
if(digitalRead(levo)==HIGH){delay(200);pultoskop=!pultoskop;}
if(digitalRead(pravo)==HIGH){delay(200);pultoskop=!pultoskop;}
delay(50);  
display.display(); 
}  
if(pultoskop==1){
    FreqCount.begin(1000);   
}
if(pultoskop==0){
   InitTimersSafe(); 
   bool success = SetPinFrequencySafe(led, frequency); 
}
display.setTextColor(WHITE);
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(digitalRead(power)==HIGH){powerON++;delay(10);}  
if(powerON>=timepowerON){digitalWrite(OFF,LOW);}///отключаем питание
/////////////////////////////////////////удержание кнопки отключения
    
if(pultoskop==1){  
if(opornoe==0){ADMUX = 0b11100010;}//выбор внутреннего опорного 1,1В
if(opornoe==1){ADMUX = 0b01100010;}//Выбор внешнего опорного
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];
  } 
 }
//максимальное значение сигнала##########################


//#######################################определение точки синхронизации
//#######################################отрисовка графика  
display.clearDisplay();
display.fillCircle(122,62-SinU/5, 1, WHITE);//рисуем уровень синхронизации 
   
x=3;
for(int y=sinhMASS;y<sinhMASS+124;y++)

{
      if(razv<7){x++;}
      if(razv>=7){x=x+2;}
      //if(razv==8){x=x+3;}
      display.drawLine(x, 64-mass[y]/5, x+1, 64-mass[y+1]/5-1, WHITE);
      //display.drawLine(x+1, 64-mass[y]/5+1, x+2, 64-mass[y+1]/5-1, WHITE);        
}
sinhMASS=0;
//#######################################отрисовка графика
for(byte i=63;i>5;i=i-7){display.drawPixel(0,i, WHITE);display.drawPixel(1,i, WHITE);display.drawPixel(2,i, WHITE);}//разметка экрана  вертикальная

//////////////////////////////////////////////////сетка
for(byte i=127;i>5;i=i-4){/*display.drawPixel(32,i, WHITE);*/display.drawPixel(64,i, WHITE);/*display.drawPixel(96,i, WHITE);*/}
for(byte i=3;i<128;i=i+4){/*display.drawPixel(i,44, WHITE);*/display.drawPixel(i,38, WHITE);}
//////////////////////////////////////////////////сетка

//#######################################отрисовка menu
if(menu==0){
    display.setCursor(0,0);
    display.setTextColor(BLACK,WHITE);
    if(opornoe==0){display.print("1.1");delay(100);}
    if(opornoe==1){display.print(VCC,1);delay(100);}
    display.setTextColor(WHITE); 
    display.print(" ");
    display.print(razv);
    display.print(" P ");
    if(digitalRead(levo)==HIGH){opornoe=!opornoe;}
    if(digitalRead(pravo)==HIGH){opornoe=!opornoe;}    
}
if(menu==1){
    display.setCursor(0,0);
    display.setTextColor( WHITE);
    if(opornoe==0){display.print("1.1");delay(100);}
    if(opornoe==1){display.print(VCC,1);delay(100);}
    display.setTextColor(BLACK,WHITE); // 'inverted' text 
    display.print(" ");
    display.print(razv);
    display.setTextColor( WHITE); // 'inverted' text
    display.print(" P ");
    if(digitalRead(levo)==HIGH){razv=razv-1;if(razv==255){razv=0;}}
    if(digitalRead(pravo)==HIGH){razv=razv+1;if(razv==9){razv=8;}}
}
if(menu==2){
    display.setCursor(0,0);
    display.setTextColor( WHITE);
    if(opornoe==0){display.print("1.1");delay(100);}
    if(opornoe==1){display.print(VCC,1);delay(100);}
    display.print(" ");
    display.print(razv);
    display.setTextColor(BLACK,WHITE); // 'inverted' text 
    display.print(" P ");
    paus=1;
    if(digitalRead(levo)==HIGH){Zamer();}
    if(digitalRead(pravo)==HIGH){Zamer();}    
}
if(menu==3){
    paus=0;
    display.setCursor(0,0);
    display.setTextColor( WHITE);
    if(opornoe==0){display.print("1.1");}
    if(opornoe==1){display.print(VCC,1);}
    display.print(" ");
    display.print(razv);
    display.setTextColor(WHITE);
    display.print(" P ");
    if(digitalRead(levo)==HIGH){SinU=SinU-20;if(SinU<20){SinU=20;}}
    if(digitalRead(pravo)==HIGH){SinU=SinU+20;if(SinU>230){SinU=230;}}   
    display.fillCircle(122,62-SinU/5, 3, WHITE);
    display.fillCircle(122,62-SinU/5, 2, BLACK); 
}
if(digitalRead(ok)==HIGH)
{
  menu++;
  delay(100);
  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)/16;}//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( WHITE);
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(100,0);display.setTextColor(WHITE);
display.print(Vmax*VCC/255,1);}
if(opornoe==0){display.setCursor(100,0);display.setTextColor(WHITE);
display.print(Vmax*1.1/255,1);}
display.print("V");
//#######################################отрисовка menu
delay(5);  
display.display();
}
if(pultoskop==0){Generator();}
}
//#######################################режим ренератора
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(0,5);
display.print("PWM=");
display.print(PWM*100/255);
display.print(" %");
display.drawLine(0,0,127*PWM/255.0,0,WHITE);
display.drawLine(0,1,127*PWM/255.0,1,WHITE);
display.drawLine(0,2,127*PWM/255.0,2,WHITE);
display.drawLine(0,15,127*PWM/255.0,15,WHITE);
display.drawLine(0,16,127*PWM/255.0,16,WHITE);
display.drawLine(0,17,127*PWM/255.0,17,WHITE);
///////////    
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/255);
          display.print("%"); 
          flag=1;
      } 
display.print("<<");        
pwmWrite(led, PWM);
delay(300);  
display.display();
}

 

bpl
Offline
Зарегистрирован: 15.02.2016

D.I.M - спасибо как раз есть такой все думал как его прикрутить, правда мелкий очень зато работает хорошо, проверял на другом девайсе, а то у меня сегодня красный модуль 5110 из поднебесной приказав долго жить  отправился на небеса, что-то мне с ними не везет, синий модуль 5110 тоже работает хреново.

Joiner
Offline
Зарегистрирован: 04.09.2014

bpl пишет:

.........а то у меня сегодня красный модуль 5110 из поднебесносной приказав долго жить  отправился на небеса, что-то мне с ними не везет, синий модуль 5110 тоже работает хреново.

У меня три красных модуля 5110. Купил сначала 2, потом еще один. Из первых двух один отказался работать, другой работает. Тот что не работает расковырял и убил окончательно. Третий модуль, что пришел последним, тоже отказался работать. Я маркером на нем написал "BAD", и отложил в сторону, ковырять не стал. Когда баловался с другими моделями дисплеев, подключал их через преобразователь уровней. Попробовал и красные модули 5110 подключить с преобразователем уровней, и ...они заработали! И тот что работал, и тот, который я пометил "BAD". Может им всетаки нужен уровень сигнала 3.3В?

D.I.M
Offline
Зарегистрирован: 14.03.2016

bpl ,Мне тоже с нокиевскими дисплеями не везет: на красном две строки не отображается, а синий вообще не работает.

bpl
Offline
Зарегистрирован: 15.02.2016

D.I.M - Расскажите как подключали дисплей т.е. пин(ардуино) ----- пин(дисплея). И делали какие либо изменения по остальным подключениям пинов, а то я еще начинающее вас по коду плохо ориентируюсь мне лучше бы схему

bpl
Offline
Зарегистрирован: 15.02.2016

Joiner – спасибо за совет по 5110 была тоже такая мысля но еще не проверял, делители т.е. резистор от М328 --- 1К--- к дисплею и т дисплея -----2К-----на минус или как сделано у вас.

D.I.M
Offline
Зарегистрирован: 14.03.2016

bpl, вывод SDA дисплея на пин А4 ардуино, SCL, на А5, вход пробника на А2, остальные подключения те же, что и у автора. Библиотека:  https://drive.google.com/file/d/0B4prOxHsTkgtS3VxeGl5ci0zM3c/view?usp=sharing

Joiner
Offline
Зарегистрирован: 04.09.2014

bpl пишет:

Joiner – спасибо за совет по 5110 была тоже такая мысля но еще не проверял, делители т.е. резистор от М328 --- 1К--- к дисплею и т дисплея -----2К-----на минус или как сделано у вас.

Делители делал по аналогии как в статье для другого дисплея http://arduino-project.net/chasy-na-arduino-tft01-22sp/

Финальный вариант через преобразователи уровней таких http://www.ebay.com/itm/5PCS-IIC-I2C-Logic-Level-Converter-Bi-Directional-Module-5V-to-3-3V-for-Arduino-/281643083290?hash=item41933c661a:g:kw0AAOSwpDdVE9cc

Наверное самый надежный вариант.

bpl
Offline
Зарегистрирован: 15.02.2016

D.I.M-Как подключать дисплей понял спасибо, а вот с библиотекой что-то не то, ссылка предлагает - войдите в свой аккаунт.

Joiner -Спасибо буду пробовать.

D.I.M
Offline
Зарегистрирован: 14.03.2016

bpl пишет:

D.I.M- ...а вот с библиотекой что-то не то, ссылка предлагает - войдите в свой аккаунт.

Понял,ссылку подредактирую.

Сейчас должно работать

 

VetalST
Offline
Зарегистрирован: 29.12.2015

5110 китай красный нужно подключать только от 3,3в и через согласование уровней. А так он не жилец:)

И еще у них беда с контрастностью то темный то еле видно, или бывало что вобще ничего не видно думал что згорел . Лечу так: окуратно снимаю железную окантовку и окурато протираю тряпочкой места контактной резинки на плате, стекле и саму резинку. Собираю под увелечителным стелом следя чтобы не попали пилинки или ворсинки. И главное. Сверху на стекло между железкой и стеклом в месте контактов наклеиваю тонекий размером с контакти кусочек изоленты. Так получается точний контакт без никаких перекосов, стабильная контрастнасть от 45 до 55 взависимости от экземпляра. Так воскресил не один дисплей. 

bpl
Offline
Зарегистрирован: 15.02.2016

D.I.M – библиотеку установил при компиляции  «кода пультоскопа финал 2 под OLED I2C  LCD 128x64 0.96"» Возникают ошибки вроде у меня не та SPI. Пробовал на Arduino: 1.6.8  и Arduino: 1.6.5  Запутался я в библиотеках их там уже по 2 шт. в разных местах, надо все чистить.

D.I.M не могли бы вы выложить все библиотеки которые вы используете именно для этого скетча. заранее благодарен.

bpl
Offline
Зарегистрирован: 15.02.2016

VetalST все симптомы модулей 5110 один в один, лечил также только без изоленты, даже резинки новые пробовал вырезать, если преобразователи уровней не помогут воспользуюсь вашим советом, пациенты еще есть. 

D.I.M
Offline
Зарегистрирован: 14.03.2016

bpl , вот скетч с библиотеками, которые у меня работают IDE 1.6.7: https://drive.google.com/file/d/0B4prOxHsTkgtM1NaSmtwWDVoNDQ/view?usp=sharing

 Попробуйте сначала почистить все библиотеки, а эти установите, иначе будут конфликтовать. Еще может возникать конфликт из - за установленой в IDE платы Arduino Robot  мне пришлось удалить все файлы связанные с этой платой.

D.I.M
Offline
Зарегистрирован: 14.03.2016

bpl, сейчас удалил и переустановил IDE по новой, у меня все компилируется.

bpl
Offline
Зарегистрирован: 15.02.2016

D.I.M  - спасибо, библиотеки установил, - PULTOSCOPE_128x64_OLED_display.ino – скомпилировался, ошибок нет.

Arduino: 1.6.8  -  на сообщение ниже я думаю внимания не обращать .

Скетч использует 19 820 байт (61%) памяти устройства. Всего доступно 32 256 байт.

Глобальные переменные используют 1 785 байт (87%) динамической памяти, оставляя 263 байт для локальных переменных. Максимум: 2 048 байт.

Недостаточно памяти, программа может работать нестабильно.