Мини осциллограф Arduino на LCD 5110

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

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

onegin
Offline
Зарегистрирован: 14.10.2015

Здравствуйте, господа. Имеется плата uno, и сенсорный экран на данный момент (код изначально не мой, я только немного подправил) реализован неплохой 2х канальный осциллограф. Хочу реализовать сенсорное управление режимами, но что то уже несколько дней  ничего не выходит. 




#include "TFTLCD.h"

#define LCD_CS A3
#define LCD_CD A2
#define LCD_WR A1
#define LCD_RD A0
#define LCD_RESET A4

TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);

 //#include <Arial14.h>  // font definitions 

#define txtLINE0   0
#define txtLINE1   16
#define txtLINE2   30
#define txtLINE3   46

const int LCD_WIDTH = 320;
const int LCD_HEIGHT = 240;
const int SAMPLES = 270;
const int DOTS_DIV = 30;


int sensorValue = 0; 
const int ad_sw = A3;                    // Analog 3 pin for switches
const int ad_ch0 = A6;                   // Analog 6 pin for channel 0
const int ad_ch1 = A7;                   // Analog 7 pin for channel 1
const unsigned long VREF[] = {150, 300, 750, 1500, 3000}; // reference voltage 5.0V ->  150 :   1V/div range (100mV/dot)
                                        // It means 5.0 * DOTS_DIV = 150. Use 4.9 if reference voltage is 4.9[V]
                                        //                        -> 300 : 0.5V/div
                                        //                        -> 750 : 0.2V/div
                                        //                        ->1500 : 100mV/div
                                        //                       -> 3000 :  50mV/div
const int MILLIVOL_per_dot[] = {33, 17, 6, 3, 2}; // mV/dot
const int MODE_ON = 0;
const int MODE_INV = 1;
const int MODE_OFF = 2;
const char *Modes[] = {" NORM", " INV", " OFF"};
const int TRIG_AUTO = 0;
const int TRIG_NORM = 1;
const int TRIG_SCAN = 2;
const int TRIG_ONE  = 3;
const char *TRIG_Modes[] = {" Auto", " Norm", " Scan", " One"};
const int TRIG_E_UP = 0;
const int TRIG_E_DN = 1;
#define RATE_MIN 0
#define RATE_MAX 13
const char *Rates[] = {"F1-1", "F1-2 ", "F2  ", "5ms", "10ms", "20ms", "50ms", "0.1s", "0.2s", "0.5s", "1s", "2s", "5s", "10s"};
#define RANGE_MIN 0
#define RANGE_MAX 4
const char *Ranges[] = {"1V ", "0.5V", "0.2V", "0.1V", "50mV"};
unsigned long startMillis;
byte data[4][SAMPLES];                   // keep twice of the number of channels to make it a double buffer
byte sample=0;                           // index for double buffer

///////////////////////////////////////////////////////////////////////////////////////////////
// Define colors here
#define   BGCOLOR  BLACK
#define   GRIDCOLOR WHITE
#define CH1COLOR  BLUE
#define CH2COLOR  GREEN

// Declare variables and set defaults here
// Note: only ch1 is available with Aitendo's parallel 320x240 TFT LCD  
byte range0 = RANGE_MIN, ch0_mode = MODE_ON;  // CH0
short ch0_off = 204;
byte range1 = RANGE_MIN, ch1_mode = MODE_ON;  // CH1
short ch1_off = 204;
byte rate = 3;                                // sampling rate
byte trig_mode = TRIG_AUTO, trig_lv = 30, trig_edge = TRIG_E_UP, trig_ch = 1; // trigger settings
byte Start = 1;  // Start sampling
byte menu = 0;  // Default menu
///////////////////////////////////////////////////////////////////////////////////////////////

void setup(){
  tft.reset();
  tft.initDisplay();
  tft.setRotation(3);

    tft.setTextSize(1);
  tft.fillScreen(BGCOLOR);
   
  Serial.begin(9600);
  DrawGrid();
  DrawText();
}

void CheckSW() {
  static unsigned long Millis = 0, oMillis = 0;
  unsigned long ms;
  unsigned short ain = analogRead(ad_sw); 
 //Serial.println(ain);
  return;
  ms = millis();
  if ((ms - Millis)<5)
  return;
  Millis = ms;
  oMillis = Millis;
   //Serial.println(ain);
  DrawText();
}

void menu0_sw(int sw) {  
  switch (sw) {
   case 0:
    // START/HOLD
    if (Start)
       Start = 0;
     else
       Start = 1;
    break;
   case 1:
    // CH0 RANGE -
    if (range0 < RANGE_MAX)
      range0 ++;
    break;
   case 2:
    // CH1 RANGE -
    if (range1 < RANGE_MAX)
      range1 ++;
    break;
   case 3:
    // RATE FAST
    if (rate > 0)
      rate --;
    break;
   case 4:
    // TRIG MODE
    if (trig_mode < TRIG_ONE)
      trig_mode ++;
    else
      trig_mode = 0;
    break;
   case 5:
    // SEND
    SendData();
    break;
   case 6:
    // TRIG MODE
    if (trig_mode > 0)
      trig_mode --;
    else
      trig_mode = TRIG_ONE;
    break;
   case 7:
    // RATE SLOW
    if (rate < RATE_MAX)
      rate ++;
    break;
   case 8:
    // CH1 RANGE +
    if (range1 > 0)
      range1 --;
    break;
   case 9:
    // CH0 RANGE +
    if (range0 > 0)
      range0 --;
    break;
   case 10:
   default:
    // MENU SW
    menu ++;
     break;
  }
}



void SendData() {
  Serial.print(Rates[rate]);
  Serial.println("/div (30 samples)");
  for (int i=0; i<SAMPLES; i ++) {
      Serial.print(data[sample + 0][i]*MILLIVOL_per_dot[range0]);
      Serial.print(" ");
      Serial.println(data[sample + 1][i]*MILLIVOL_per_dot[range1]);
   } 
}

void DrawGrid() {
    for (int x=0; x<=SAMPLES; x += 2) { // Horizontal Line
      for (int y=0; y<=LCD_HEIGHT; y += DOTS_DIV) {
        tft.drawPixel(x, y, GRIDCOLOR);
        CheckSW();
      }
      if (LCD_HEIGHT == 240)
        tft.drawPixel(x, LCD_HEIGHT-1, GRIDCOLOR);
    }
    for (int x=0; x<=SAMPLES; x += DOTS_DIV ) { // Vertical Line
      for (int y=0; y<=LCD_HEIGHT; y += 2) {
        tft.drawPixel(x, y, GRIDCOLOR);
        CheckSW();
      }
    }
}

void DrawText() {
  tft.setTextColor(YELLOW);
  tft.setTextSize(1);
  tft.setCursor(SAMPLES+3, 5);
  tft.print(Ranges[range1]);
  tft.println("/DIV");
  tft.setCursor(SAMPLES+3, 15);
  tft.print(Rates[rate]);
  tft.println("/DIV");
  tft.setCursor(SAMPLES+3, 25);
  tft.println(TRIG_Modes[trig_mode]);
  tft.setCursor(SAMPLES+3, 35);
  tft.println(trig_edge == TRIG_E_UP ? "UP" : "DN"); 
  tft.setCursor(SAMPLES+3, 45);
  tft.println(Modes[ch1_mode]);
  tft.setCursor(SAMPLES+3, 60);
  tft.setTextColor(RED);
  tft.println(" 5 V");
   tft.setCursor(SAMPLES+3, 90);
  tft.println(" 4 V");
  tft.println("");
   tft.setCursor(SAMPLES+3, 120);
  tft.println(" 3 V");
  tft.println("");
   tft.setCursor(SAMPLES+3, 150);
  tft.println(" 2 V");
  tft.println("");
  tft.setCursor(SAMPLES+3, 180);
  tft.println(" 1 V");
  tft.println("");
  tft.setCursor(SAMPLES+3, 210);
  tft.println(" 0 V");
//  tft.setCursor(SAMPLES, 70);
//  tft.println(trig_ch == 0 ? "T:1" : "T:2"); 

}

void DrawGrid(int x) {
    if ((x % 2) == 0)
      for (int y=0; y<=LCD_HEIGHT; y += DOTS_DIV)
        tft.drawPixel(x, y, GRIDCOLOR);
    if ((x % DOTS_DIV) == 0)
      for (int y=0; y<=LCD_HEIGHT; y += 2)
        tft.drawPixel(x, y, GRIDCOLOR);
}

void ClearAndDrawGraph() {
  int clear = 0;
  
  if (sample == 0)
    clear = 2;
#if 0
   for (int x=0; x<SAMPLES; x++) {
     GLCD.SetDot(x, LCD_HEIGHT-data[clear+0][x], WHITE);
     GLCD.SetDot(x, LCD_HEIGHT-data[clear+1][x], WHITE);
     GLCD.SetDot(x, LCD_HEIGHT-data[sample+0][x], BLACK);
     GLCD.SetDot(x, LCD_HEIGHT-data[sample+1][x], BLACK);
  }
#else
   for (int x=0; x<(SAMPLES-1); x++) {
     tft.drawLine(x, LCD_HEIGHT-data[clear+0][x], x+1, LCD_HEIGHT-data[clear+0][x+1], BGCOLOR);
     tft.drawLine(x, LCD_HEIGHT-data[clear+1][x], x+1, LCD_HEIGHT-data[clear+1][x+1], BGCOLOR);
     if (ch0_mode != MODE_OFF)
       tft.drawLine(x, LCD_HEIGHT-data[sample+0][x], x+1, LCD_HEIGHT-data[sample+0][x+1], CH1COLOR);
     if (ch1_mode != MODE_OFF)
       tft.drawLine(x, LCD_HEIGHT-data[sample+1][x], x+1, LCD_HEIGHT-data[sample+1][x+1], CH2COLOR);
     CheckSW();
  }  
#endif
}

void ClearAndDrawDot(int i) {
  int clear = 0;

  if (i <= 1)
    return;
  if (sample == 0)
    clear = 2;
#if 0
   for (int x=0; x<SAMPLES; x++) {
     GLCD.SetDot(x, LCD_HEIGHT-data[clear+0][x], WHITE);
     GLCD.SetDot(x, LCD_HEIGHT-data[clear+1][x], WHITE);
     GLCD.SetDot(x, LCD_HEIGHT-data[sample+0][x], BLACK);
     GLCD.SetDot(x, LCD_HEIGHT-data[sample+1][x], BLACK);
  }
#else
  tft.drawLine(i-1, LCD_HEIGHT-data[clear+0][i-1], i, LCD_HEIGHT-data[clear+0][i], BGCOLOR);
  tft.drawLine(i-1, LCD_HEIGHT-data[clear+1][i-1], i, LCD_HEIGHT-data[clear+1][i], BGCOLOR);
  if (ch0_mode != MODE_OFF)
    tft.drawLine(i-1, LCD_HEIGHT-data[sample+0][i-1], i, LCD_HEIGHT-data[sample+0][i], CH1COLOR);
  if (ch1_mode != MODE_OFF)
    tft.drawLine(i-1, LCD_HEIGHT-data[sample+1][i-1], i, LCD_HEIGHT-data[sample+1][i], CH2COLOR);
#endif
  DrawGrid(i);
}

void DrawGraph() {
   for (int x=0; x<SAMPLES; x++) {
     tft.drawPixel(x, LCD_HEIGHT-data[sample+0][x], CH1COLOR);
     tft.drawPixel(x, LCD_HEIGHT-data[sample+1][x], CH2COLOR);
  }
}

void ClearGraph() {
  int clear = 0;
  
  if (sample == 0)
    clear = 2;
  for (int x=0; x<SAMPLES; x++) {
     tft.drawPixel(x, LCD_HEIGHT-data[clear+0][x], BGCOLOR);
     tft.drawPixel(x, LCD_HEIGHT-data[clear+1][x], BGCOLOR);
  }
}

inline unsigned long adRead(byte ch, byte mode, int off)
{
  unsigned long a = analogRead(ch);
  a = ((a+off)*VREF[ch == ad_ch0 ? range0 : range1]+512) >> 10;
  a = a>=(LCD_HEIGHT+1) ? LCD_HEIGHT : a;
  if (mode == MODE_INV)
    return LCD_HEIGHT - a;
  return a;
}

void  loop() {
    
 
  if (trig_mode != TRIG_SCAN) {
      unsigned long st = millis();
      byte oad;
      if (trig_ch == 0)
        oad = adRead(ad_ch0, ch0_mode, ch0_off);
      else
        oad = adRead(ad_ch1, ch1_mode, ch1_off);
      for (;;) {
        byte ad;
        if (trig_ch == 0)
          ad = adRead(ad_ch0, ch0_mode, ch0_off);
        else
          ad = adRead(ad_ch1, ch1_mode, ch1_off);

        if (trig_edge == TRIG_E_UP) {
           if (ad >= trig_lv && ad > oad)
            break; 
        } else {
           if (ad <= trig_lv && ad < oad)
            break; 
        }
        oad = ad;
       
      
        CheckSW();
      
        if (trig_mode == TRIG_SCAN)
          break;
        if (trig_mode == TRIG_AUTO && (millis() - st) > 100)
          break; 
      }
  }
  
  // sample and draw depending on the sampling rate
    if (rate <= 5 && Start) {
    // change the index for the double buffer
    if (sample == 0)
      sample = 2;
    else
      sample = 0;

    if (rate == 0) { // full speed, channel 0 only
      unsigned long st = millis();
      for (int i=0; i<SAMPLES; i ++) {
        data[sample+0][i] = adRead(ad_ch0, ch0_mode, ch0_off);
      }
      for (int i=0; i<SAMPLES; i ++)
        data[sample+1][i] = 0;
      // Serial.println(millis()-st);
    } else if (rate == 1) { // full speed, channel 1 only
      unsigned long st = millis();
      for (int i=0; i<SAMPLES; i ++) {
        data[sample+1][i] = adRead(ad_ch1, ch1_mode, ch1_off);
      }
      for (int i=0; i<SAMPLES; i ++)
        data[sample+0][i] = 0;
      // Serial.println(millis()-st);
    } else if (rate == 2) { // full speed, dual channel
      unsigned long st = millis();
      for (int i=0; i<SAMPLES; i ++) {
        data[sample+0][i] = adRead(ad_ch0, ch0_mode, ch0_off);
        data[sample+1][i] = adRead(ad_ch1, ch1_mode, ch1_off);
      }
      // Serial.println(millis()-st);
    } else if (rate >= 3 && rate <= 5) { // .5ms, 1ms or 2ms sampling
      const unsigned long r_[] = {5000/DOTS_DIV, 10000/DOTS_DIV, 20000/DOTS_DIV};
      unsigned long st0 = millis();
      unsigned long st = micros();
      unsigned long r = r_[rate - 3];
      for (int i=0; i<SAMPLES; i ++) {
        while((st - micros())<r) ;
        st += r;
        data[sample+0][i] = adRead(ad_ch0, ch0_mode, ch0_off);
        data[sample+1][i] = adRead(ad_ch1, ch1_mode, ch1_off);
      }
      // Serial.println(millis()-st0);
    }
    ClearAndDrawGraph();
    CheckSW();
    DrawGrid();
    DrawText();
  } else if (Start) { // 5ms - 500ms sampling
  // copy currently showing data to another
    if (sample == 0) {
      for (int i=0; i<SAMPLES; i ++) {
        data[2][i] = data[0][i];
        data[3][i] = data[1][i];
      }
    } else {
      for (int i=0; i<SAMPLES; i ++) {
        data[0][i] = data[2][i];
        data[1][i] = data[3][i];
      }      
    }

    const unsigned long r_[] = {50000/DOTS_DIV, 100000/DOTS_DIV, 200000/DOTS_DIV,
                      500000/DOTS_DIV, 1000000/DOTS_DIV, 2000000/DOTS_DIV, 
                      5000000/DOTS_DIV, 10000000/DOTS_DIV};
    unsigned long st0 = millis();
    unsigned long st = micros();
    for (int i=0; i<SAMPLES; i ++) {
      while((st - micros())<r_[rate-6]) {
        CheckSW();
        if (rate<6)
          break;
      }
      if (rate<6) { // sampling rate has been changed
        tft.fillScreen(BGCOLOR);
        break;
      }
      st += r_[rate-6];
      if (st - micros()>r_[rate-6])
          st = micros(); // sampling rate has been changed to shorter interval
      if (!Start) {
         i --;
         continue;
      }
      data[sample+0][i] = adRead(ad_ch0, ch0_mode, ch0_off);
      data[sample+1][i] = adRead(ad_ch1, ch1_mode, ch1_off);
      ClearAndDrawDot(i);     
    }
    // Serial.println(millis()-st0);
    DrawGrid();
    DrawText();
  } else {
    CheckSW();
  }
  if (trig_mode == TRIG_ONE)
    Start = 0;
    
}
Joiner
Offline
Зарегистрирован: 04.09.2014

onegin пишет:

Здравствуйте, господа. Имеется плата uno, и сенсорный экран на данный момент (код изначально не мой, я только немного подправил) реализован неплохой 2х канальный осциллограф. Хочу реализовать сенсорное управление режимами, но что то уже несколько дней  ничего не выходит. 

А схемка где? Какие характеристики.

Очень хотелось бы по-подробней.

onegin
Offline
Зарегистрирован: 14.10.2015

нарисованной схемы нет. Прото берется 2.4"TFT SHIELD и втавлется в arduino uno. (по пинам идеально подходит, ибо так изначально и планировалась эта приблуда) при этом шилд занимает поти ве свободные входы. отаются только А7 и А6, которые и ипользуются как входы оциллографа(вставить шилд надо так, чтобы А7  И А6 остались свободныи). Верхний предел проверить не было возожности(частично из-за того, что нет кнопок управления. Не могу увеличить скороть развертки).

Jtest
Offline
Зарегистрирован: 02.06.2015

Как и обещал, сделал обзор собираемого осциллографа. Вот ССЫЛКА на него.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

мне кажется такая медленная работа изза библиотеки дисплея

плюс лучше избавится от float, а считать int например, а точку вручную рисовать, это должно быть гораздо быстрее

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

Jtest пишет:

Как и обещал, сделал обзор собираемого осциллографа. Вот ССЫЛКА на него.

Красиво! И доведено до готового изделия.

Респект.

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

Jtest пишет:

Как и обещал, сделал обзор собираемого осциллографа. Вот ССЫЛКА на него.

Класно получилось!РЕСПЕКТ!

Смотриш и хочется в обиходе иметь!

На счет быстродействия-библиотека U8glib.h самая универсальная и самая тормознуьая что я видел из ардуиновских библиотек!(

Можно разогнать проц это даст еще пару килогерц но с этой библиотекой быстрее не сделаешь((

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

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

Есть цветной дисплейчик ILI9361С. Автор библиотеки утверждает, что он афигеть какой быстрый! И разрешение у него 128х128. Вот на нем бы смастерить! Мне кажется, что вообще классно должно получиться.

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

Jtest
Offline
Зарегистрирован: 02.06.2015

Да, приборчик получился интересный. Добавить бы ему скорости, устраивал бы меня полностью.

Библиотека U8glib.h может и медленная, но со "стандартной" экран не запускался. Может кто знает, какая библиотека для дисплеев 3410 побыстрей?

yucan
Offline
Зарегистрирован: 20.04.2015

fly245]</p> <p>[quote=bodriy2014 пишет:

Вот себе для работы собрал.

Пользовался пользовался, смотрю все выкладывают.

Вот и мой Пультоскоп!)

 

Почему то никак не могу откомпилировать скетч. Откликнитесь, кто делал пожалуйста!

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

yucan пишет:

Почему то никак не могу откомпилировать скетч. Откликнитесь, кто делал пожалуйста!

Привет у вас FreqCount.h библиотека установлена?

Если нет, установите.

yucan
Offline
Зарегистрирован: 20.04.2015

Да, спасибо! Скомпилировалось, нужно было просто перезапустить ардиуну. Мозг зациклился )))

yucan
Offline
Зарегистрирован: 20.04.2015

yucan
Offline
Зарегистрирован: 20.04.2015

Подключил к генератору -  верхняя частота получилась около 10 КГц. Так должно быть? Частоту показывает уверенно, а вот показания амплитуды скачут.

Barbosa75
Offline
Зарегистрирован: 10.11.2015

 bodriy2014

скажите, с какой тактовой Вы использовали Pro mini?

А то в описании как то не понятно написано "Pro mini(168MHz)" ))

Barbosa75
Offline
Зарегистрирован: 10.11.2015

yucan пишет:

Да, спасибо! Скомпилировалось, нужно было просто перезапустить ардиуну. Мозг зациклился )))

сажите у Вас тоже контрасность плохая окромя вертикальной линии градации?

Okmor
Okmor аватар
Offline
Зарегистрирован: 16.10.2015

Jtest

Почему вы использовали медленную функцию analogRead вместо прерывания самого АЦП?

Гдето так:


#include <CyberLib.h>

unsigned long currentTime;
unsigned long loopTime;

uint8_t MyBuff[255];
byte N = 0;

 void setup()
{
 UART_Init(256000);
  ADCSRA = (1 << ADEN) | (1 << ADSC) | (1 << ADATE) | (0 << ADIF) | (1 << ADIE) | (0 << ADPS2) | (1 << ADPS1) | (0 << ADPS0);
/*  Биты 2:1 – ADPS2:ADPS0. Тактовая частота АЦП
  ADPS2:ADPS0
  000         СК/2
  001         СК/2
  010         СК/4
  011         СК/8
  100         СК/16
  101         СК/32
  110         СК/64
  111         СК/128
  Записываем в loop{} так: ADCSRA = (ADCSRA >> 3) << 3 | Rb ; где Rb байт с значением ADPS2:ADPS0
  */
  ADMUX = (1 << ADLAR) | (1 << REFS1) | (1 << REFS0);
}

void loop()
{

  currentTime = millis();
  if (currentTime >= (loopTime + 150))  // сравниваем текущий таймер с переменной loopTime + 1 секунда
  {
    //Здесь отрабатываем вывод изображения на экранчик!!!
   loopTime = currentTime;
  }

}

ISR(ADC_vect) // Прерывание по концу преобразования АЦП
{
  MyBuff[N] = ADCH; // Тут записываем результат измерения с АЦП
}
 
 
 
Okmor
Okmor аватар
Offline
Зарегистрирован: 16.10.2015

Вот что у меня получилось:

 

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

Barbosa75 пишет:

 bodriy2014

скажите, с какой тактовой Вы использовали Pro mini?

А то в описании как то не понятно написано "Pro mini(168MHz)" ))

подойдет любой про мини, я использовал самый дешевый на Atmega168.

Но заливал в Уно и все работает.

yucan
Offline
Зарегистрирован: 20.04.2015

Barbosa75 пишет:

yucan пишет:

сажите у Вас тоже контрасность плохая окромя вертикальной линии градации?

Да вроде контрастность нормальная, я сразу немного прибавил.

Dm77
Offline
Зарегистрирован: 18.07.2015

А у меня был сенсорный экран под UNO. Взял скетч "Noriaki Mitsunaga" (как в 203 посте), доработал индикацию параметров, добавил сенсорные кнопки переключения режимов.

Пока играюсь. Думаю как сделать и прикрепить щуп.

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

Dm77 пишет:

А у меня был сенсорный экран под UNO. Взял скетч "Noriaki Mitsunaga" (как в 203 посте), доработал индикацию параметров, добавил сенсорные кнопки переключения режимов.

Пока играюсь. Думаю как сделать и прикрепить щуп.

А у меня не компилится сей скетч 

Dm77
Offline
Зарегистрирован: 18.07.2015

Ну по ошибкам же понятночто нужно определить цвета

// Define colors here
#define BLACK   0x0000
#define BLUE    0x001F
#define RED     0xF800
#define GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF
pooller
Offline
Зарегистрирован: 13.04.2014

А скетч с доработанными кнопками где? Я заливал себе скетч от Noriaki Mitsunaga" (как в 203 посте), но только практчески все аналоговые входы UNO заняты экраном, кроме "А5" а в скетче вовсе указаны входы "А6" и "А7", которых в Arduino UNO совсем нет. Я только один канал на  А5 задействовал а второй 5вольт показывал постоянно.

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

Dm77 пишет:

Ну по ошибкам же понятночто нужно определить цвета

// Define colors here
#define BLACK   0x0000
#define BLUE    0x001F
#define RED     0xF800
#define GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF

Вот я и не понял-чего требует-оказывается числовое значение -спасибо!

Дальше ругается-можно увидеть скетч исправленный?

Dm77
Offline
Зарегистрирован: 18.07.2015

pooller пишет:

А скетч с доработанными кнопками где? Я заливал себе скетч от Noriaki Mitsunaga" (как в 203 посте), но только практчески все аналоговые входы UNO заняты экраном, кроме "А5" а в скетче вовсе указаны входы "А6" и "А7", которых в Arduino UNO совсем нет. Я только один канал на  А5 задействовал а второй 5вольт показывал постоянно.

Сырой пока чтобы выкладывать. Нужно настроить на работу сначала.... сейчас думаю как щуп сделать

pooller
Offline
Зарегистрирован: 13.04.2014

А по входам как быть? Или у вашего экранчика нанлоговые пины свободные?

Dm77
Offline
Зарегистрирован: 18.07.2015

Так мне нужен только один. Для щупа. Вот описание моего экрана:

Uses digital pins 5-13 and analog 0-3. That means you can use digital pins 2, 3 and analog 4 and 5. Pin 12 is available if not using the micro SD

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

Здравствуйте! Собрал такой прибор на дисплее ILI9163C ,все работает,всем спасибо за предоставленные скетчи! Но подскажите ,какая реальная схема имею ввиду как обвязать вход для подключения щупов,кнопки если есть? И расшифруйте пожалуйста параметры которые выводятся на экран? Какой делитель,какое максимальное напряжение можно подать на вход? Что значит параметр V-1,68 ? За ранее всем спасибо,кто откликнется! 

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

cilentlekx пишет:

Здравствуйте! Собрал такой прибор на дисплее ILI9163C ,все работает,всем спасибо за предоставленные скетчи! Но подскажите ,какая реальная схема имею ввиду как обвязать вход для подключения щупов,кнопки если есть? И расшифруйте пожалуйста параметры которые выводятся на экран? Какой делитель,какое максимальное напряжение можно подать на вход? Что значит параметр V-1,68 ? За ранее всем спасибо,кто откликнется! 

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

nikolyalomaev
Offline
Зарегистрирован: 24.11.2015

bodriy2014

Занимательный у вас вышел девайс! Грех подумал не повторить))

cilentlekx
Offline
Зарегистрирован: 14.12.2014
#include <Adafruit_GFX.h>    // Core graphics library
#include <SPI.h>
#include <EEPROM.h>
#include <TFT_ILI9163C.h>

// Color definitions
#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 __CS 10
#define __DC 9

TFT_ILI9163C tft = TFT_ILI9163C(__CS,8, __DC);


 
// Variables you might want to play with
byte useThreshold = 1;                  // 0 = Off, 1 = Rising, 2 = Falling
byte theThreshold = 128;                // 0-255, Multiplied by voltageConst
unsigned int timePeriod = 200;          // 0-65535, us or ms per measurement (max 0.065s or 65.535s)
byte voltageRange = 1;                  // 1 = 0-3.3V, 2 = 0-1.65V, 3 = 0-0.825V
byte ledBacklight = 100;
 
boolean autoHScale = true;             // Automatic horizontal (time) scaling
boolean linesNotDots = true;            // Draw lines between data points
 
// Variables that can probably be left alone
const byte vTextShift = 65;              // Vertical text shift (to vertically align info)
const byte numOfSamples = 170;          // Leave at 100 for 128x64 pixel display
unsigned int HQadcReadings[numOfSamples];
byte adcReadings[numOfSamples];
byte adcOldReadings[numOfSamples];
byte thresLocation = 0;                 // Threshold bar location
float voltageConst = 0.052381;          // Scaling factor for converting 0-63 to V
float avgV = 0.0;    
float maxV = 0.0;
float minV = 0.0;
float ptopV = 0.0;
float theFreq = 0;

byte OlduseThreshold = 1;                  
byte OldtheThreshold = 128;                
unsigned int OldtimePeriod = 200;
float OldavgV = 0.0;    
float OldmaxV = 0.0;
float OldminV = 0.0;
float OldptopV = 0.0;
float OldtheFreq = 0;
 
const byte theAnalogPin = 7;             // Data read pin


// High speed ADC code
// From: <a href="<a href="http://forum.arduino.cc/index.php?PHPSESSID=e21f9a71b887039092c91a516f9b0f36&topic=6549.15" rel="nofollow">http://forum.arduino.cc/index.php?PHPSESSID=e21f9a71b887039092c91a516f9b0f36&topic=6549.15</a>" title="<a href="http://forum.arduino.cc/index.php?PHPSESSID=e21f9a71b887039092c91a516f9b0f36&topic=6549.15" rel="nofollow">http://forum.arduino.cc/index.php?PHPSESSID=e21f9a71b887039092c91a516f9b0f36&topic=6549.15</a>" rel="nofollow"><a href="http://forum.arduino.cc/index.php?PHPSESSID=e21f9a71b887039092c91a516f9b..." rel="nofollow">http://forum.arduino.cc/index.php?PHPSESSID=e21f9a71b887039092c91a516f9b...</a></a>
#define FASTADC 1
// defines for setting and clearing register bits
#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif
 
void collectData(void) {
  unsigned int tempThres = 0;
  unsigned int i = 0;
 
  if (autoHScale == true) {
    // With automatic horizontal (time) scaling enabled,
    // scale quickly if the threshold location is far, then slow down
    if (thresLocation > 5*numOfSamples/8) {
      timePeriod = timePeriod + 10;
    } else if (thresLocation < 3*numOfSamples/8) {
      timePeriod = timePeriod - 10;
    } else if (thresLocation > numOfSamples/2+1) {
      timePeriod = timePeriod + 2;
    } else if (thresLocation < numOfSamples/2-1) {
      timePeriod = timePeriod - 2;
    }
  }
  // Enforce minimum time periods
  if (timePeriod < 35) {
    timePeriod = 35;
  }
   
  // Adjust voltage contstant to fit the voltage range
  if (voltageRange == 1) {
    //voltageConst = 0.0523810; // 0-3.30V
    voltageConst = 0.0699810; // 0-3.30V
  } else if (voltageRange == 2) {
    voltageConst = 0.0261905; // 0-1.65V
  } else if (voltageRange == 3) {
    voltageConst = 0.0130952; //0-0.825V
  }
   
  // If using threshold, wait until it has been reached
  if (voltageRange == 1) tempThres = theThreshold << 2;
  else if (voltageRange == 2) tempThres = theThreshold << 1;
  else if (voltageRange == 3) tempThres = theThreshold;
  if (useThreshold == 1) {
     i = 0; while ((analogRead(theAnalogPin)>tempThres) && (i<32768)) i++;
     i = 0; while ((analogRead(theAnalogPin)<tempThres) && (i<32768)) i++;
  }
  else if (useThreshold == 2) {
     i = 0; while ((analogRead(theAnalogPin)<tempThres) && (i<32768)) i++;
     i = 0; while ((analogRead(theAnalogPin)>tempThres) && (i<32768)) i++;
  }
 
  // Collect ADC readings
  for (i=0; i<numOfSamples; i++) {
    // Takes 35 us with high speed ADC setting
    HQadcReadings[i] = analogRead(theAnalogPin);
    if (timePeriod > 35)
      delayMicroseconds(timePeriod-35);
  }
  for (i=0; i<numOfSamples; i++) {
    // Scale the readings to 0-63 and clip to 63 if they are out of range.
    if (voltageRange == 1) {
      if (HQadcReadings[i]>>4 < 0b111111) adcReadings[i] = HQadcReadings[i]>>4 & 0b111111;
      else adcReadings[i] = 0b111111;
    } else if (voltageRange == 2) {
      if (HQadcReadings[i]>>3 < 0b111111) adcReadings[i] = HQadcReadings[i]>>3 & 0b111111;
      else adcReadings[i] = 0b111111;
    } else if (voltageRange == 3) {
      if (HQadcReadings[i]>>2 < 0b111111) adcReadings[i] = HQadcReadings[i]>>2 & 0b111111;
      else adcReadings[i] = 0b111111;
    }
    // Invert for display
    adcReadings[i] = 63-adcReadings[i];
  }
   
  // Calculate and display frequency of signal using zero crossing
  if (useThreshold != 0) {
     if (useThreshold == 1) {
        thresLocation = 1;
        while ((adcReadings[thresLocation]<(63-(theThreshold>>2))) && (thresLocation<numOfSamples-1)) (thresLocation++);
        thresLocation++;
        while ((adcReadings[thresLocation]>(63-(theThreshold>>2))) && (thresLocation<numOfSamples-1)) (thresLocation++);
     }
     else if (useThreshold == 2) {
        thresLocation = 1;
        while ((adcReadings[thresLocation]>(63-(theThreshold>>2))) && (thresLocation<numOfSamples-1)) (thresLocation++);
        thresLocation++;
        while ((adcReadings[thresLocation]<(63-(theThreshold>>2))) && (thresLocation<numOfSamples-1)) (thresLocation++);
     }
 
     theFreq = (float) 1000/(thresLocation * timePeriod) * 1000;
  }
   
  // Average Voltage
  avgV = 0;
  for (i=0; i<numOfSamples; i++)
     avgV = avgV + adcReadings[i];
  avgV = (63-(avgV / numOfSamples)) * voltageConst;
 
  // Maximum Voltage
  maxV = 63;
  for (i=0; i<numOfSamples; i++)
     if (adcReadings[i]<maxV) maxV = adcReadings[i];
  maxV = (63-maxV) * voltageConst;
 
  // Minimum Voltage
  minV = 0;
  for (i=0; i<numOfSamples; i++)
     if (adcReadings[i]>minV) minV = adcReadings[i];
  minV = (63-minV) * voltageConst;
 
  // Peak-to-Peak Voltage
  ptopV = maxV - minV;
}
 
void drawD(void) {
  char buffer[16];
  if(avgV!=OldavgV){
    tft.setTextColor(BLACK);
    dtostrf(OldavgV, 3, 2, buffer);
    tft.setCursor(15, 5+vTextShift);
    tft.print(buffer);
    tft.setTextColor(RED);
    dtostrf(avgV, 3, 2, buffer);
    tft.setCursor(15, 5+vTextShift);
    tft.print(buffer);
    OldavgV=avgV;
  }
  if(maxV!=OldmaxV){
    tft.setTextColor(BLACK);
    dtostrf(OldmaxV, 3, 2, buffer);
    tft.setCursor(15, 2+11+vTextShift);
    tft.print(buffer);
    tft.setTextColor(RED);
    dtostrf(maxV, 3, 2, buffer);
    tft.setCursor(15, 2+11+vTextShift);
    tft.print(buffer);
    OldmaxV=maxV;
  }
  if(minV!=OldminV){
    tft.setTextColor(BLACK);
    dtostrf(OldminV, 3, 2, buffer);
    tft.setCursor(15, 4+17+vTextShift);
    tft.print(buffer);
    tft.setTextColor(RED);
    dtostrf(minV, 3, 2, buffer);
    tft.setCursor(15, 4+17+vTextShift);
    tft.print(buffer);
    OldminV=minV;
  }
  if(ptopV!=OldptopV){  
    tft.setTextColor(BLACK);
    dtostrf(OldptopV, 3, 2, buffer);
    tft.setCursor(15, 6+23+vTextShift);
    tft.print(buffer);
    tft.setTextColor(RED);
    dtostrf(ptopV, 3, 2, buffer);
    tft.setCursor(15, 6+23+vTextShift);
    tft.print(buffer);
    OldptopV=ptopV;
  }
  if(theFreq!=OldtheFreq){
    tft.setTextColor(BLACK);
    dtostrf(OldtheFreq, 5, 0, buffer);
    tft.setCursor(50, 2+11+vTextShift);
    tft.print(buffer);
    tft.setTextColor(RED);
    dtostrf(theFreq, 5, 0, buffer);
    tft.setCursor(50, 2+11+vTextShift);
    tft.print(buffer);
    OldtheFreq=theFreq;
  }
 
  // Correctly format the text so that there are always 4 characters
if(timePeriod!=OldtimePeriod){
  tft.setTextColor(BLACK);
  if (OldtimePeriod < 400) {
    dtostrf((float) OldtimePeriod/1000 * 25, 3, 2, buffer);
  } else if (OldtimePeriod < 4000) {
    dtostrf((float) OldtimePeriod/1000 * 25, 3, 1, buffer);
  } else if (OldtimePeriod < 40000) {
    dtostrf((float) OldtimePeriod/1000 * 25, 3, 0, buffer);
  } else { // Out of range
    dtostrf((float) 0.00, 3, 2, buffer);
  }
  tft.setCursor(15, 12+41+vTextShift);
  tft.print(buffer);
  
  tft.setTextColor(RED);
  if (timePeriod < 400) {
    dtostrf((float) timePeriod/1000 * 25, 3, 2, buffer);
  } else if (timePeriod < 4000) {
    dtostrf((float) timePeriod/1000 * 25, 3, 1, buffer);
  } else if (timePeriod < 40000) {
    dtostrf((float) timePeriod/1000 * 25, 3, 0, buffer);
  } else { // Out of range
    dtostrf((float) 0.00, 3, 2, buffer);
  }
  tft.setCursor(15, 12+41+vTextShift);
  tft.print(buffer);
  OldtimePeriod=timePeriod;
}

}
void drawT(void) {
  char buffer[16];
  tft.fillRect(0,vTextShift+5,45,150,BLACK);
  tft.setTextColor(RED);
  tft.setTextSize(1);
  tft.setCursor(0, 5+vTextShift);
  tft.print("Av");
  tft.setCursor(0, 2+11+vTextShift);
  tft.print("Mx");
  tft.setCursor(0, 4+17+vTextShift);
  tft.print("Mn");
  tft.setCursor(0, 6+23+vTextShift);
  tft.print("PP");
  tft.setCursor(0, 8+29+vTextShift);
  tft.print("Th");
  tft.setCursor(0, 10+35+vTextShift);
  tft.print("V");
  tft.setCursor(0, 12+41+vTextShift);
  tft.print("Tm");
 // tft.setCursor(4, 14+47+vTextShift);
  tft.setCursor(43, 12+41+vTextShift);
  tft.print("ms/div");
 // tft.setCursor(31, 16+53+vTextShift);
  tft.setCursor(81, 2+11+vTextShift);
  tft.print("Hz");
  //tft.setCursor(0, 18+59+vTextShift);
  tft.setCursor(60, 10+35+vTextShift);
  tft.print("R:");
 
  // Draw dynamic text
  if (autoHScale == true) {
    tft.setCursor(120, 2);
    tft.print("A");
  }
  dtostrf(avgV, 3, 2, buffer);
  tft.setCursor(15, 5+vTextShift);
  tft.print(buffer);

  dtostrf(maxV, 3, 2, buffer);
  tft.setCursor(15, 2+11+vTextShift);
  tft.print(buffer);

  dtostrf(minV, 3, 2, buffer);
  tft.setCursor(15, 4+17+vTextShift);
  tft.print(buffer);

  dtostrf(ptopV, 3, 2, buffer);
  tft.setCursor(15, 6+23+vTextShift);
  tft.print(buffer);

  dtostrf(theFreq, 5, 0, buffer);
  tft.setCursor(50, 2+11+vTextShift);
  tft.print(buffer);

  if (useThreshold == 0) {
    tft.setCursor(15, 8+29+vTextShift);
    tft.print("Off");
  } else if (useThreshold == 1) {
    tft.setCursor(15, 8+29+vTextShift);
    tft.print("Rise");
    dtostrf((float) (theThreshold>>2) * voltageConst, 3, 2, buffer);
  } else if (useThreshold == 2) {
    tft.setCursor(15, 8+29+vTextShift);
    tft.print("Fall");
    dtostrf((float) (theThreshold>>2) * voltageConst, 3, 2, buffer);
  }
  tft.setCursor(11, 10+35+vTextShift);
  tft.print(buffer);
  // Correctly format the text so that there are always 4 characters
  if (timePeriod < 400) {
    dtostrf((float) timePeriod/1000 * 25, 3, 2, buffer);
  } else if (timePeriod < 4000) {
    dtostrf((float) timePeriod/1000 * 25, 3, 1, buffer);
  } else if (timePeriod < 40000) {
    dtostrf((float) timePeriod/1000 * 25, 3, 0, buffer);
  } else { // Out of range
    dtostrf((float) 0.00, 3, 2, buffer);
  }
  tft.setCursor(15, 12+41+vTextShift);
  tft.print(buffer);
  if (voltageRange == 1) {
    tft.setCursor(73, 10+35+vTextShift);
    tft.print("0-3.30");
  } else if (voltageRange == 2) {
    tft.setCursor(73, 10+35+vTextShift);
    tft.print("0-1.65");
  } else if (voltageRange == 3) {
    tft.setCursor(73, 10+35+vTextShift);
    tft.print("0-0.83");
  } 
  OlduseThreshold = useThreshold;                  
  OldtheThreshold = theThreshold;                
  OldtimePeriod = timePeriod;
  OldavgV = avgV;    
  OldmaxV = maxV;
  OldminV = minV;
  OldptopV = ptopV;
  OldtheFreq = theFreq;
}
 
void draw(void) {
  tft.fillScreen(BLACK);
  drawT();
  draw1();
}

void draw1(void) {
  int i,j;
//  tft.drawFastVLine((128-numOfSamples), 0, 63, ST7735_YELLOW);
  if (useThreshold != 0)
     for (i=0; i<numOfSamples; i+=3){
        tft.drawPixel(i,66-(theThreshold>>2),YELLOW);
        tft.drawPixel(i,66,YELLOW);
     }
  j=numOfSamples/4;
  for (i=0; i<66; i+=5) {
     tft.drawPixel(0,i,YELLOW);
     tft.drawPixel(j,i,YELLOW);
     tft.drawPixel(j+j,i,YELLOW);
     tft.drawPixel(j+j+j,i,YELLOW);
     tft.drawPixel(numOfSamples-1,i,YELLOW);
  }
  tft.drawLine(0,adcOldReadings[0],1,adcOldReadings[1], BLACK);
  for (i=1; i<numOfSamples-1; i++){ // Draw using lines
      tft.drawLine(i,adcOldReadings[i],i+1,adcOldReadings[i+1], BLACK);
      tft.drawLine(i-1,adcReadings[i-1],i,adcReadings[i], WHITE);
      adcOldReadings[i-1]=adcReadings[i-1];
  }
  tft.drawLine(numOfSamples-2,adcReadings[numOfSamples-2],i,adcReadings[numOfSamples-1], WHITE);
  adcOldReadings[numOfSamples-2]=adcReadings[numOfSamples-2];
  adcOldReadings[numOfSamples-1]=adcReadings[numOfSamples-1];
}
 
void setup() {
  Serial.begin(9600);
  //tft.reset();
  tft.begin();
  tft.setRotation(3);
  tft.fillScreen(BLACK); 
  // Turn on LED backlight
  //analogWrite(3, ledBacklight);
   
  #if FASTADC
    // set prescale to 16
    sbi(ADCSRA,ADPS2) ;
    cbi(ADCSRA,ADPS1) ;
    cbi(ADCSRA,ADPS0) ;
  #endif
  delay(100);
  draw();
}

int j=8;
 
void loop() {
  
  collectData();
  draw1();
  drawD();
  if (j==100){
    drawT();
    j=0;
  }
  j++;
 
  // If user sends any serial data, show menu
  if (Serial.available() > 0) {
    //handleSerial();
  }
 
  // rebuild the picture after some delay
  delay(100);
}

 

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

это скетч на дисплее ILI9163C 128х128 1.44. Все прекрасно работает,убрал сериал на пк,пока не нужен,зато памяти освободилось достаточно! Не понятно все эти параметры на дисплее что конкретно обозначают,как подключать щупы входные к ардуино? Какое максимальное напряжение можно подавать на вход и можно ли как то поставить делитель 1/10 и как правильно смасштабировать в коде,чтобы корректно по осям отоброжалось? Картинку с дисплеем не смог вставить,не понял как!

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

https://yadi.sk/d/cI4Dp4dHm2mSt

Вот ссылка на фото с дисплеем ILI9163C

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

cilentlekx, спасибо. Посмотрел, хочу тоже попробовать сделать. Посмотрю, что получится.

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

nikolyalomaev пишет:

bodriy2014

Занимательный у вас вышел девайс! Грех подумал не повторить))

Классно, видно по фото что вы туда модуль зарядки для лития поместили.

А вход счупа как то дорабатывали? конденсаторами или делителем?

nikolyalomaev
Offline
Зарегистрирован: 24.11.2015

Мини USB от ардуино нано торчит) пока по нему питается, делитель не ставил, сделал как у вас по схеме 680к и 0,1мк кондер
Есть к вам пара вопросов, почему-то плавает контрастность у дисплея, в скетче приходится править, и причём почти каждое включение, пока не понял в чем дело, и второе на частоте более 1000 герц не получается рассмотреть скважность импульса, как нибудь можно поправить в программе? Буду очень признателен!

Barbosa75
Offline
Зарегистрирован: 10.11.2015

У меня тоже плавала контрасность, кроме одной вертикальной шкалы.

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

Парни ! Все же подскажите мне пожалуйста,как правильно подключить щупы к ардуино? Выше пишите через резистор и кондер,поясните пожалуйста,что куда?За ранее всем спасибо!

nikolyalomaev
Offline
Зарегистрирован: 24.11.2015

Ну тут можно массу вариантов согласования применить, я на аналоговый вход контроллера (у меня А4) последовательно поставил резистор затем конденсатор и на него щуп, номиналы подбираются исходя из нужд и потребностей, у меня резистор 680кОм кондюк на 100 нФ

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

То есть последовательно резистор,затем конденсатор 680к. и 0,1мкф.на провод,который на А4? И что этим добиваемся-сглаживания или защита от наводок?

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

cilentlekx пишет:

Парни ! Все же подскажите мне пожалуйста,как правильно подключить щупы к ардуино? Выше пишите через резистор и кондер,поясните пожалуйста,что куда?За ранее всем спасибо!

Попробую ответить развернуто, ниже разные варианты.

1)Если вы уверенны в измеряемом сигнале в том что он до 5В, можно смело цеплять напрямую к входу ардуино.

2)Если вы не всегда уверенны в напряжении измеряемого сигнала или могут быть наводки, то последовательно входу цепляете резистор от 10КОм до 1МОм(1МОм обычно применяют в промышленных приборах)

В этом случае если в измеряемом сигнале произойдет резкий скачек допустим с 5В до 200В то ваш микроконтроллер не пострадает.

3)Если вы хотите отсечь постоянную составляющую ставьте последовательно конденсатор, Конденсатор пропустит только переменку!

4)Если вы заведомо собираетесь мерять сигнал на больших напряжениях, ставится резистивный делитель допустим 1 к 10 и меряя сигнал 50В на порт микроконтроллера поступит всего 5В.

 

 

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

cilentlekx пишет:

Парни ! Все же подскажите мне пожалуйста,как правильно подключить щупы к ардуино? Выше пишите через резистор и кондер,поясните пожалуйста,что куда?За ранее всем спасибо!

Кстати что-ж вы такой не внимательный, на страничке проэкта четко указанно как подключать.

http://srukami.inf.ua/pultoscop_v1_1.html

Схема на черном фоне.

 

nikolyalomaev
Offline
Зарегистрирован: 24.11.2015

А что сможете посоветовать по поводу просмотра формы сигнала 1-5 кГц, разрабатываю гитарные эффекты и необходимо зафексировать форму искажений на выходе устройства, на вход подаю сигнал в этом диапазоне с генератора

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

nikolyalomaev пишет:
А что сможете посоветовать по поводу просмотра формы сигнала 1-5 кГц, разрабатываю гитарные эффекты и необходимо зафексировать форму искажений на выходе устройства, на вход подаю сигнал в этом диапазоне с генератора

Доберусь до генератора сигналов гляну, счас нет под рукой.

А вы пробовали и кнопками и потенциометром подстраивать?или только потенциометром.

nikolyalomaev
Offline
Зарегистрирован: 24.11.2015

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

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

Доброго времени ! Подключил ваш PULTOSCOP к дисплею ILI9163C очень красиво смотрится! конечно сделал пока без обвязки входов,это поэтому дисплей и показания моргают?

https://yadi.sk/d/cI4Dp4dHm2mSt

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

 

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

Дисплей ILI9163C смотрится симпатичнее чем дисплей от Nokia. И разрешение побольше, да и цвет присутствует. Поэтому автору бодрому2014 рекомендовал (скорее просил) сделать осцилоскоп с таким дисплеем.