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

Juris
Juris аватар
Offline
Зарегистрирован: 28.10.2016

Bosch пишет:

есть проблема,Сразу после запуска он сам переключает режимы,как будто я нажимаю кнопки,плату осмотрел...

 


Может не установили резисторы подтяжки на землю? Если установили, проверте, всё ли там в порядке. Без резисторов будет бардак там.

sirota
Offline
Зарегистрирован: 18.08.2015

Juris пишет:

Bosch пишет:

есть проблема,Сразу после запуска он сам переключает режимы,как будто я нажимаю кнопки,плату осмотрел...

 


Может не установили резисторы подтяжки на землю? Если установили, проверте, всё ли там в порядке. Без резисторов будет бардак там.

С чего ли? Ставя пин на выход мы по дефолту подтягиваем его к земле. и ни чего там не будет страшного

Juris
Juris аватар
Offline
Зарегистрирован: 28.10.2016

Скажите, будут ли на основной страничке пультоскопа полные комплекты материалов вариантов от Slider, Sasha80 ? Спасибо.

Juris
Juris аватар
Offline
Зарегистрирован: 28.10.2016

sirota пишет:

С чего ли? Ставя пин на выход мы по дефолту подтягиваем его к земле. и ни чего там не будет страшного

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

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

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

Bosch
Offline
Зарегистрирован: 25.11.2016

#include "SPI.h"
#include "Adafruit_GFX.h"// Core graphics library
#include "Adafruit_ILI9341.h"
//страничка проекта <a data-cke-saved-href="http://srukami.inf.ua/pultoscop_v2.html" href="http://srukami.inf.ua/pultoscop_v2.html" rel="nofollow">http://srukami.inf.ua/pultoscop_v2.html</a>
//дистплей TFT SPFD5408

//#include <Adafruit_ILI9340.h> // Hardware-specific library
//#if defined(__SAM3X8E__)
//#undef __FlashStringHelper::F(string_literal)
//#define F(string_literal) string_literal
//#endif

// These are the pins used for the UNO
// for Due/Mega/Leonardo use the hardware SPI pins (which are different)
#define TFT_DC 7
#define TFT_CS 10
#define TFT_MOSI 11
#define TFT_CLK 13
#define TFT_RST 8
#define TFT_MISO 12
#define BLACK   0x0000
#define BLUE    0x001F
#define RED     0xF800
#define GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF
#define GREY    0x7BEF
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_MOSI, TFT_CLK, TFT_RST, TFT_MISO);
//пользовательские настройки!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#define levo 5
#define ok 9
#define pravo 6
#define vertikal 2   //размер вертикальной сеткаи(если "0" отключениа)
//пользовательские настройки!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
byte mass[501];//массив АЦП
byte massDEL[501];
byte menu = 1; //переменная верхнего меню
byte razv = 0; //значение развертки
float x = 60; //счетчик оси Х
int Vmax = 0; // максимальное напряжение
float Vakb = 0; //напряженеиЕКБ
unsigned long t = 0; //переменная для ращета развертки
unsigned long pause = 0; //переменная для замены Delay
int t_del = 0; //значение цены деления развертки в микросекундах
int setka = 0;
bool opornoe = 1; //флаг опорного напряжения
bool paus = 0; //флаг режима паузы
bool clen_p = 0; //флаг чистки паузы
bool fullDisp = 0;
bool setka2 = 0;
bool st = 0;
bool flag = 0;
bool izmHz = 0;
void setup() {
  tft.begin();
  Vakb = analogRead(A6) * 5.3 / 1024; //проверка напряжения на АКБ
  if (opornoe == 0) {
    ADMUX = 0b11100101; //выбор внутреннего опорного 1,1В
  }
  if (opornoe == 1) {
    ADMUX = 0b01100101; //Выбор внешнего опорного
  }
  delay(50);
  tft.fillScreen(BLACK);
  delay(500);
  Setka1();
  Opornoe();
}
void Zamer() { //заполнение буфера АЦП
  if (razv >= 6) {
    ADCSRA = 0b11100010; //delitel 4
  }
  if (razv == 5) {
    ADCSRA = 0b11100011; //delitel 8
  }
  if (razv == 4) {
    ADCSRA = 0b11100100; //delitel 16
  }
  if (razv == 3) {
    ADCSRA = 0b11100101; //delitel 32
  }
  if (razv == 2) {
    ADCSRA = 0b11100110; //delitel 64
  }
  if (razv < 2) {
    ADCSRA = 0b11100111; //delitel 128
  }
  if (razv == 0) {
    t = micros();
    for (int i = 0; i < 500; i++) {
      while ((ADCSRA & 0x10) == 0);
      ADCSRA |= 0x10;
      delayMicroseconds(100);
      mass[i] = ADCH;
    }
    t = micros() - t;
    t_del = t * 25 / 501;
  }
  if (razv > 0) {
    t = micros();
    for (int i = 0; i < 500; i++) {
      while ((ADCSRA & 0x10) == 0);
      ADCSRA |= 0x10;
      mass[i] = ADCH;
    }
    t = micros() - t;
    t_del = t * 25 / 501;
  }
  Vmax = 0;
  for (int i = 0; i < 500; i++) {
    if (Vmax < mass[i]) {
      Vmax = mass[i];
    }
  }
  if (fullDisp == 0) {
    for (int i = 0; i < 500; i++) {
      mass[i] = 190 - (mass[i] * 0.7);
    }
  }
  else {
    for (int i = 0; i < 500; i++) {
      mass[i] = 230 - (mass[i] * 0.88);
    }
  }
}

void loop() {
  if (paus == 0) {
    Zamer();
  }
  Graf();
  Menu();
}

void Menu() {
  bool flag = 0;
  if (digitalRead(ok) == HIGH) {
    flag = 0;
    delay (10);
    while (digitalRead(ok) == HIGH) {
      if (digitalRead(pravo) == HIGH) {
        opornoe = !opornoe;
        Opornoe();
        Zamer();
        Graf();
        flag = 1;
      }
      if (digitalRead(levo) == HIGH) {
        fullDisp = !fullDisp;
        Zamer();
        Setka1();
        Opornoe();
        Graf();
        flag = 1;
      }
    }
    if (flag == 0) {
      paus = !paus;
    }
  }
  if (paus == 0) {
    if (digitalRead(pravo) == HIGH) { //доработать скорость
      tft.setRotation(0);
      if (fullDisp == 0) {
        tft.fillRect(45, 60, 190, 260, BLACK);
      }
      else {
        tft.fillRect(9, 10, 230, 310, BLACK);
      }
      razv++;
      if (razv == 11) {
        razv = 10;
      }
    }
    if (digitalRead(levo) == HIGH) { //доработать скорость
      tft.setRotation(0);
      if (fullDisp == 0) {
        tft.fillRect(45, 60, 190, 260, BLACK);
      }
      else {
        tft.fillRect(9, 10, 230, 310, BLACK);
      }
      razv--;
      if (razv == 255) {
        razv = 0;
      }
    }
  }
  else {
    if (digitalRead(levo) == HIGH) {
      int flag = 0;
      delay(50);
      if (fullDisp == 0) {
        while (digitalRead(levo) == HIGH) {
          if (digitalRead(ok) == HIGH) {
            IzmHz();
            tft.setRotation(0);
            tft.fillRect(45, 60, 190, 260, BLACK);
            MenuT();
            st = 1;
            Graf();
            flag = 1;
          }
        }
      }
      if (flag == 0) {
        setka2 = !setka2;
        if (setka2 == 1) {
          Setka2();
        }
        else {
          if (fullDisp == 0) {
            tft.setRotation(0);
            tft.fillRect(45, 60, 190, 260, BLACK);
          }
          else {
            tft.setRotation(0);
            tft.fillRect(9, 10, 230, 310, BLACK);
          }
          st = 1;
          Graf();
        }
        delay(300);
      }
    }
  }
}

void MenuT() { //перерисовка нижнего меню
  tft.setTextColor(RED);
  tft.setTextSize(2);
  tft.setRotation(0);
  tft.fillRect(0, 0, 20, 340, BLACK); //стирание поля меню низ
  tft.setRotation(1);
  tft.setCursor(0, 220);
  if (razv < 7) {
    tft.print(t_del);
  }
  if (razv == 7) {
    tft.print(t_del / 2);
  }
  if (razv == 8) {
    tft.print(t_del / 3);
  }
  if (razv == 9) {
    tft.print(t_del / 4);
  }
  if (razv == 10) {
    tft.print(t_del / 5);
  }
  tft.print("us ");
  tft.print("Vm=");
  if (opornoe == 0) {
    tft.print(Vmax * 1.1 / 255);
  }
  if (opornoe == 1) {
    tft.print(Vmax * 5.3 / 255);
  }
  tft.print(" ");
  tft.print("B");
  tft.print(Vakb);
  tft.print(" ");
  tft.print("Razv");
  tft.print(razv);
  if (setka == 1) {
    tft.print(" ");
    tft.print("S");
  }
}
void Opornoe() {
  if (opornoe == 0) {
    ADMUX = 0b11100101; //выбор внутреннего опорного 1,1В
  }
  if (opornoe == 1) {
    ADMUX = 0b01100101; //Выбор внешнего опорного
  }
  if (fullDisp == 0) {
    tft.setRotation(0);
    tft.fillRect(65, 0, 170, 50, BLACK);//стирание напряжения
    tft.fillRect(45, 60, 190, 260, BLACK);//стиране поля графика
    tft.setRotation(1);
    tft.setTextColor(RED);
    tft.setTextSize(2);
    if (opornoe == 0) {
      tft.setCursor(30, 190); tft.println("0");
      tft.setCursor(0, 146); tft.println("0.22");
      tft.setCursor(0, 112); tft.println("0.44");
      tft.setCursor(0, 78); tft.println("0.66");
      tft.setCursor(0, 44); tft.println("0.88");
      tft.setCursor(0, 10); tft.println("1.1V");
    }
    if (opornoe == 1) {
      tft.setCursor(30, 190); tft.println("0");
      tft.setCursor(0, 146); tft.println("1.00");
      tft.setCursor(0, 112); tft.println("2.00");
      tft.setCursor(0, 78); tft.println("3.00");
      tft.setCursor(0, 44); tft.println("4.00");
      tft.setCursor(0, 10); tft.println("5.0V");
    }
    delay(100);
  }
}

void Graf() {
  if (paus == 0) {
    if (fullDisp == 0) {
      MenuT();
      if (setka2 == 1) {
        Setka2();
      }
      int z = 0;
      if (razv < 7) {
        z = 1;
      }
      if (razv == 7) {
        z = 2;
      }
      if (razv == 8) {
        z = 3;
      }
      if (razv == 9) {
        z = 4;
      }
      if (razv == 10) {
        z = 5;
      }
      x = 60;
      tft.setRotation(1);
      for (int y = 0; y < 260 || x < 320; y++) {
        x = x + z;
        tft.drawLine(x, massDEL[y], x + 1, massDEL[y + 1], BLACK); //стираем график
        tft.drawLine(x, mass[y], x + 1, mass[y + 1], GREEN); //график

      }
      for (int i = 0; i < 500; i++) {
        massDEL[i] = mass[i];
      }
    }
    if (fullDisp == 1) {
      if (setka2 == 1) {
        Setka2();
      }
      x = 10;
      int z = 0;
      if (razv < 7) {
        z = 1;
      }
      if (razv == 7) {
        z = 2;
      }
      if (razv == 8) {
        z = 3;
      }
      if (razv == 9) {
        z = 4;
      }
      if (razv == 10) {
        z = 5;
      }
      tft.setRotation(1);
      for (int y = 0; y < 310; y++) {
        x = x + z;
        tft.drawLine(x, massDEL[y], x + 1, massDEL[y + 1], BLACK); //стираем график
        tft.drawLine(x, mass[y], x + 1, mass[y + 1], GREEN); //график

      }
      for (int i = 0; i < 500; i++) {
        massDEL[i] = mass[i];
      }
    }
  }
  if (paus == 1) { //режим паузы
    if (setka2 == 1) {
      Setka2();
    }
    if (fullDisp == 0) {
      if (digitalRead(pravo) == HIGH || st == 1) { //листаем
        Zamer();
        st = 0;
        tft.setRotation(0);
        tft.fillRect(45, 60, 190, 260, BLACK);//стиране графика
        x = 60;
        int z = 0;
        if (razv < 7) {
          z = 1;
        }
        if (razv == 7) {
          z = 2;
        }
        if (razv == 8) {
          z = 3;
        }
        if (razv == 9) {
          z = 4;
        }
        if (razv == 10) {
          z = 5;
        }
        tft.setRotation(1);
        for (int y = 0; y < 260; y++) {
          x = x + z;
          tft.drawLine(x, mass[y], x + 1, mass[y + 1], GREEN); //график
        }
        for (int i = 0; i < 500; i++) {
          massDEL[i] = mass[i];
        }
        MenuT();
      }
    }
    if (fullDisp == 1) {
      if (digitalRead(pravo) == HIGH || st == 1) { //листаем
        Zamer();
        st = 0;
        tft.setRotation(0);
        tft.fillRect(9, 10, 230, 310, BLACK);//стиране графика
        x = 10;
        int z = 0;
        if (razv < 7) {
          z = 1;
        }
        if (razv == 7) {
          z = 2;
        }
        if (razv == 8) {
          z = 3;
        }
        if (razv == 9) {
          z = 4;
        }
        if (razv == 10) {
          z = 5;
        }
        tft.setRotation(1);
        for (int y = 0; y < 310; y++) {
          x = x + z;
          tft.drawLine(x, mass[y], x + 1, mass[y + 1], GREEN); //график
        }
        for (int i = 0; i < 500; i++) {
          massDEL[i] = mass[i];
        }
      }
    }
  }
}
void Setka1() {
  tft.setRotation(0);
  tft.fillRect(0, 0, 240, 360, BLACK);
  if (fullDisp == 0) {
    //ось напряжения##########################################
    tft.drawFastHLine(44, 60, 185, BLUE); tft.drawFastHLine(44, 59, 185, BLUE); tft.drawFastHLine(44, 58, 185, BLUE);
    tft.drawFastVLine(50, 50, 10, BLUE); tft.drawFastVLine(84, 50, 10, BLUE); tft.drawFastVLine(118, 50, 10, BLUE);
    tft.drawFastVLine(152, 50, 10, BLUE); tft.drawFastVLine(186, 50, 10, BLUE); tft.drawFastVLine(220, 50, 10, BLUE);
    //ось времени#############################################
    tft.drawFastVLine(44, 60, 270, RED); tft.drawFastVLine(43, 60, 270, RED); tft.drawFastVLine(42, 60, 270, RED);
    tft.drawFastHLine(35, 60, 10, RED); tft.drawFastHLine(35, 85, 10, RED); tft.drawFastHLine(35, 110, 10, RED); tft.drawFastHLine(35, 135, 10, RED);
    tft.drawFastHLine(35, 160, 10, RED); tft.drawFastHLine(35, 185, 10, RED); tft.drawFastHLine(35, 210, 10, RED); tft.drawFastHLine(35, 235, 10, RED);
    tft.drawFastHLine(35, 260, 10, RED); tft.drawFastHLine(35, 285, 10, RED); tft.drawFastHLine(35, 310, 10, RED);
    //ось времени#############################################
  }
  if (fullDisp == 1) {
    tft.setRotation(0);
    //ось напряжения##########################################
    tft.drawFastHLine(0, 0, 240, BLUE); tft.drawFastHLine(0, 1, 240, BLUE); tft.drawFastHLine(0, 2, 240, BLUE);
    tft.drawFastVLine(10, 0, 10, BLUE); tft.drawFastVLine(51, 0, 10, BLUE); tft.drawFastVLine(93, 0, 10, BLUE);
    tft.drawFastVLine(134, 0, 10, BLUE); tft.drawFastVLine(176, 0, 10, BLUE); tft.drawFastVLine(217, 0, 10, BLUE);
    //ось времени#############################################
    tft.drawFastVLine(0, 0, 320, RED); tft.drawFastVLine(1, 0, 320, RED); tft.drawFastVLine(2, 0, 320, RED);
    tft.drawFastHLine(0, 10, 10, RED); tft.drawFastHLine(0, 35, 10, RED);
    tft.drawFastHLine(0, 60, 10, RED); tft.drawFastHLine(0, 85, 10, RED); tft.drawFastHLine(0, 110, 10, RED); tft.drawFastHLine(0, 135, 10, RED);
    tft.drawFastHLine(0, 160, 10, RED); tft.drawFastHLine(0, 185, 10, RED); tft.drawFastHLine(0, 210, 10, RED); tft.drawFastHLine(0, 235, 10, RED);
    tft.drawFastHLine(0, 260, 10, RED); tft.drawFastHLine(0, 285, 10, RED); tft.drawFastHLine(0, 310, 10, RED);
    //ось времени#############################################
  }
}
void Setka2 () {
  if (fullDisp == 0) {
    tft.setRotation(0);
    tft.drawFastHLine(44, 310, 185, GREY);
    tft.drawFastHLine(44, 285, 185, GREY);
    tft.drawFastHLine(44, 260, 185, GREY);
    tft.drawFastHLine(44, 235, 185, GREY);
    tft.drawFastHLine(44, 210, 185, GREY);
    tft.drawFastHLine(44, 185, 185, GREY);
    tft.drawFastHLine(44, 160, 185, GREY);
    tft.drawFastHLine(44, 135, 185, GREY);
    tft.drawFastHLine(44, 110, 185, GREY);
    tft.drawFastHLine(44, 85, 185, GREY);
  }
  if (fullDisp == 1) {
    tft.setRotation(0);
    tft.drawFastHLine(10, 310, 220, GREY);
    tft.drawFastHLine(10, 285, 220, GREY);
    tft.drawFastHLine(10, 260, 220, GREY);
    tft.drawFastHLine(10, 235, 220, GREY);
    tft.drawFastHLine(10, 210, 220, GREY);
    tft.drawFastHLine(10, 185, 220, GREY);
    tft.drawFastHLine(10, 160, 220, GREY);
    tft.drawFastHLine(10, 135, 220, GREY);
    tft.drawFastHLine(10, 110, 220, GREY);
    tft.drawFastHLine(10, 85, 220, GREY);
    tft.drawFastHLine(10, 60, 220, GREY);
    tft.drawFastHLine(10, 35, 220, GREY);
  }
}
void IzmHz() {
  delay(200);
  tft.setTextColor(RED);
  tft.setTextSize(2);
  tft.setRotation(0);
  tft.fillRect(0, 0, 20, 340, BLACK); //стирание поля меню низ
  tft.setRotation(1);
  tft.setCursor(0, 220);
  int z = 0;
  if (razv < 7) {
    z = 1;
    tft.print(t_del);
  }
  if (razv == 7) {
    z = 2;
    tft.print(t_del / 2);
  }
  if (razv == 8) {
    z = 3;
    tft.print(t_del / 3);
  }
  if (razv == 9) {
    z = 4;
    tft.print(t_del / 4);
  }
  if (razv == 10) {
    z = 5;
    tft.print(t_del / 5);
  }
  tft.print("us ");
  int x1 = 0;
  int xIzm1 = 60;
  int xIzm2 = 0;
  int xIzm1del = 60;
  int xIzm2del = 0;
  int i = 0;
  int Speed = 0;
  while (i < 2) {
    if (digitalRead(ok) == HIGH) {
      i++;
      if (i == 1) {
        xIzm2 = xIzm1;
      }
      delay(300);
    }
    if (i == 0) {
      if (digitalRead(levo) == HIGH) {
        Speed++;
        xIzm1 -= Speed;
        if (xIzm1 < 60) {
          xIzm1 = 60;
        }
      }
      if (digitalRead(pravo) == HIGH) {
        Speed++;
        xIzm1 += Speed;
        if (xIzm1 > 320) {
          xIzm1 = 320;
        }
      }
    }
    else {
      if (digitalRead(levo) == HIGH) {
        Speed++;
        xIzm2 -= Speed;
        if (xIzm2 < xIzm1) {
          xIzm2 = xIzm1;
        }
      }
      if (digitalRead(pravo) == HIGH) {
        Speed++;
        xIzm2 += Speed;
        if (xIzm2 > 320) {
          xIzm2 = 320;
        }
      }
    }
    if (digitalRead(pravo) == LOW && digitalRead(levo) == LOW) {
      Speed = 0;
    }
    tft.setRotation(1);
    x = 60;
    for (int y = 0; y < 260; y++) {
      x = x + z;
      tft.drawLine(x, massDEL[y], x + 1, massDEL[y + 1], BLACK); //стираем график
      tft.drawLine(x, mass[y], x + 1, mass[y + 1], GREEN); //график
    }
    tft.setRotation(1);
    tft.drawFastVLine(xIzm1del, 10, 185, BLACK);
    tft.drawFastVLine(xIzm1, 10, 185, GREY);
    xIzm1del = xIzm1;
    if (i == 1) {
      tft.drawFastVLine(xIzm2del, 10, 185, BLACK);
      tft.drawFastVLine(xIzm2, 10, 185, GREY);
      xIzm2del = xIzm2;
      tft.fillRect(100, 220, 200, 20, BLACK);
      tft.setCursor(100, 220);
      tft.print(1000000 / ((((xIzm2 - xIzm1)*t) / 501) / z));
      tft.print("Hz");
    }
  }
}

 

Bosch
Offline
Зарегистрирован: 25.11.2016

И этот заливал

//страничка проекта <a href="http://srukami.inf.ua/pultoscop_v2.html" rel="nofollow">http://srukami.inf.ua/pultoscop_v2.html</a>
// форум <a href="http://arduino.ru/forum/proekty/pultoskop-na-arduino-27mgts?page=12#comment-175783" rel="nofollow">http://arduino.ru/forum/proekty/pultoskop-na-arduino-27mgts?page=12#comment-175783</a>
// скетч и библиотеку изменил под LCD_ls020 VetalST
// скетч и библиотеку изменил под LCD 1.8 дюйма 160х128 ST7735 Владимир Иванов ( 240265 )
// LCD_ls020 подключаем: 
// к ардуине на ATmega328
//**********************************************************
#include "Adafruit_GFX.h"    // Core graphics library
#include "Adafruit_ILI9341.h" // Hardware-specific library
#include "SPI.h"
#include "FreqCount.h"
#include "PWM.h"

// For the breakout, you can use any 2 or 3 pins
// These pins will also work for the 1.8" TFT shield
#define TFT_DC 7
#define TFT_CS 10
#define TFT_MOSI 11
#define TFT_CLK 13
#define TFT_RST 8
#define TFT_MISO 12
#define BLACK   0x0000
#define BLUE    0x001F
#define RED     0xF800
#define GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF
#define GREY    0x7BEF
// Option 1 (recommended): must use the hardware SPI pins
// (for UNO thats sclk = 13 and sid = 11) and pin 10 must be
// an output. This is much faster - also required if you want
// to use the microSD card (see the image drawing example)
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_MOSI, TFT_CLK, TFT_RST, TFT_MISO);
// Option 2: use any pins but a little slower!
//#define TFT_SCLK 13   // set these to be whatever pins you like!
//#define TFT_MOSI 11   // set these to be whatever pins you like!
//Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);

#define Out  9   //пин для генератор сигналов и DSS(не менять)
#define dds  9   //пин для генератора dds (не менять)
//#################№№№№№№####пользовательские настройки!
#define levo A4
#define ok A5
#define pravo A6
#define akb A3 //любой своюодный аналоговый пин для измерения напряжения АКБ
#define delit 6 //включен или отключен делитель на х10
#define overclock 16 //Частота на которой работает Ардуино 
byte SinU=30; // =30;   //уровень синхронизации 0 до 255
int PWM = 128;//стартовое значение ШИМ от 0 до 255        
int32_t frequency = 500; //стартовое значение частоты в Гц
float VCC=5.0;  //напряжение питания, меряем мультиметром
byte pultoskop=1; //флаг выбора генератора или осциллографа
//********************************
//###########################################################
byte menuDDS=0; 
byte sinM[32]={1,6,15,29,48,69,92,117,143,168,191,212,229,243,251,255,254,248,237,222,203,181,156,131,106,81,59,39,22,10,3,1};
byte pilaM[32]={1,9,17,25,33,41,49,57,65,73,81,89,97,105,113,121,129,137,145,153,161,169,177,185,193,201,209,217,225,235,245,255};
byte RpilaM[32]={250,246,238,230,222,214,206,198,190,182,174,166,158,150,142,134,126,118,110,102,94,86,78,70,62,54,41,33,25,17,9,1};
byte trianglM[32]={1,18,35,52,69,86,103,120,137,154,171,188,205,222,239,255,239,223,207,191,175,159,143,127,111,95,79,63,47,31,15,1};
byte hag=0;
int mnog=0;
boolean flag=0;
byte mass[701];//массив АЦП
byte menu=1;//переменная верхнего меню
byte razv=5;//значение развертки
byte x=30; //счетчик оси Х
int Vmax=0;// максимальное напряжение 
unsigned long pause=0;//переменная для замены Delay
bool opornoe=1; //флаг опорного напряжения
bool paus=0; //флаг режима паузы
bool clen_p=0;//флаг чистки паузы
long countX=0;
byte sinhMASS=0;
unsigned long count =0;
int prokr=0;
char str[10]; 
int temp;
float armcurrent;
int d=0;

void setup(){
tft.begin();
if(opornoe==0){
    ADMUX = 0b11100100;
  }//выбор внутреннего опорного 1,1В
  if(opornoe==1){
    ADMUX = 0b01100100;
  }//Выбор внешнего опорного
  //tft.initR(INITR_BLACKTAB);   // initialize a ST7735S chip, black tab
 tft.setRotation(5);              //  повернуть по горизонту
  tft.fillScreen( BLACK);
  tft.drawRect(0,0,320,240, WHITE); // рисуем рамку
  tft.drawRect(2,2,316,236, BLUE); // рисуем рамку
  tft.drawRect(4,3,310,230, RED); // рисуем рамку
  
 while(digitalRead(ok)==LOW){  
    if(digitalRead(levo)==HIGH){
      delay (30);
      while((digitalRead(levo)==HIGH));
      pultoskop=pultoskop-1;
      if(pultoskop<1)pultoskop=3;
    }
    if(digitalRead(pravo)==HIGH){
      delay (30);
      while((digitalRead(pravo)==HIGH));
      pultoskop=pultoskop+1;
      if(pultoskop>3)pultoskop=1;
    }
    
    if(pultoskop==1){
      tft.setTextSize(2.5);
      tft.setTextColor( RED);
      tft.setCursor(90, 45);
      tft.println("Oscilloscope");
       tft.setCursor(90, 75);
       tft.setTextColor( WHITE);
       tft.println("Generator PWM");
       tft.setCursor(90, 115);
        tft.println("Generator DDS");
      tft.setTextColor( BLUE);
       tft.setCursor(90, 155);
       tft.println("Battery =");
      armcurrent = analogRead(akb)*VCC/1023;//проверка напряжения на АКБ
      temp = (armcurrent - (int)armcurrent) * 100; // множитель - число знаков после запятой. 10 - 1, 100 - 2, 1000 - 3 и т.д.
      sprintf(str, "%d.%02d V", (int)armcurrent, abs(temp));      
      tft.fillRect(180,155,50,40, BLACK);
       tft.setTextColor( BLUE);
       tft.setCursor(180, 155);
       tft.println(str);

    }
    if(pultoskop==2){
     
       tft.setTextColor( WHITE);
       tft.setCursor(90, 45);
       tft.println("Oscilloscope");
       tft.setCursor(90, 75);
       tft.setTextColor( RED);
       tft.println("Generator PWM");
       tft.setCursor(90, 115);
       tft.setTextColor( WHITE);
       tft.println("Generator DDS");
      tft.setTextColor( BLUE);
       tft.setCursor(90, 155);
       tft.println("Battery =");
      armcurrent = analogRead(akb)*VCC/1023;//проверка напряжения на АКБ
      temp = (armcurrent - (int)armcurrent) * 100; // множитель - число знаков после запятой. 10 - 1, 100 - 2, 1000 - 3 и т.д.
      sprintf(str, "%d.%02d V", (int)armcurrent, abs(temp));
      tft.fillRect(180,155,50,40, BLACK);
      tft.setTextColor( BLUE);
       tft.setCursor(180, 155);
       tft.println(str); 
    } 
     if(pultoskop==3){
         
       tft.setTextColor( WHITE);
       tft.setCursor(90, 45);
       tft.println("Oscilloscope");
       tft.setCursor(90, 75); 
       tft.println("Generator PWM");
       tft.setCursor(90, 115);
       tft.setTextColor( RED);
       tft.println("Generator DDS");
       tft.setTextColor( BLUE);
       tft.setCursor(90, 155);
       tft.println("Battery =");
      armcurrent = analogRead(akb)*VCC/1023;//проверка напряжения на АКБ
      temp = (armcurrent - (int)armcurrent) * 100; // множитель - число знаков после запятой. 10 - 1, 100 - 2, 1000 - 3 и т.д.
      sprintf(str, "%d.%02d V", (int)armcurrent, abs(temp)); 
      tft.fillRect(180,155,50,40, BLACK);
      tft.setCursor(180, 155);
      tft.println(str);      
    } 
 delay(300);  
}  

  if(pultoskop==1){
    FreqCount.begin(1000); 
    tft.fillScreen( BLACK);//очистка дисплея      
  }
  if(pultoskop==2){
    InitTimersSafe(); 
    bool success = SetPinFrequencySafe(Out, frequency);
    tft.fillScreen( BLACK);//очистка дисплея  
  }
  if(pultoskop==3){
   InitTimersSafe(); 
   bool success = SetPinFrequencySafe(Out,200000);
   tft.fillScreen( BLACK);//очистка дисплея   
  }
delay(500);  
}

void Zamer(){
  if (razv>=6){ADCSRA = 0b11100010;}//delitel 4
  if (razv==5){ADCSRA = 0b11100011;}//delitel 8
  if (razv==4){ADCSRA = 0b11100100;}//delitel 16
  if (razv==3){ADCSRA = 0b11100101;}//delitel 32
  if (razv==2){ADCSRA = 0b11100110;}//delitel 64
  if (razv<2){ADCSRA = 0b11100111;}//delitel 128
  if (razv==0){
      for(int i=0;i<700;i++){ 
          while ((ADCSRA & 0x10)==0);
          ADCSRA|=0x10;
          delayMicroseconds(500);
          mass[i]=ADCH;
      }
  }
  if (razv>0){
      for(int i=0;i<700;i++){ 
          while ((ADCSRA & 0x10)==0);
          ADCSRA|=0x10;
          mass[i]=ADCH;
      }
  }
  
}

void MenuT(){//перерисовка нижнего меню    

    tft.fillRect(0, 120, 160, 128,  BLACK);
  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)-0.2;//-0.2 КОРЕКЦИЯ ПОКАЗАНИЙ ЧАСТОТЫ ГЦ
        }//delitel 128
        flagFrec1=0;
        flagFrec3=0;
      }
    }
  }

  //#######################################частоты сигнала

   tft.setTextColor( WHITE);
   tft.setCursor(1, 120);
    tft.println( "F=");
    
  if(opornoe==1){
    if((Vmax*VCC/255)>2.8){
      countX=count*(overclock/16.0);
    }
    if((Vmax*VCC/255)<=2.8){
      countX=Frec*(overclock/16.0);
    }
  }
  if(opornoe==0){
    countX=Frec*(overclock/16.0);
  }
  if(countX<1000){
    sprintf(str, "%d Hz", countX);
    tft.setTextColor( WHITE);
    //tft.setCursor(36, 120);
    tft.println( str);  
  }
  if(countX>=1000){
  float countXK=countX/1000.0;
  temp = (countXK - (int)countXK) * 1000; // множитель - число знаков после запятой. 10 - 1, 100 - 2, 1000 - 3 и т.д
  sprintf(str, "%d.%03d kHz", (int)countXK, abs(temp));
  tft.setTextColor( WHITE);
  tft.setCursor(18, 120);
  tft.println( str);  
  }

tft.setTextColor( WHITE);
   //tft.setCursor(18, 120);
    tft.println( str);  
  if(digitalRead(delit)==HIGH){//включен или отключен делитель
  tft.setTextColor( WHITE);
   tft.setCursor(200, 120);
    tft.println( "U=");  
    
  if(opornoe==0){
    armcurrent = (Vmax*1.1/255)*10;
    temp = (armcurrent - (int)armcurrent) * 100; // множитель - число знаков после запятой. 10 - 1, 100 - 2, 1000 - 3 и т.д.
    sprintf(str, "%d.%02d V", (int)armcurrent, abs(temp));
   tft.setTextColor( WHITE);
   tft.setCursor(118, 120);
    tft.println( str);  
  }
  if(opornoe==1){
    armcurrent = (Vmax*VCC/255)*10;
    temp = (armcurrent - (int)armcurrent) * 100; // множитель - число знаков после запятой. 10 - 1, 100 - 2, 1000 - 3 и т.д.
    sprintf(str, "%d.%02d V", (int)armcurrent, abs(temp)); 
    tft.setTextColor( WHITE);
   tft.setCursor(118, 120);
    tft.println( str);

  } 
  }
  else {//включен или отключен делитель
    tft.setTextColor( WHITE);
   tft.setCursor(100, 120);
    tft.println( "U=");  

  if(opornoe==0){
    armcurrent = Vmax*1.1/255;
    temp = (armcurrent - (int)armcurrent) * 100; // множитель - число знаков после запятой. 10 - 1, 100 - 2, 1000 - 3 и т.д.
    sprintf(str, "%d.%02d V", (int)armcurrent, abs(temp)); 
     tft.setTextColor( WHITE);
   tft.setCursor(118, 120);
    tft.println( str);
  }
  if(opornoe==1){
    armcurrent = Vmax*VCC/255;
    temp = (armcurrent - (int)armcurrent) * 100; // множитель - число знаков после запятой. 10 - 1, 100 - 2, 1000 - 3 и т.д.
    sprintf(str, "%d.%02d V", (int)armcurrent, abs(temp)); 
     tft.setTextColor( WHITE);
   tft.setCursor(118, 120);
    tft.println( str);
   
  } 
 }
}

void loop() { 
  if(pultoskop==1){
    while(1){

      //отрисовка и перебор меню###############################
      if(menu==0){ // опорное
        tft.fillRect(0, 0, 45, 9,  RED);
      if(digitalRead(delit)==HIGH){//включен или отключен делитель
        if(opornoe==0){
    tft.setTextColor( WHITE);
    tft.setCursor(3, 1);
    tft.println( "11.0V");
        }
        if(opornoe==1){
          tft.setTextColor( WHITE);
    tft.setCursor(3, 1);
          tft.println( "50.0V");
        }
      }
      else {//включен или отключен делитель
        if(opornoe==0){
          tft.setTextColor( WHITE);
    tft.setCursor(3, 1);
          tft.println( "1.1V");
        }
        if(opornoe==1){
          tft.setTextColor( WHITE);
    tft.setCursor(3, 1);
          tft.println( "5.0V");
        }
      }
        if(digitalRead(pravo)==HIGH){
         tft.fillRect(0, 12, 30, 120,  BLACK);//стирание напряжения
          opornoe=1;
        }
        if(digitalRead(levo)==HIGH){ 
          tft.fillRect(0, 12, 30, 120,  BLACK);//стирание напряжения
          opornoe=0;
        }
 
      tft.setCursor(55, 1);
    tft.println( "Razv");
       // lcd.drawText(55, 1,"Razv", 1, WHITE, BLACK);
        sprintf(str, "%d", razv); 
    tft.setCursor(91, 1);
    tft.println( str);
       // lcd.drawText(91, 1,str, 1, WHITE, BLACK);
    tft.setCursor(112, 1);
    tft.println( "PauseOFF");
      }
      //////////////////////////////////////////////////////
      if(menu==1){ // развертка
        tft.fillRect(48, 0, 57, 9,  RED);
        //lcd.fillRect(48, 0, 108, 9, PINK);
        if(digitalRead(delit)==HIGH){//включен или отключен делитель
        if(opornoe==0){
    tft.setCursor(3, 1);
    tft.println( "11.0V");  
         // lcd.drawText(3, 1,"11.0V", 1, WHITE, BLACK);
        }
        if(opornoe==1){
    tft.setCursor(3, 1);
    tft.println( "50.0V");     
          //lcd.drawText(3, 1,"50.0V", 1, WHITE, BLACK);
        }
      }
      else {//включен или отключен делитель
        if(opornoe==0){
    tft.setCursor(3, 1);
    tft.println( "1.1V"); 
         // lcd.drawText(3, 1,"1.1V", 1, WHITE, BLACK);
        }
        if(opornoe==1){
    tft.setCursor(3, 1);
    tft.println( "5.0V"); 
          //lcd.drawText(3, 1,"5.0V", 1, WHITE, BLACK);
        }
      }
        if(digitalRead(pravo)==HIGH){//доработать скорость
        delay (30);
        while((digitalRead(pravo)==HIGH));
          razv++;
          if(razv==11){
            razv=10;
          } 
        }
        if(digitalRead(levo)==HIGH){//доработать скорость
        delay (30);
        while((digitalRead(levo)==HIGH));
          razv--;
          if(razv==255){
            razv=0;
          } 
        } 

    tft.setTextColor( WHITE);
    tft.setCursor(55, 1);
    tft.println( "Razv");  
        sprintf(str, "%d", razv);
    tft.setCursor(91, 1);
    tft.println( str);      
    tft.setCursor(112, 1);
    tft.println( "PauseOFF");       
      }
      ////////////////////////////////////////////////////
      if(menu==2){  // синхронизация
        prokr=0;
        paus=0;
        if(digitalRead(delit)==HIGH){//включен или отключен делитель
        if(opornoe==0){
        tft.setCursor(3, 1);
    tft.println( "11.0V");  
        }
        if(opornoe==1){
        tft.setCursor(3, 1);
    tft.println( "50.0V");       
        }
      }
      else {//включен или отключен делитель
        if(opornoe==0){
          tft.setCursor(3, 1);
    tft.println( "1.1V"); 
          //lcd.drawText(3, 1,"1.1V", 1, WHITE, BLACK);
        }
        if(opornoe==1){
    tft.setCursor(3, 1);
    tft.println( "5.0V");         
         // lcd.drawText(3, 1,"5.0V", 1, WHITE, BLACK);
        }
      }
   tft.setCursor(55, 1);
    tft.println( "Razv");     
        //lcd.drawText(55, 1,"Razv", 1, WHITE, BLACK);
        sprintf(str, "%d", razv); 
  tft.setCursor(91, 1);
    tft.println( str);            
       // lcd.drawText(91, 1,str, 1, WHITE, BLACK);
 tft.setCursor(112, 1);
    tft.println( "PauseOFF");        
        //lcd.drawText(112,1,"PauseOFF", 1, WHITE, BLACK);
        if(digitalRead(levo)==HIGH){
          SinU=SinU-20;
          if(SinU<20){
            SinU=20;
          }
        }
        if(digitalRead(pravo)==HIGH){
          SinU=SinU+20;
          if(SinU>230){
            SinU=230;
          }
        }

        tft.fillCircle(155,110-SinU/3, 3,  RED);       
        tft.fillCircle(155,110-SinU/3, 1,  BLACK);
      }      
      /////////////////////////////////////////////////////
      if(menu==3){//пауза
        paus=1;
        if(clen_p==0){
         clen_p=1; 
         tft.fillRect(105, 0, 174, 9,  RED);
        if(digitalRead(delit)==HIGH){//включен или отключен делитель
        if(opornoe==0){

       tft.setTextColor( WHITE);
       tft.setCursor(3, 1);
       tft.println( "11.0V");     
         // lcd.drawText(3, 1,"11.0V", 1, WHITE, BLACK);
        }
        if(opornoe==1){
        tft.setCursor(3, 1);
    tft.println( "50.0V");            
         // lcd.drawText(3, 1,"50.0V", 1, WHITE, BLACK);
        }
      }
      else {//включен или отключен делитель
        if(opornoe==0){
    tft.setCursor(3, 1);
    tft.println( "1.1V");        
         // lcd.drawText(3, 1,"1.1V", 1, WHITE, BLACK);
        }
        if(opornoe==1){
    tft.setCursor(3, 1);
    tft.println( "5.0V");               
         // lcd.drawText(3, 1,"5.0V", 1, WHITE, BLACK);
        }
      }
    tft.setCursor(55, 1);
    tft.println( "Razv");       
        // lcd.drawText(55, 1,"Razv", 1, WHITE, BLACK);
         sprintf(str, "%d", razv); 
    tft.setCursor(91, 1);
    tft.println( str);            
        // lcd.drawText(91, 1,str, 1, WHITE, BLACK);
    tft.setCursor(112, 1);
    tft.println( "PauseON");      
        // lcd.drawText(112, 1,"PauseON", 1, WHITE, BLACK);
         
        }
      }

      if(digitalRead(ok)==HIGH){
        delay (30);
        while((digitalRead(ok)==HIGH));
        menu++;
        tft.fillRect(6, 16, 154, 99,  BLACK);//стиране поле графика
        tft.fillRect(0,116, 160, 12,  BLACK);//стиране НИЖНЕГО МЕНЮ 
        if(menu==4){
          menu=0;
          paus=0;
          clen_p=0;
        }
        tft.fillRect(0, 0, 160, 15,  BLACK);//стиране ВЕРХ МЕНЮ
       // tft.fillRect(0, 12, 30, 111,  BLACK);//стирание напряжения  
      }

      //ось напряжения ##########################################
      tft.drawLine(2, 20, 2, 113,  BLUE);
      tft.drawLine(2, 25, 5, 25,  BLUE); 
      tft.drawLine(2, 42, 5, 42,  BLUE); 
      tft.drawLine(2, 59, 5, 59,  BLUE); 
      tft.drawLine(2, 76, 5, 76,  BLUE); 
      tft.drawLine(2, 93, 5, 93,  BLUE); 
      tft.drawLine(2, 110,5, 110,  BLUE); 

      //ось развертки ##########################################
      tft.drawLine(2, 115,158, 115,  BLUE); 
      //  Черточки ******************     
            for(byte i=6;i<160;i=i+17){
            tft.drawPixel(i,114,  BLUE); 
            tft.drawPixel(i,113,  BLUE);
            tft.drawPixel(i,112,  BLUE); 
           // tft.drawPixel(i,59,  BLUE);
           // tft.drawPixel(i,76,  BLUE); 
           // tft.drawPixel(i,93,  BLUE); 
           // tft.drawPixel(i,110,  BLUE);
 }
      //шкала напряжения ########################################
      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];
        } 
      }
      //максимальное значение сигнала ##########################
      //отрисовка графика *************************
      if(paus==0){
        tft.fillRect(0, 12, 160, 3,  BLACK);//стиране /шкалы прокрутки
        tft.fillRect(6, 12, 154, 99,  BLACK);//стиране поле графика
        tft.fillRect(0,116, 160, 12,  BLACK);//стиране НИЖНЕГО МЕНЮ 
        //////////////////////////////////////////////////сетка

        //////////////////////////////////////////////////////
        tft.fillCircle(10,110-SinU/3, 2,  YELLOW);//рисуем уровень синхронизации 
        tft.fillCircle(10,110-SinU/3, 3,  YELLOW);//рисуем уровень синхронизации 
        x=6;
        for(int y=sinhMASS;y<sinhMASS+145;y++){ 
          //for(int y=0;y<145;y++){
           if(razv<7){
           x++;
          }
          if(razv==7){
            x=x+2;
          }
          if(razv==8){
            x=x+3;
          } 
          if(razv==9){
            x=x+4;
          }
          if(razv==10){
            x=x+5;
          }
          if(x>160){
            x=160;
          } 
          tft.drawLine(x,110-mass[y]/3, x+1,110-mass[y+1]/3,  GREEN);//график
         // tft.drawLine(x+1,109-mass[y]/3+1, x+2,109-mass[y+1]/3+1,  GREEN);//график
        }
        sinhMASS=0;  
        MenuT();  
      }
     /////////////////////////////////////////////////////////////////////////// 
    if(paus==1){//режим паузы
        //////////////////////////////////////////////////////////////////////
        if(digitalRead(pravo)==HIGH){//листаем
          prokr=prokr+5;
          if(prokr>554){prokr=554;}
          tft.fillRect(0, 12, 160, 3,  BLACK);//стиране шкалы прокрутки
          tft.fillRect(6, 12, 154, 99,  BLACK);//стиране поле графика
          tft.fillRect(0,116, 160, 12,  BLACK);//стиране НИЖНЕГО МЕНЮ 
          //////////////////////////////////////////////////////////////
          tft.drawLine(prokr/4,12,prokr/4+25,12,  YELLOW);//шкала прокрутки
          tft.drawLine(prokr/4,13,prokr/4+25,13,  YELLOW);//шкала прокрутки
          tft.drawLine(prokr/4,14,prokr/4+25,14,  YELLOW);//шкала прокрутки
          //tft.drawLine(prokr/4,15,prokr/4+35,15,  YELLOW);//шкала прокрутки
          
          //////////////////////////////////////////////////сетка
          for(byte i=110;i>18;i=i-3){
            tft.drawPixel(6,i,  BLUE);
            tft.drawPixel(23,i,  BLUE); 
            tft.drawPixel(40,i,  BLUE); 
            tft.drawPixel(57,i,  BLUE); 
            tft.drawPixel(74,i,  BLUE); 
            tft.drawPixel(91,i,  BLUE);
            tft.drawPixel(108,i,  BLUE); 
            tft.drawPixel(125,i,  BLUE); 
            tft.drawPixel(142,i,  BLUE);
            tft.drawPixel(159,i,  BLUE);
          }
          for(byte i=6;i<160;i=i+3){
            tft.drawPixel(i,25,  BLUE);
            tft.drawPixel(i,42,  BLUE); 
            tft.drawPixel(i,59,  BLUE);
            tft.drawPixel(i,76,  BLUE); 
            tft.drawPixel(i,93,  BLUE); 
            tft.drawPixel(i,110,  BLUE);
          }
          //////////////////////////////////////////////////////
          x=6;
          for(int y=prokr;y<prokr+146;y++){
            if(razv<7){
             x++;
            }
            if(razv==7){
              x=x+2;
            }
            if(razv==8){
              x=x+3;
            }
            if(razv==9){
              x=x+4;
            }
            if(razv==10){
              x=x+5;
            }
            if(x>160){
              x=160;
            }// что бы не засирало экран

           tft.drawLine(x,110-mass[y]/3, x+1,110-mass[y+1]/3,  GREEN);//график
          // tft.drawLine(x+1,109-mass[y]/3+1, x+2,109-mass[y+1]/3+1,  GREEN);//график
          }
        }
      ////////////////////////////////////////////////////////////////////////////////   
      if(digitalRead(levo)==HIGH){//листаем
          prokr=prokr-5;
          if(prokr<0){prokr=0;}
          //tft.fillRect(0, 12, 160, 15,  BLACK);//стиране поле графика
          tft.fillRect(0, 12, 160, 3, BLACK);//стиране /шкалы прокрутки
          tft.fillRect(6, 12, 154, 99, BLACK);//стиране поле графика
          tft.fillRect(0,116, 160, 12, BLACK);//стиране НИЖНЕГО МЕНЮ 
          //////////////////////////////////////////////////////////////
          tft.drawLine(prokr/4,12,prokr/4+25,12, YELLOW);//шкала прокрутки
          tft.drawLine(prokr/4,13,prokr/4+25,13, YELLOW);//шкала прокрутки
          tft.drawLine(prokr/4,14,prokr/4+25,14, YELLOW);//шкала прокрутки
         // tft.drawLine(prokr/4,15,prokr/4+35,15,  YELLOW);//шкала прокрутки

          //////////////////////////////////////////////////сетка
          for(byte i=110;i>18;i=i-3){
            tft.drawPixel(6,i,  BLUE);
            tft.drawPixel(23,i,  BLUE); 
            tft.drawPixel(40,i,  BLUE); 
            tft.drawPixel(57,i,  BLUE); 
            tft.drawPixel(74,i,  BLUE); 
            tft.drawPixel(91,i,  BLUE);
            tft.drawPixel(108,i,  BLUE); 
            tft.drawPixel(125,i,  BLUE); 
            tft.drawPixel(142,i,  BLUE);
            tft.drawPixel(159,i,  BLUE);
          }
          for(byte i=6;i<160;i=i+3){
            tft.drawPixel(i,25,  BLUE);
            tft.drawPixel(i,42,  BLUE); 
            tft.drawPixel(i,59,  BLUE);
            tft.drawPixel(i,76,  BLUE); 
            tft.drawPixel(i,93,  BLUE); 
            tft.drawPixel(i,110,  BLUE);
          }
          //////////////////////////////////////////////////////
          x=6;
          for(int y=prokr;y<prokr+146;y++){ 
            if(razv<7){
              x++;
            }
            if(razv==7){
              x=x+2;
            }
            if(razv==8){
              x=x+3;
            } 
            if(razv==9){
              x=x+4;
            }
            if(razv==10){
              x=x+5;
            }
            if(x>170){
              x=170;
            } // что бы не засирало экран

           tft.drawLine(x,110-mass[y]/3, x+1,110-mass[y+1]/3,  GREEN);//график
          // tft.drawLine(x+1,110-mass[y]/3+1, x+2,110-mass[y+1]/3+1,  GREEN);//график 
          }
        }        
      }
     // delay(300); // можно удалить или подобрать по скорости обновления экрана
    }
  }
  
  //************************************************************************************************
  //#######################################  режим ренератора от 1 Гц до 2 МГц
  if(pultoskop==2){
    while(1){
      if (flag==0){//флаг выборов режима настройки ШИМ или Частоты
        if(digitalRead(levo)==HIGH){
          frequency=frequency-mnog;
          if(frequency<0){
            frequency=0;
          }

          bool success = SetPinFrequencySafe(Out, frequency);
          delay(3);//защита от дребезга 
          tft.fillRect(6, 60, 160, 80, BLACK);//стирание поля
        }
        if(digitalRead(pravo)==HIGH){
          frequency=frequency+mnog;
          bool success = SetPinFrequencySafe(Out, frequency);
          delay(3);//защита от дребезга 
          tft.fillRect(6, 60, 160, 80, BLACK);//стирание поля закрашиваем
        }  
      }
      if (flag==1){//флаг выборов режима настройки ШИМ или Частоты
        if(digitalRead(levo)==HIGH){
          PWM=PWM-3;
          if(PWM<0){
            PWM=255;
          } 
          delay(3);//защита от дребезга
          tft.fillRect(6, 6, 160, 40, BLACK);//стирание поля
          tft.fillRect(100, 100, 129, 125, BLACK);//стирание в низу число шим
        }
        if(digitalRead(pravo)==HIGH){
          PWM=PWM+3;
          if(PWM>255){
            PWM=0;
          } 
          delay(3);//защита от дребезга
          tft.fillRect(6, 6, 160, 40, BLACK);//стирание поля 
          tft.fillRect(100, 100, 129, 125, BLACK);//стирание в низу число шим
        }  
      }      

      if(digitalRead(ok)==HIGH){//переключение разряда выбора частоты 
        delay (30);
        while((digitalRead(ok)==HIGH));
        hag++;
        if(hag>=6){
          hag=0;
        }
        tft.fillRect(6, 100, 170, 125,BLACK);//стирание поля
      }
      ////////////

      tft.setCursor(10, 19);
  tft.setTextColor( GREEN);
  tft.setTextSize(2);
  tft.println("PWM =");                                
      
      temp = PWM*100/255;
      sprintf(str,"%d", temp); // %
      tft.setCursor(80, 19);
       tft.println( str);
      
      tft.setCursor(106, 19);
      tft.println( "%");
      

      armcurrent = 162*PWM/255.0+8; // вычисляем длинны линии
     // if(armcurrent >=159){
      //  armcurrent == 159;
       // }
      tft.drawLine(6,10,armcurrent,10,  YELLOW);
      tft.drawLine(6,11,armcurrent,11,  YELLOW);
      tft.drawLine(6,12,armcurrent,12,  YELLOW);
      tft.drawLine(6,13,armcurrent,13,  YELLOW);
      tft.drawLine(6,14,armcurrent,14,  YELLOW);

      tft.drawLine(6,37,armcurrent,37,  YELLOW);
      tft.drawLine(6,38,armcurrent,38,  YELLOW);
      tft.drawLine(6,39,armcurrent,39,  YELLOW);
      tft.drawLine(6,40,armcurrent,40,  YELLOW);
      tft.drawLine(6,41,armcurrent,41,  YELLOW);

      ///////////////////////////////////    
      long frequencyX=frequency*(overclock/16.0);
 tft.setTextSize(2);
      //lcd.fillRect(10, 60, 175, 80, BLACK);//стирание поля
      if(frequencyX<1000){
        sprintf(str, "%d Hz", frequencyX);
        tft.setCursor(30, 60);
        tft.setTextColor( WHITE);      
        tft.println(str);                  
        tft.setTextSize(1); 
      }
     
      if(frequencyX>=1000&&frequencyX<1000000){
        tft.setTextSize(2);
        armcurrent=frequencyX/1000.0;
        temp = (armcurrent - (int)armcurrent) * 1000; // множитель - число знаков после запятой. 10 - 1, 100 - 2, 1000 - 3 и т.д.
        sprintf(str, "%d.%003d kHz", (int)armcurrent, abs(temp));
        tft.setCursor(15, 60);
        tft.setTextColor( WHITE);        
        tft.println(str);                
       tft.setTextSize(1);
      }
     
      if(frequencyX>=1000000){
        tft.setTextSize(2);
        armcurrent=frequencyX/1000000.0;
        temp = (armcurrent - (int)armcurrent) * 1000; // множитель - число знаков после запятой. 10 - 1, 100 - 2, 1000 - 3 и т.д.
        sprintf(str, "%d.%003d MHz", (int)armcurrent, abs(temp));
        tft.setCursor(30, 60);
        tft.setTextColor( WHITE);        
        tft.println(str);          
       tft.setTextSize(1);
       
      }  
      if(frequencyX>2000000)frequency=0;
      //lcd.drawText(10, 60, str, 2, WHITE, BLACK);
      ////////////////////////////////////////////////////////////// 
      // lcd.fillRect(0, 100, 175, 131, BLACK);//стирание поля
      tft.setCursor(5, 100);
        tft.setTextColor( BLUE);
        tft.setTextSize(1);
        tft.println(">>");          
    
      if(hag==0){//выбор множителя частоты 
        mnog=1;
        flag=0;
        armcurrent = 1*(overclock/16.0);
        tft.setTextSize(2);
        temp = (armcurrent - (int)armcurrent) * 100; // множитель - число знаков после запятой. 10 - 1, 100 - 2, 1000 - 3 и т.д.
        sprintf(str, "%d.%d Hz", (int)armcurrent, abs(temp));
        tft.setCursor(30, 100);
        tft.setTextColor( YELLOW);        
        tft.println(str);          
        //tft.setTextSize(1);

      }
      if(hag==1){//выбор множителя частоты
        mnog=10;
        armcurrent = 10*(overclock/16.0);
        tft.setTextSize(2);
        temp = (armcurrent - (int)armcurrent) * 100; // множитель - число знаков после запятой. 10 - 1, 100 - 2, 1000 - 3 и т.д.
        sprintf(str, "%d.%d Hz", (int)armcurrent, abs(temp));
        tft.setCursor(30, 100);
        tft.setTextColor( YELLOW);        
        tft.println(str);        
      // tft.setTextSize(1);
      }
      if(hag==2){//выбор множителя частоты
        mnog=100;
        armcurrent = 100*(overclock/16.0);
        tft.setTextSize(2);
        temp = (armcurrent - (int)armcurrent) * 100; // множитель - число знаков после запятой. 10 - 1, 100 - 2, 1000 - 3 и т.д.
        sprintf(str, "%d.%d Hz", (int)armcurrent, abs(temp));
        tft.setCursor(30, 100);
        tft.setTextColor( YELLOW);        
        tft.println(str);        
      //  tft.setTextSize(1);
      }
      if(hag==3){//выбор множителя частоты
        mnog=1000;
        armcurrent = 1*(overclock/16.0);
        tft.setTextSize(2);
        temp = (armcurrent - (int)armcurrent) * 100; // множитель - число знаков после запятой. 10 - 1, 100 - 2, 1000 - 3 и т.д.
        sprintf(str, "%d.%d kHz", (int)armcurrent, abs(temp));
        tft.setCursor(30, 100);
        tft.setTextColor( YELLOW);        
        tft.println(str);        
       // tft.setTextSize(2);
      } 
      if(hag==4){//выбор множителя частоты
        mnog=10000;
        armcurrent = 10*(overclock/16.0);
        tft.setTextSize(2);
        temp = (armcurrent - (int)armcurrent) * 100; // множитель - число знаков после запятой. 10 - 1, 100 - 2, 1000 - 3 и т.д.
        sprintf(str, "%d.%d kHz", (int)armcurrent, abs(temp));
        tft.setCursor(30, 100);
        tft.setTextColor( YELLOW);        
        tft.println(str);        
      //  tft.setTextSize(1);
      } 
      if(hag==5){//выбор  PWM 
        flag=1;
        tft.setTextSize(2);
        tft.setCursor(30, 100);
        tft.setTextColor( YELLOW);
        //tft.setTextSize(1);
        tft.println("PWM =");               
        temp = PWM*100/255;
        sprintf(str,"%d", temp);
        tft.setCursor(100, 100);
        tft.setTextColor( YELLOW);
        //tft.setTextSize(1);
        tft.println(str);                
        tft.setCursor(130, 100);
        tft.setTextColor( YELLOW);
        //tft.setTextSize(1);
        tft.println("%");        
        
      }
        tft.setCursor(145, 100);
        tft.setTextColor( BLUE);
        tft.setTextSize(1);
        tft.println("<<");         
     

      pwmWrite(Out, PWM);
      delay(50);  
    }
  }
 //************************************************************************************************
  //#######################################  режим DDS ренератор
if(pultoskop==3){
  while(1){
int fr=10;
if(menuDDS==0){
    tft.setCursor(35, 30);
    tft.setTextColor( RED);
    tft.setTextSize(1);
    tft.println("Sinus");     
    tft.setCursor(35, 50);
    tft.setTextColor( WHITE);
    tft.println("Treugolnik");
    tft.setCursor(35, 70); 
    tft.println("Pila");
    tft.setCursor(35, 90);
    tft.println("Pila Obr");       
   

    delay(400); 
    while(!(PIND & (1<<PIND2))){
    PWM=sinM[d];
    pwmWrite(dds,PWM);
    //delayMicroseconds(fr);
    d++;
    if(d==32){d=0;}}
     menuDDS++;
    //delay(200);
  }
if(menuDDS==1){
   tft.setCursor(35, 30);
    tft.setTextColor( WHITE);
    tft.setTextSize(1);
    tft.println("Sinus");     
    tft.setCursor(35, 50);    
    tft.setTextColor( RED);
    tft.println("Treugolnik");
    tft.setTextColor( WHITE);
    tft.setCursor(35, 70); 
    tft.println("Pila");
    tft.setCursor(35, 90);
    tft.println("Pila Obr");       

    delay(400);
    while(!(PIND & (1<<PIND2))){
      PWM=trianglM[d];
      pwmWrite(dds,PWM);
      //delayMicroseconds(fr);
      d++;
      if(d==32){d=0;}}
    menuDDS++;
    //delay(400);
  }
if(menuDDS==2){
  tft.setCursor(35, 30);
    tft.setTextColor( WHITE);
    tft.setTextSize(1);
    tft.println("Sinus");     
    tft.setCursor(35, 50);        
    tft.println("Treugolnik");
    tft.setTextColor( RED);
    tft.setCursor(35, 70); 
    tft.println("Pila");
    tft.setCursor(35, 90);
    tft.setTextColor( WHITE);
    tft.println("Pila Obr");       

    delay(400);
    while(!(PIND & (1<<PIND2))){
      PWM=pilaM[d];
      pwmWrite(dds,PWM);
      //delayMicroseconds(fr);
      d++;
      if(d==32){d=0;}}
      menuDDS++;
      //delay(400);
  }
if(menuDDS==3){
    tft.setCursor(35, 30);
    tft.setTextColor( WHITE);
    tft.setTextSize(1);
    tft.println("Sinus");     
    tft.setCursor(35, 50);        
    tft.println("Treugolnik");    
    tft.setCursor(35, 70); 
    tft.println("Pila");
    tft.setCursor(35, 90);
    tft.setTextColor( RED);
    tft.println("Pila Obr");       

    delay(400);  
    while(!(PIND & (1<<PIND2))){
      PWM=RpilaM[d];
      pwmWrite(dds,PWM);
      //delayMicroseconds(fr);
      d++;
      if(d==32){d=0;}}
      menuDDS++;
    //delay(200);
  }
if(menuDDS==4){menuDDS=0;}
}
}
/////////////////////DDS
}

 

Bosch
Offline
Зарегистрирован: 25.11.2016

У меня лишь пины другие и резисторы R4-R8 на 5.1кОм,а R1-R2 на 10

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

Bosch

Все три варианта, требуют подтяжки пина к змле резисторами 10-100 КОм.

Без них пины висят в воздухе и ловят наводки от них и срабатывают.

Bosch
Offline
Зарегистрирован: 25.11.2016

Хорошо,спасибо,сегодня подтяну)

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

Juris пишет:

Скажите, будут ли на основной страничке пультоскопа полные комплекты материалов вариантов от Slider, Sasha80 ? Спасибо.

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

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

comment-2161 и  comment-2168

напомню 

 

схема получилась такая:

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

дисплей (его Vcc) запитал от падения напряжения на его белых светодиодах. параллельно добавил кондер smd 1мкф на всяк случай . это видно на фото с лицевой стороны. там на подсветке еще оказался большого сопротивления резистор 470 ом , просто добавил ему в параллель 100 ом для увеличения яркости подсветки.

все необходимые библиотеки с оболочкой, взял с сайта bodriy2014  : https://drive.google.com/file/d/0BxfSZik0BpsAZHNDbjBUVzY4dlU 

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

//Страница проэкта  http://srukami.inf.ua/pultoscop_v25110.html
//подредактированный под кнопки с общим минусом, без резисторов. 
//изменено подключение дисплея и кнопок. (а то светодиод на 13 пине мешает кнопке с общим минусом)
//
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
#include <FreqCount.h> 
#include <PWM.h>
#include <CyberLib.h>
#define led  9   //пин для генератора сигналов (не менять)
#define dds  10   //пин для генератора dds (не менять)
//#################№№№№№№####пользовательские настройки
#define power 8 //пин который опрашивает кнопку включения
#define OFF A1 //пин который управляет ключем питания
#define  timepowerON 50 //время удержания кнопки выключения
#define levo A0 // 13  //кнопка ЛЕВО(можно любой пин)
#define ok 12    //кнопка ОК(можно любой пин)
#define pravo 11 //кнопка ПРАВО(можно любой пин)
#define akb A5 //любой своюодный аналоговый пин для измерения напряжения АКБ 
#define overclock 16  //Частота на которой работает Ардуино 
// Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 4, 3, 2);//пины к которым у вас подключен дисплей оригинал        
 Adafruit_PCD8544 display = Adafruit_PCD8544(2, 3, 4, 6, 7);//пины к которым у вас подключен дисплей         
byte cont=52;//контрастность дисплея
byte SinU=30;   //уровень синхронизации 0 до 255 
int PWM = 128;//стартовое значение ШИМ от 0 до 255        
int32_t frequency = 500; //стартовое значение частоты в Гц
float VCC=5.0;  //напряжение питания, меряем мультиметром
//###########################################################
int d=0;
byte menuDDS=0; 
byte sinM[32]={1,6,15,29,48,69,92,117,143,168,191,212,229,243,251,255,254,248,237,222,203,181,156,131,106,81,59,39,22,10,3,1};
byte pilaM[32]={1,9,17,25,33,41,49,57,65,73,81,89,97,105,113,121,129,137,145,153,161,169,177,185,193,201,209,217,225,235,245,255};
byte RpilaM[32]={250,246,238,230,222,214,206,198,190,182,174,166,158,150,142,134,126,118,110,102,94,86,78,70,62,54,41,33,25,17,9,1};
byte trianglM[32]={1,18,35,52,69,86,103,120,137,154,171,188,205,222,239,255,239,223,207,191,175,159,143,127,111,95,79,63,47,31,15,1};
int powerON=0;//состояние кнопки питания
byte hag=0;
int mnog=0;
boolean flag=0;
byte mass[701];
byte x=0; 
byte menu=0;//переменная выбора меню 
bool opornoe=1; //флаг опорного напряжения
bool paus=0; //флаг режима паузы
byte pultoskop=0; //флаг выбора генератора или осциллографа
byte razv=6;  
unsigned long count =0;
byte sinX=30; 
byte meaX=83;
int Vmax=0;// максимальное напряжение 
byte sinhMASS=0;
long countX=0;
long speedTTL=9600; //скорость терминала 
int prokr=0;

void setup(){
// активация подтягив. резисторов к +5в  
digitalWrite(levo,HIGH);
digitalWrite(ok,HIGH);
digitalWrite(pravo,HIGH);
digitalWrite(power,HIGH);

// pinMode(A4,INPUT); // за ненадобностью закоментен
digitalWrite(OFF,HIGH);//включем питание 
//Serial.begin(9600);
display.begin();
display.setContrast(cont);  
while(digitalRead(ok)==HIGH){  
/////////////////////////////////////////удержание кнопки отключения
if(digitalRead(power)==LOW){powerON++;delay(10);}  
if(powerON>=timepowerON){digitalWrite(OFF,LOW);}///отключаем питание
/////////////////////////////////////////удержание кнопки отключения 
  if(pultoskop==0){
    display.clearDisplay();
    display.setCursor(10,0);
    display.setTextColor(WHITE, BLACK); // 'inverted' text
    display.println("Пультоскоп");
    display.setCursor(10,10);
    display.setTextColor(BLACK); 
    display.println("Генератор");
    display.setCursor(10,20);
    display.println("DDSгенератор");
    display.setCursor(10,30);
    display.println("Терминал");
    display.setCursor(0,40);
    display.print("Батарея=");
    display.print(analogRead(akb)*5.0/1024);
    display.print("В");    
  }
    if(pultoskop==1){
    display.clearDisplay();
    display.setCursor(10,0);
    display.setTextColor(BLACK); // 'inverted' text
    display.println("Пультоскоп");
    display.setCursor(10,10);
    display.setTextColor(WHITE, BLACK); // 'inverted' text
    display.println("Генератор");
     display.setTextColor(BLACK); // 'inverted' text;
    display.setCursor(10,20);
    display.println("DDSгенератор");
    display.setCursor(10,30);
    display.println("Терминал");
    display.setCursor(0,40);
    display.setTextColor(BLACK); 
    display.print("Батарея=");
    display.print(analogRead(akb)*5.0/1024);
    display.print("В");   
  } 
    if(pultoskop==2){
    display.clearDisplay();
    display.setCursor(10,00);
    display.setTextColor(BLACK); // 'inverted' text
    display.println("Пультоскоп");
    display.setCursor(10,10);
    display.println("Генератор");
    display.setTextColor(WHITE, BLACK); // 'inverted' text;
    display.setCursor(10,20);
    display.println("DDSгенератор");
    display.setTextColor(BLACK);
    display.setCursor(10,30);
    display.println("Терминал");
    display.setCursor(0,40);
    display.setTextColor(BLACK); 
    display.print("Батарея=");
    display.print(analogRead(akb)*5.0/1024);
    display.print("В");   
    }
        if(pultoskop==3){
    display.clearDisplay();
    display.setCursor(10,00);
    display.setTextColor(BLACK); // 'inverted' text
    display.println("Пультоскоп");
    display.setCursor(10,10);
    display.println("Генератор");
    display.setTextColor(BLACK);
    display.setCursor(10,20);
    display.println("DDSгенератор");
    display.setTextColor(WHITE, BLACK);
    display.setCursor(10,30);
    display.println("Терминал");
    display.setCursor(0,40);
    display.setTextColor(BLACK); 
    display.print("Батарея=");
    display.print(analogRead(akb)*5.0/1024);
    display.print("В");   
    }
if(digitalRead(levo)==LOW){delay(300); if (pultoskop>0) pultoskop=pultoskop-1; else pultoskop=3;}
if(digitalRead(pravo)==LOW){delay(300);pultoskop=pultoskop+1;}
if(pultoskop>3){pultoskop=0;}

delay(50);  
display.display(); }
if(pultoskop==2){InitTimersSafe(); bool success = SetPinFrequencySafe(led,200000);}
if(pultoskop==0){FreqCount.begin(1000);}
if(pultoskop==1){InitTimersSafe(); bool success = SetPinFrequencySafe(led, frequency);}
display.setTextColor(BLACK);
delay(500); }   
void Zamer(){
  if (razv>=6){ADCSRA = 0b11100010;}//delitel 4
  if (razv==5){ADCSRA = 0b11100011;}//delitel 8
  if (razv==4){ADCSRA = 0b11100100;}//delitel 16
  if (razv==3){ADCSRA = 0b11100101;}//delitel 32
  if (razv==2){ADCSRA = 0b11100110;}//delitel 64
  if (razv<2){ADCSRA = 0b11100111;}//delitel 128
  if (razv==0){
      for(int i=0;i<700;i++){ 
          while ((ADCSRA & 0x10)==0);
          ADCSRA|=0x10;
          delayMicroseconds(500);
          mass[i]=ADCH;
      }
  }
  if (razv>0){
      for(int i=0;i<700;i++){ 
          while ((ADCSRA & 0x10)==0);
          ADCSRA|=0x10;
          mass[i]=ADCH;
      }
  }
  
}
void loop() {
/////////////////////////////////////////удержание кнопки отключения
if(digitalRead(power)==LOW){powerON++;delay(10);}  
if(powerON>=timepowerON){digitalWrite(OFF,LOW);}///отключаем питание
/////////////////////////////////////////удержание кнопки отключения    
if(pultoskop==0){  
if(opornoe==0){ADMUX = 0b11100011;}//выбор внутреннего опорного 1,1В
if(opornoe==1){ADMUX = 0b01100011;}//Выбор внешнего опорного
delay(5);
if(paus==0){Zamer();}
//#######################################определение точки синхронизации
bool flagSINHRO=0;
bool flagSINHRnull=0;
for(int y=1;y<255;y++){
  if(flagSINHRO==0){if(mass[y]<SinU){flagSINHRnull=1;}}
  if(flagSINHRO==0){if(flagSINHRnull==1){if(mass[y]>SinU){flagSINHRO=1;sinhMASS=y;}}}}
//#######################################определение точки синхронизации
//максимальное значение сигнала##########################
Vmax=0; 
for(int y=1;y<255;y++){if(Vmax<mass[y]){Vmax=mass[y];} }
//максимальное значение сигнала##########################
//#######################################определение точки синхронизации
//#######################################отрисовка графика 
if(paus==0){
display.clearDisplay();
display.fillCircle(80,47-SinU/7, 2, BLACK);//рисуем уровень синхронизации    
x=3;
for(int y=sinhMASS;y<sinhMASS+80;y++){
      if(razv<7){x++;}
      if(razv==7){x=x+2;}
      if(razv==8){x=x+3;} 
      display.drawLine(x, 47-mass[y]/7, x+1, 47-mass[y+1]/7, BLACK);
      display.drawLine(x+1, 47-mass[y]/7+1, x+2, 47-mass[y+1]/7+1, BLACK);        
}
sinhMASS=0;}
if(paus==1){
display.clearDisplay();
display.drawLine(prokr/8,8,prokr/8+6,8, BLACK);//шкала прокрутки
display.drawLine(prokr/8,9,prokr/8+6,9, BLACK);//шкала прокрутки
          x=3;
          for(int y=prokr;y<prokr+80;y++){
                if(razv<7){x++;}
                if(razv==7){x=x+2;}
                if(razv==8){x=x+3;} 
                display.drawLine(x, 47-mass[y]/7, x+1, 47-mass[y+1]/7, BLACK);
                display.drawLine(x+1, 47-mass[y]/7+1, x+2, 47-mass[y+1]/7+1, BLACK); 
          }}
//#######################################отрисовка графика
for(byte i=47;i>5;i=i-7){display.drawPixel(0,i, BLACK);display.drawPixel(1,i, BLACK);display.drawPixel(2,i, BLACK);}//разметка экрана  вертикальная
//////////////////////////////////////////////////сетка
for(byte i=47;i>5;i=i-3){display.drawPixel(21,i, BLACK);display.drawPixel(42,i, BLACK);display.drawPixel(63,i, BLACK);}
for(byte i=3;i<84;i=i+3){display.drawPixel(i,33, BLACK);display.drawPixel(i,19, BLACK);}
//////////////////////////////////////////////////сетка
//#######################################отрисовка menu
if(menu==0){
    display.setCursor(0,0);
    display.setTextColor(WHITE,BLACK);
    if(opornoe==0){display.print("1.1");}
    if(opornoe==1){display.print(VCC,1);}
    display.setTextColor(BLACK); 
    display.print(" ");
    display.print(razv);
    display.print(" P");
    if(digitalRead(levo)==LOW){opornoe=!opornoe;}
    if(digitalRead(pravo)==LOW){opornoe=!opornoe;}    
}
if(menu==1){
    display.setCursor(0,0);
    display.setTextColor( BLACK);
    if(opornoe==0){display.print("1.1");}
    if(opornoe==1){display.print(VCC,1);}
    display.setTextColor(WHITE, BLACK); // 'inverted' text 
    display.print(" ");
    display.print(razv);
    display.setTextColor( BLACK); // 'inverted' text
    display.print(" P");
    if(digitalRead(levo)==LOW){razv=razv-1;if(razv==255){razv=0;}}
    if(digitalRead(pravo)==LOW){razv=razv+1;if(razv==9){razv=8;}}
}
if(menu==2){
    display.setCursor(0,0);
    display.setTextColor( BLACK);
    if(opornoe==0){display.print("1.1");}
    if(opornoe==1){display.print(VCC,1);}
    display.print(" ");
    display.print(razv);
    display.setTextColor(WHITE, BLACK); // 'inverted' text 
    display.print(" P");
    paus=1;
    if(digitalRead(levo)==LOW){prokr=prokr-10;if(prokr<0){prokr=0;}}
    if(digitalRead(pravo)==LOW){prokr=prokr+10;if(prokr>620){prokr=620;}}    
}
if(menu==3){
    prokr=0;
    paus=0;
    display.setCursor(0,0);
    display.setTextColor( BLACK);
    if(opornoe==0){display.print("1.1");}
    if(opornoe==1){display.print(VCC,1);}
    display.print(" ");
    display.print(razv);
    display.setTextColor(BLACK);
    display.print(" P");
    if(digitalRead(levo)==LOW){SinU=SinU-20;if(SinU<20){SinU=20;}}
    if(digitalRead(pravo)==LOW){SinU=SinU+20;if(SinU>230){SinU=230;}}   
    display.fillCircle(80,47-SinU/7, 5, BLACK);
    display.fillCircle(80,47-SinU/7, 2, WHITE); 
}
if(digitalRead(ok)==LOW){menu++;if(menu==4){menu=0;paus=0;}}//перебор меню
if (FreqCount.available()) { count = FreqCount.read();}//вывод частоты по готовности счетчика
//#######################################частоты сигнала
byte Frec1=0;
long Frec=0;
bool flagFrec1=0;
bool flagFrec2=0;
bool flagFrec3=0;
for(int y=1;y<255;y++){
  if(flagFrec1==0){if(mass[y]<SinU){flagFrec2=1;}}
  if(flagFrec1==0){if(flagFrec2==1){if(mass[y]>SinU){flagFrec1=1;Frec1=y;}}}
  if(flagFrec1==1){if(mass[y]<SinU){flagFrec3=1;}}
  if(flagFrec3==1){if(mass[y]>SinU){
  if (razv>=6){Frec=1000000/((y-Frec1-1)*3.27);}//delitel 4
  if (razv==5){Frec=1000000/((y-Frec1)*3.27)/2;}//delitel 8
  if (razv==4){Frec=1000000/((y-Frec1)*3.27)/4;}//delitel 16
  if (razv==3){Frec=1000000/((y-Frec1)*3.27)/8;}//delitel 32
  if (razv==2){Frec=1000000/((y-Frec1)*3.27)/16;}//delitel 64
  if (razv==2){Frec=1000000/((y-Frec1)*3.27)/32;}//delitel 128
  if (razv==1){Frec=1000000/((y-Frec1)*3.27)/32;}//delitel 128
  if (razv==0){Frec=1000000/((y-Frec1)*500);}//delitel 128
  flagFrec1=0;flagFrec3=0;}}}
//#######################################частоты сигнала
display.setTextColor( BLACK);
if(opornoe==1){
if((Vmax*VCC/255)>2.5){countX=count*(overclock/16.0);}
if((Vmax*VCC/255)<2.5){countX=Frec*(overclock/16.0);}}
if(opornoe==0){countX=Frec*(overclock/16.0);}
if(countX<1000){display.print(" ");display.print(countX);display.print("Hz");}
if(countX>1000){float countXK=countX/1000.0;display.print(countXK,1);display.print("KHz");}
if(opornoe==1){display.setCursor(0,40);display.setTextColor(BLACK);
display.print(Vmax*VCC/255,1);}
if(opornoe==0){display.setCursor(0,40);display.setTextColor(BLACK);
display.print(Vmax*1.1/255,1);}
display.print("V");
//#######################################отрисовка menu
delay(200);  
display.display();
}
if(pultoskop==1){Generator();}
if(pultoskop==2){DDSGenerator();}
if(pultoskop==3){TTL();}
}
//#######################################режим ренератора
void Generator(){
display.clearDisplay();  
if (flag==0){//флаг выборов режима настройки ШИМ или Частоты
            if(digitalRead(levo)==LOW){
              frequency=frequency-mnog;
              if(frequency<0){frequency=0;}
              bool success = SetPinFrequencySafe(led, frequency);
              delay(3);//защита от дребезга 
            }
            if(digitalRead(pravo)==LOW){
              frequency=frequency+mnog;
              bool success = SetPinFrequencySafe(led, frequency);
              delay(3);//защита от дребезга 
            }  
}
if (flag==1){//флаг выборов режима настройки ШИМ или Частоты
            if(digitalRead(levo)==LOW){
              PWM=PWM-1;
              if(PWM<0){PWM=255;} 
              delay(3);//защита от дребезга
            
            }
            if(digitalRead(pravo)==LOW){
              PWM=PWM+1;
              if(PWM>255){PWM=0;} 
              delay(3);//защита от дребезга 
            }  
}      
if(digitalRead(ok)==LOW){//переключение разряда выбора частоты 
  delay(3);//защита от дребезга
  hag++;
  if(hag>=5){hag=0;}
} 
////////////
display.setTextSize(1);
display.setCursor(0,5);
display.print("PWM=");
display.print(PWM*100.0/255);
display.print(" %");
display.drawLine(0,0,83*PWM/255.0,0, BLACK);
display.drawLine(0,1,83*PWM/255.0,1, BLACK);
display.drawLine(0,2,83*PWM/255.0,2, BLACK);
display.drawLine(0,15,83*PWM/255.0,15, BLACK);
display.drawLine(0,16,83*PWM/255.0,16, BLACK);
display.drawLine(0,17,83*PWM/255.0,17, BLACK);
///////////    
display.setCursor(5,20);
 display.setTextSize(2);
long frequencyX=frequency*(overclock/16.0);
if(frequencyX<1000){display.print(frequencyX);display.setTextSize(1);display.println("Hz");}
if(frequencyX>1000){if(frequencyX<10000){display.print((frequencyX/1000.0),2);display.setTextSize(1);display.println("KHz");}}
if(frequencyX>=10000){if(frequencyX<100000){display.print((frequencyX/1000.0),1);display.setTextSize(1);display.println("KHz");}}
if(frequencyX>=100000){display.print((frequencyX/1000.0),0);display.setTextSize(1);display.println("KHz");}
display.setCursor(0,40);
display.setTextSize(1);
display.print(">>X ");    
      if(hag==0){//выбор множителя частоты
        
          display.print(1*(overclock/16.0),1); 
          mnog=1;
          flag=0;
      }
      if(hag==1){//выбор множителя частоты
          display.print(10*(overclock/16.0),0); 
          mnog=10;
      }
      if(hag==2){//выбор множителя частоты
          display.print(100*(overclock/16.0),0); 
          mnog=100;
      }
      if(hag==3){//выбор множителя частоты
          display.print(1000*(overclock/16.0),0); 
          mnog=1000;
      } 
      if(hag==4){//выбор  PWM
          display.print("PWM ");
          display.print(PWM*100.0/255);
          display.print("%"); 
          flag=1;
      } 
display.print("<<");        
pwmWrite(led, PWM);
delay(300);  
display.display();
}
/////////////////////DDS d11
void DDSGenerator(){
int fr=10;
if(menuDDS==0){
    display.clearDisplay(); 
    display.setTextColor(WHITE, BLACK); // 'inverted' text
    display.setCursor(10,0);
    display.println("Синус");
    display.setTextColor(BLACK);
    display.setCursor(10,10); 
    display.println("Треугольник");
    display.setCursor(10,20);
    display.println("Пила");
    display.setCursor(10,30);
    display.println("Пила Обр");
    display.setTextColor(BLACK);
    display.setCursor(0,40);
    //display.print("Частота=");
    //display.print(57);
    //display.print("Гц"); 
    delay(100);  
    display.display();
    while(D11_Read==HIGH){
      PWM=sinM[d];
      pwmWrite(dds,PWM);
      //delayMicroseconds(fr);
      d++;
      if(d==32){d=0;}}
    menuDDS++;
    delay(200);}
if(menuDDS==1){
    display.clearDisplay(); 
    display.setTextColor(BLACK); // 'inverted' text
    display.setCursor(10,0);
    display.println("Синус");
    display.setTextColor(WHITE, BLACK);
    display.setCursor(10,10); 
    display.println("Треугольник");
    display.setTextColor(BLACK);
    display.setCursor(10,20);
    display.println("Пила");
    display.setCursor(10,30);
    display.println("Пила Обр");
    display.setTextColor(BLACK);
    //display.setCursor(0,40);
    //display.print("Частота=");
   // display.print(57);
    //display.print("Гц");
    delay(100);  
    display.display();
    while(D11_Read==HIGH){
      PWM=trianglM[d];
      pwmWrite(dds,PWM);
      //delayMicroseconds(fr);
      d++;
      if(d==32){d=0;}}
    menuDDS++;
    delay(200);}
if(menuDDS==2){
    display.clearDisplay(); 
    display.setTextColor(BLACK); // 'inverted' text
    display.setCursor(10,0);
    display.println("Синус");
    display.setTextColor(BLACK);
    display.setCursor(10,10); 
    display.println("Треугольник");
    display.setTextColor(WHITE, BLACK);
    display.setCursor(10,20);
    display.println("Пила");
    display.setTextColor(BLACK);
    display.setCursor(10,30);
    display.println("Пила Обр");
    display.setTextColor(BLACK);
    //display.setCursor(0,40);
    //display.print("Частота=");
   // display.print(57);
    //display.print("Гц");
    delay(100);  
    display.display();
    while(D11_Read==HIGH){
      PWM=pilaM[d];
      pwmWrite(dds,PWM);
     // delayMicroseconds(fr);
      d++;
      if(d==32){d=0;}}
      menuDDS++;
    delay(200);}
if(menuDDS==3){
    display.clearDisplay(); 
    display.setTextColor(BLACK); // 'inverted' text
    display.setCursor(10,0);
    display.println("Синус");
    display.setTextColor(BLACK);
    display.setCursor(10,10); 
    display.println("Треугольник");
    display.setTextColor(BLACK);
    display.setCursor(10,20);
    display.println("Пила");
    display.setTextColor(WHITE, BLACK);
    display.setCursor(10,30);
    display.println("Пила Обр");
    display.setTextColor(BLACK);
    //display.setCursor(0,40);
    //display.print("Частота=");
   // display.print(57);
   // display.print("Гц");
    delay(100);  
    display.display();
    while(D11_Read==HIGH){
      PWM=RpilaM[d];
      pwmWrite(dds,PWM);
      //delayMicroseconds(fr);
      d++;
      if(d==32){d=0;}}
      menuDDS++;
    delay(200);}
if(menuDDS==4){menuDDS=0;}

}
/////////////////////DDS
/////////////////////TTL
void TTL(){
display.clearDisplay(); 
display.setTextColor(BLACK); 
display.setCursor(10,0);
display.println("Терминал");
display.setCursor(10,10);
display.println("Скорость");
display.setCursor(10,20);
display.print("-");
display.print(speedTTL);
display.println("+");
display.setCursor(0,30);
display.println("Нажми ОК-старт");
if(digitalRead(pravo)==LOW){speedTTL=speedTTL+100;}
if(digitalRead(levo)==LOW){speedTTL=speedTTL-100;}
if(speedTTL<0){speedTTL=250000;}
if(speedTTL>250000){speedTTL=0;}
if(digitalRead(ok)==LOW){Serial.begin(speedTTL*(16/overclock));
      display.clearDisplay(); 
      delay(100);  
      display.display();
      int x=0;
      int y=0; 
      while(1){ 
            char incomingBytes;  
            if (Serial.available() > 0) { // Если в буфере есть данные
                incomingBytes=Serial.read(); // Считывание байта в переменную incomeByte
                display.setCursor(x,y);
                display.print(incomingBytes); // Печать строки в буффер дисплея
                display.display(); x=x+6;
                if(x==84){x=0;y=y+8;}
                if(y==48){x=0;y=0;
                  display.clearDisplay(); 
                  delay(100);  
                  display.display();}}         
      }} 
delay(100);  
display.display();  
}
/////////////////////TTL

// конечно про переключение - и ~ путем добавления последовательно кондера - это не профи для АЧХ, но на точность измерения не претендую. Параллельно Vcc и GND на ардуине , прицепил стабилитрон 5,1в так на всяк случай ( при выходе внешнего стаба , чтоб atmega328 жива осталась) . На вход пина A3 (осцила) не рекомендую тупо ставить стабилитрон 5.1в - он имеет утечку и  емкость несколько nF ) , уж лучше smd 1n4148 диоды на GND и Vcc , чтоб переполюсовку и излишек на входе пина A3 скидывали на питание.

если подержать родную кнопку включения на этом повербанке, или быстро жамкнуть ее 3 раза , то повербанк выдает на USB 5в, от него и запитал повышайку на 7,5-5в для ровных и точных 5.0в от параметрического стаба на плате арруино, чтобы не зависеть от просадки доп нагрузки на USB.  Выключается 2-3 сек. нажатием на кнопку. 
Для некоторых типов повербанков, надо вешать доп нагрузку на USB , а то из-за маленького потребления arduino , повербанк выключает свой преобразователь. или просто подключить повышайку mt3608 через механический выключатель прям на литий. 

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

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

Sketch uses 19 176 bytes (62%) of program storage space. Maximum is 30 720 bytes.

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

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

можно и доп. автомобильных оборотов - тахометр;  проверка датчиков ds18b20, типа рисование графика по изменению температуры с 4-10 датчиков. 

 

man_200
Offline
Зарегистрирован: 29.04.2016

Или дисплей SPI ILI9341 320х240 приделать в догонку

Bosch
Offline
Зарегистрирован: 25.11.2016

Я уже приделал)))

240265
240265 аватар
Offline
Зарегистрирован: 12.08.2015

man_200: "Или дисплей SPI ILI9341 320х240 приделать в догонку"

Так вон чуть выше скетч от ST7735 переделан под ILI9341, правда не до конца но наверное работает...

Bosch вроде пробовал

Bosch
Offline
Зарегистрирован: 25.11.2016

На самом деле,был использован скетч от 9340,а схема от 7735)

Juris
Juris аватар
Offline
Зарегистрирован: 28.10.2016

Уважаемый Slider, очень Вам признателен за пояснения и код к Вашему варианту, Спасибо!

240265
240265 аватар
Offline
Зарегистрирован: 12.08.2015

Bosch пишет:

На самом деле,был использован скетч от 9340,а схема от 7735)

Второй скетч - мой ,переделаный. Шапку в скетче прочитайте.

Причем старый. Вот новый под ST 7735

[code]
//страничка проекта http://srukami.inf.ua/pultoscop_v2.html
// форум http://arduino.ru/forum/proekty/pultoskop-na-arduino-27mgts?page=12#comment-175783
// скетч и библиотеку изменил под LCD_ls020 VetalST
// скетч и библиотеку изменил под LCD 1.8 дюйма 160х128 ST7735 Владимир Иванов ( 240265 )
// LCD_ls020 подключаем: 
// к ардуине на ATmega328
//**********************************************************
#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_ST7735.h> // Hardware-specific library
#include <SPI.h>
#include <FreqCount.h>
#include <PWM.h>

// For the breakout, you can use any 2 or 3 pins
// These pins will also work for the 1.8" TFT shield
#define TFT_CS    10
#define TFT_RST   A0
#define TFT_DC     8

// Option 1 (recommended): must use the hardware SPI pins
// (for UNO thats sclk = 13 and sid = 11) and pin 10 must be
// an output. This is much faster - also required if you want
// to use the microSD card (see the image drawing example)
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS,  TFT_DC, TFT_RST);

// Option 2: use any pins but a little slower!
//#define TFT_SCLK 13   // set these to be whatever pins you like!
//#define TFT_MOSI 11   // set these to be whatever pins you like!
//Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);

#define Out  9   //пин для генератор сигналов и DSS(не менять)
#define dds  9   //пин для генератора dds (не менять)

//#################№№№№№№####пользовательские настройки!
#define levo 4
#define ok 3
#define pravo 2
#define akb A3 //любой своюодный аналоговый пин для измерения напряжения АКБ
#define delit 6 //включен или отключен делитель на х10
#define overclock 16 //Частота на которой работает Ардуино 
byte SinU=30; // =30;   //уровень синхронизации 0 до 255
int PWM = 128;//стартовое значение ШИМ от 0 до 255        
int32_t frequency = 500; //стартовое значение частоты в Гц
float VCC=5.0;  //напряжение питания, меряем мультиметром
byte pultoskop=1; //флаг выбора генератора или осциллографа
//###########################################################

byte menuDDS=0; 
byte sinM[32]={1,6,15,29,48,69,92,117,143,168,191,212,229,243,251,255,254,248,237,222,203,181,156,131,106,81,59,39,22,10,3,1};
byte pilaM[32]={1,9,17,25,33,41,49,57,65,73,81,89,97,105,113,121,129,137,145,153,161,169,177,185,193,201,209,217,225,235,245,255};
byte RpilaM[32]={250,246,238,230,222,214,206,198,190,182,174,166,158,150,142,134,126,118,110,102,94,86,78,70,62,54,41,33,25,17,9,1};
byte trianglM[32]={1,18,35,52,69,86,103,120,137,154,171,188,205,222,239,255,239,223,207,191,175,159,143,127,111,95,79,63,47,31,15,1};
byte hag=0;
int mnog=0;
boolean flag=0;
byte mass[256];//массив АЦП
//byte massDEL[401];
byte menu=1;//переменная верхнего меню
byte razv=5;//значение развертки
byte x=30; //счетчик оси Х
int Vmax=0;// максимальное напряжение 
unsigned long pause=0;//переменная для замены Delay
bool opornoe=1; //флаг опорного напряжения
bool paus=0; //флаг режима паузы
bool clen_p=0;//флаг чистки паузы
long countX=0;
byte sinhMASS=0;
unsigned long count =0;
int prokr=0;
char str[10]; 
int temp;
float armcurrent;
int d=0;

//********************* ОТРИСОВКА ЛИНИИ *********************************
void Line(int16_t x0, int16_t y0, int16_t x1, int16_t y1,
 uint16_t color) {
  bool vektor = abs(x0 - x1) > abs (y0 - y1);
  if (vektor) {
    if (y1 > y0) {
      int h = x1 - x0 + 1;
      int d = y1 - y0 + 1;
      h = h / d;
      for (; y0 <= y1; y0++) {
       tft. drawFastHLine(x0, y0, h, color);
        x0 = x0 + h;
      }
    }
    else {
      int h = x1 - x0 + 1;
      int d = y0 - y1 + 1;
      h = h / d;
      for (; y0 >= y1; y0--) {
       tft. drawFastHLine(x0, y0, h, color);
        x0 = x0 + h;
      }
    }
  }
  else {
    if (y1 > y0) {
      int h = y1 - y0 + 1;
      int d = x1 - x0 + 1;
      h = h / d;
      for (; x1 >= x0; x0++) {
       tft. drawFastVLine(x0, y0, h, color);
        y0 = y0 + h;
      }
    }
    else {
      int h = y0 - y1 + 1;
      int d = x1 - x0 + 1;
      h = h / d;
      for (; x1 >= x0; x1--) {
        tft.drawFastVLine(x1, y1, h, color);
        y1 = y1 + h;
      }
    }
  }
}

//********************* МЕНЮ DDS *********************
void DDS_Menu () {
    tft.setCursor(35, 30);
    tft.setTextColor(ST7735_WHITE);
    tft.setTextSize(1);
    tft.println("СИНУС");     
    tft.setCursor(35, 50);
    tft.println("ТРЕУГОЛЬНИК");
    tft.setCursor(35, 70); 
    tft.println("ПИЛА");
    tft.setCursor(35, 90);
    tft.println("ПИЛА ОБР");       
}

//***************** ОТРИСОВКА В ПАУЗЕ ОСЦИЛОГРАФА *******************
void Pause(){
        tft.fillRect(0, 12, 160, 3, ST7735_BLACK);//стиране шкалы прокрутки
          tft.fillRect(6, 12, 154, 99, ST7735_BLACK);//стиране поле графика
         // tft.fillRect(0,116, 160, 12, ST7735_BLACK);//стиране НИЖНЕГО МЕНЮ 
          //////////////////////////////////////////////////////////////
          tft.drawLine(prokr/4,12,prokr/4+25,12, ST7735_YELLOW);//шкала прокрутки
          tft.drawLine(prokr/4,13,prokr/4+25,13, ST7735_YELLOW);//шкала прокрутки
          tft.drawLine(prokr/4,14,prokr/4+25,14, ST7735_YELLOW);//шкала прокрутки
          
          //++++++++++++++++ СЕТКА
          for(byte i=110;i>18;i=i-3){
            tft.drawPixel(6,i, ST7735_BLUE);
            tft.drawPixel(25,i, ST7735_BLUE); 
            tft.drawPixel(44,i, ST7735_BLUE); 
            tft.drawPixel(63,i, ST7735_BLUE); 
            tft.drawPixel(82,i, ST7735_BLUE); 
            tft.drawPixel(101,i, ST7735_BLUE);
            tft.drawPixel(120,i, ST7735_BLUE); 
            tft.drawPixel(139,i, ST7735_BLUE); 
            tft.drawPixel(158,i, ST7735_BLUE);
           // tft.drawPixel(159,i, ST7735_BLUE);
          }
          for(byte i=6;i<160;i=i+3){
            tft.drawPixel(i,25, ST7735_BLUE);
            tft.drawPixel(i,42, ST7735_BLUE); 
            tft.drawPixel(i,59, ST7735_BLUE);
            tft.drawPixel(i,76, ST7735_BLUE); 
            tft.drawPixel(i,93, ST7735_BLUE); 
            tft.drawPixel(i,110, ST7735_BLUE);
          }
          //////////////////////////////////////////////////////
          x=5;
          for(int y=prokr;y<prokr+146;y++){
            if(razv<7){ x++;}
            if(razv==7){x=x+2;}
            if(razv==8){ x=x+3; }
            if(razv==9){ x=x+4; }
            if(razv==10){ x=x+5; }
            if(x>160){ x=160; }
          // tft.drawPixel(x,110-mass[y]/3,ST7735_GREEN);
           tft.drawLine(x,110-mass[y]/3, x+1,110-mass[y+1]/3, ST7735_GREEN);//график
          }
      }

//************* ОТРИСОВКА ВЕРХНЕГО МЕНЮ ************************      
void PrintVmenu(){
tft.fillRect(0, 0, 45, 9, ST7735_BLACK);
          if(digitalRead(delit)==HIGH){//включен или отключен делитель
        if(opornoe==0){
                    
    tft.setTextColor(ST7735_WHITE);
    tft.setCursor(3, 1);
    tft.println( "2.2V/d");
        }
        if(opornoe==1){
                   
          tft.setTextColor(ST7735_WHITE);
    tft.setCursor(3, 1);
          tft.println( "10V/d");
        }
      }
      else {//включен или отключен делитель
        if(opornoe==0){
          tft.setTextColor(ST7735_WHITE);
    tft.setCursor(3, 1);
          tft.println( "0.22V/d");
        }
        if(opornoe==1){
          tft.setTextColor(ST7735_WHITE);
    tft.setCursor(3, 1);
          tft.println( "1V/d");
        }
      }

       tft.setCursor(55, 1);
    tft.println( "Разв");
        sprintf(str, "%d", razv); 
    tft.setCursor(91, 1);
    tft.println( str);

}

//******************* ОТРИСОВКА ГЛАВНОГО МЕНЮ *****************  

void GlavMenu (){

     tft.setTextSize(1);
      tft.setTextColor(ST7735_WHITE);
      tft.setCursor(35, 25);
      tft.println("Осцилограф");
       tft.setCursor(35, 55);
       tft.println("Генератор PWM");
       tft.setCursor(35, 85);
        tft.println("Генератор DDS");
      tft.setTextColor(ST7735_BLUE);
       tft.setCursor(30, 110);
       tft.println("Батарея =");
      armcurrent = analogRead(akb)*VCC/1023;//проверка напряжения на АКБ
      temp = (armcurrent - (int)armcurrent) * 100; // множитель - число знаков после запятой. 10 - 1, 100 - 2, 1000 - 3 и т.д.
      sprintf(str, "%d.%02d V", (int)armcurrent, abs(temp));      
      tft.fillRect(90,110,24,10,ST7735_BLACK);
       tft.setTextColor(ST7735_BLUE);
       tft.setCursor(90, 110);
       tft.println(str);
  
}
  


void setup(){  
  if(opornoe==0){
    ADMUX = 0b11100100;
  }//выбор внутреннего опорного 1,1В
  if(opornoe==1){
    ADMUX = 0b01100100;
  }//Выбор внешнего опорного
SPI.begin;
 SPI.setClockDivider(SPI_CLOCK_DIV2);

  tft.initR(INITR_BLACKTAB);   // initialize a ST7735S chip, black tab
 tft.setRotation(3);              //  повернуть по горизонту
  tft.fillScreen(ST7735_BLACK);
  tft.drawRect(0,0,160,128,ST7735_WHITE); // рисуем рамку
  tft.drawRect(2,2,156,125,ST7735_BLUE); // рисуем рамку
  tft.drawRect(4,3,152,121,ST7735_RED); // рисуем рамку
  
 while(digitalRead(ok)==LOW){  
    if(digitalRead(pravo)==HIGH){
     // delay (10);
      while((digitalRead(pravo)==HIGH));
      pultoskop=pultoskop-1;
      if(pultoskop<1)pultoskop=3;
    }
    if(digitalRead(levo)==HIGH){
     // delay (10);
      while((digitalRead(levo)==HIGH));
      pultoskop=pultoskop+1;
      if(pultoskop>3)pultoskop=1;
    }


    if(pultoskop==1){
      GlavMenu ();
 //     tft.setTextSize(1);
      tft.setTextColor(ST7735_RED);
      tft.setCursor(35, 25);
      tft.println("Осцилограф");

    }
    
    if(pultoskop==2){
     GlavMenu ();
       tft.setCursor(35, 55);
       tft.setTextColor(ST7735_RED);
       tft.println("Генератор PWM");
    } 
    
     if(pultoskop==3){
      GlavMenu ();   
       tft.setCursor(35, 85);
       tft.setTextColor(ST7735_RED);
       tft.println("Генератор DDS");
    } 
 delay(200); 
  
}  

     tft.fillScreen(ST7735_BLACK);//очистка дисплея
  if(pultoskop==1){
    FreqCount.begin(1000); 
 //   tft.fillScreen(ST7735_BLACK);//очистка дисплея      
  }
  if(pultoskop==2){
    InitTimersSafe(); 
    bool success = SetPinFrequencySafe(Out, frequency);
 //   tft.fillScreen(ST7735_BLACK);//очистка дисплея  
  }
  if(pultoskop==3){
   InitTimersSafe(); 
   bool success = SetPinFrequencySafe(Out,200000);
//   tft.fillScreen(ST7735_BLACK);//очистка дисплея   
  }
delay(500);  
}

void Zamer(){

  if (razv>=6){ADCSRA = 0b11100010;}//delitel 4
  if (razv==5){ADCSRA = 0b11100011;}//delitel 8
  if (razv==4){ADCSRA = 0b11100100;}//delitel 16
  if (razv==3){ADCSRA = 0b11100101;}//delitel 32
  if (razv==2){ADCSRA = 0b11100110;}//delitel 64
  if (razv<2){ADCSRA = 0b11100111;}//delitel 128
  if (razv==0){
      for(int i=0;i<255;i++){ 
          while ((ADCSRA & 0x10)==0);
          ADCSRA|=0x10;
          delayMicroseconds(500);
          mass[i]=ADCH;
      }
  }
  if (razv>0){
      for(int i=0;i<255;i++){ 
          while ((ADCSRA & 0x10)==0);
          ADCSRA|=0x10;
          mass[i]=ADCH;
      }
  }
  
}

void MenuT(){//перерисовка нижнего меню    

  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)-0.2; }//-0.2 КОРЕКЦИЯ ПОКАЗАНИЙ ЧАСТОТЫ ГЦ //delitel 128
        flagFrec1=0;
        flagFrec3=0;
      }
    }
  }

  //#######################################частоты сигнала

   tft.setTextColor(ST7735_WHITE);
   tft.setCursor(1, 120);
    tft.println( "F=");
    
  if(opornoe==1){
    if((Vmax*VCC/255)>2.8){ countX=count*(overclock/16.0); }
    if((Vmax*VCC/255)<=2.8){ countX=Frec*(overclock/16.0); }
  }
  if(opornoe==0){ countX=Frec*(overclock/16.0); }
  if(countX<1000){
    sprintf(str, "%d Hz", countX);
    tft.setTextColor(ST7735_WHITE);
    tft.setCursor(18, 120);
    tft.println( str);  
  }
  if(countX>=1000){
  float countXK=countX/1000.0;
  temp = (countXK - (int)countXK) * 1000; // множитель - число знаков после запятой. 10 - 1, 100 - 2, 1000 - 3 и т.д
  sprintf(str, "%d.%03d kHz", (int)countXK, abs(temp));
  tft.setTextColor(ST7735_WHITE);
  tft.setCursor(18, 120);
  tft.println( str);  
  }
  tft.setTextColor(ST7735_WHITE);
   tft.setCursor(18, 120);
    tft.println( str);  
    
    //--------- Напряжение --------------------
  if(digitalRead(delit)==HIGH){//включен или отключен делитель
      if(opornoe==0){ armcurrent = (Vmax*1.1/255)*10; }
     if(opornoe==1){ armcurrent = (Vmax*VCC/255)*10;  }
  }
   else {
     if(opornoe==0){ armcurrent = Vmax*1.1/255; }
     if(opornoe==1){ armcurrent = Vmax*VCC/255;  }
   }
  tft.setTextColor(ST7735_WHITE);
   tft.setCursor(100, 120);
    tft.println( "U=");  
    temp = (armcurrent - (int)armcurrent) * 100; // множитель - число знаков после запятой. 10 - 1, 100 - 2, 1000 - 3 и т.д.
    sprintf(str, "%d.%02d V", (int)armcurrent, abs(temp));
   tft.setTextColor(ST7735_WHITE);
   tft.setCursor(118, 120);
    tft.println( str);  
}

void loop() { 
  if(pultoskop==1){
    while(1){

      //********** ОТРИСОВКА И ПЕРЕБОР ВЕРХНЕГО МЕНЮ ***************************
      
      //***************** опорное  **************************
      if(menu==0){ 
        tft.fillRect(0, 0, 45, 9, ST7735_RED);
       PrintVmenu(); 

        if(digitalRead(pravo)==HIGH){
         tft.fillRect(0, 12, 30, 120, ST7735_BLACK);//стирание напряжения
          opornoe=1;
        }
        if(digitalRead(levo)==HIGH){ 
          tft.fillRect(0, 12, 30, 120, ST7735_BLACK);//стирание напряжения
          opornoe=0;
        }
      }
      /////////////////////////// развертка /////////////////////////////
      if(menu==1){
        tft.fillRect(48, 0, 57, 9, ST7735_RED);
     PrintVmenu();

        if(digitalRead(pravo)==HIGH){//добавть скорость
        delay (30);
        while((digitalRead(pravo)==HIGH));
          razv++;
          if(razv==11){ razv=10;} 
        }
        if(digitalRead(levo)==HIGH){//убавить скорость
        delay (30);
        while((digitalRead(levo)==HIGH));
          razv--;
          if(razv==255){ razv=0; } 
        } 
      }
      ///////////////////// синхронизация /////////////////////////////////
      if(menu==2){  
        prokr=0;
        paus=0;
    PrintVmenu();

  tft.fillRect(105, 0, 174, 9, ST7735_RED); 
  tft.setCursor(112, 1);        
  tft.println( "Синх-ция");      
        if(digitalRead(levo)==HIGH){
          SinU=SinU-10;
          if(SinU<10){ SinU=10; }
        }
        if(digitalRead(pravo)==HIGH){
          SinU=SinU+10;
          if(SinU>240){ SinU=240; }
        }

        tft.fillCircle(155,110-SinU/3, 3, ST7735_RED);       
        tft.fillCircle(155,110-SinU/3, 1, ST7735_BLACK);
      }      
      ///////////////////// пауза //////////////////////////////////
      if(menu==3){
        paus=1;
        if(clen_p==0){
         clen_p=1; 
         
         tft.fillRect(105, 0, 174, 9, ST7735_RED);
    PrintVmenu();

    tft.setCursor(112, 1);
    tft.println( "ПАУЗА");      
      }   
        }    

      if(digitalRead(ok)==HIGH){
        delay (30);
        while((digitalRead(ok)==HIGH));
        menu++;
        tft.fillRect(6, 16, 154, 99, ST7735_BLACK);//стиране поле графика
        tft.fillRect(0,116, 160, 12, ST7735_BLACK);//стиране НИЖНЕГО МЕНЮ 
        if(menu==4){
          menu=0;
          paus=0;
          clen_p=0;
        }
        tft.fillRect(0, 0, 160, 15, ST7735_BLACK);//стиране ВЕРХ МЕНЮ
      }

      //************** ОСЬ НАПРЯЖЕНИЯ ##########################################
      tft.drawLine(2, 20, 2, 114, ST7735_BLUE);
      tft.drawLine(2, 25, 5, 25, ST7735_BLUE); 
      tft.drawLine(2, 42, 5, 42, ST7735_BLUE); 
      tft.drawLine(2, 59, 5, 59, ST7735_BLUE); 
      tft.drawLine(2, 76, 5, 76, ST7735_BLUE); 
      tft.drawLine(2, 93, 5, 93, ST7735_BLUE); 
      tft.drawLine(2, 110,5, 110, ST7735_BLUE); 

      //************ ОСЬ РАЗВЕРТКИ ##########################################
      tft.drawLine(2, 115,158, 115, ST7735_BLUE); 
      //  Черточки ******************     
            for(byte i=6;i<160;i=i+19){
            tft.drawPixel(i,114, ST7735_BLUE); 
            tft.drawPixel(i,113, ST7735_BLUE);
            tft.drawPixel(i,112, ST7735_BLUE); 
 }
      //***************выбор внутреннего опорного 1,1В ########################################
      if(opornoe==0){ ADMUX = 0b11100100; }
      //**************Выбор внешнего опорного ***************************
      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<151;y++){ if(Vmax<mass[y]){ Vmax=mass[y]; } }
      //максимальное значение сигнала ##########################
      
      //************************ ОТРИСОВКА ГРАФИКА *************************
      if(paus==0){       
        tft.fillRect(6, 25, 154, 86, ST7735_BLACK);//стиране поле графика        
//***//*************** стиране НИЖНЕГО МЕНЮ **********************
     tft.fillRect(18, 120, 80, 8, ST7735_BLACK);
     tft.fillRect(118, 120, 25, 8, ST7735_BLACK);
//*****************************************************************
        tft.fillCircle(10,110-SinU/3, 2, ST7735_YELLOW);//рисуем уровень синхронизации 
        tft.fillCircle(10,110-SinU/3, 3, ST7735_YELLOW);//рисуем уровень синхронизации        
           x=5;
       for(int y=sinhMASS-1;y<sinhMASS+151;y++){ 

           if(razv<7){ x++; }
          if(razv==7){ x=x+2; }
          if(razv==8){ x=x+3; } 
          if(razv==9){ x=x+4; }
          if(razv==10){ x=x+5; }
          if(x>159){ x=159; } 
   
        Line(x,110-mass[y]/3, x+1,110-mass[y+1]/3, ST7735_GREEN);//график через Line (быстрее в 2 раза)
        }     
        MenuT();  
      }
     ///////////////////////////// режим паузы //////////////////////////////////////////////// 
     
    if(paus==1){
    
        if(digitalRead(pravo)==HIGH){//листаем
          prokr=prokr+2;
          if(prokr>554){prokr=0; }
      Pause();
        }
      if(digitalRead(levo)==HIGH){//листаем
          prokr=prokr-2;
          if(prokr<0){prokr=554; }
      Pause();
        } 
      }
     // delay(300); // можно удалить или подобрать по скорости обновления экрана
    }
  }
  
  //************************************************************************************************
  //#######################################  режим ренератора от 1 Гц до 2 МГц
  if(pultoskop==2){
    while(1){
      if (flag==0){//флаг выборов режима настройки  Частоты
        if(digitalRead(levo)==HIGH){
          frequency=frequency-mnog;
          if(frequency<0){
            frequency=0;
          }
          bool success = SetPinFrequencySafe(Out, frequency);
          delay(3);//защита от дребезга 
          tft.fillRect(6, 60, 160, 80, ST7735_BLACK);//стирание поля
        }
        if(digitalRead(pravo)==HIGH){
          frequency=frequency+mnog;
          bool success = SetPinFrequencySafe(Out, frequency);
          delay(3);//защита от дребезга 
          tft.fillRect(6, 60, 160, 80, ST7735_BLACK);//стирание поля закрашиваем
        }  
      }
      if (flag==1){//флаг выборов режима настройки ШИМ 
        if(digitalRead(levo)==HIGH){
          PWM=PWM-2;
          if(PWM<0){
            PWM=255;
          } 
          delay(3);//защита от дребезга
          tft.fillRect(6, 6, 160, 40, ST7735_BLACK);//стирание поля
          tft.fillRect(90, 100, 129, 125, ST7735_BLACK);//стирание в низу число шим
        }
        if(digitalRead(pravo)==HIGH){
          PWM=PWM+2;
          if(PWM>255){
            PWM=0;
          } 
          delay(3);//защита от дребезга
          tft.fillRect(6, 6, 160, 40, ST7735_BLACK);//стирание поля 
          tft.fillRect(90, 100, 129, 125, ST7735_BLACK);//стирание в низу число шим
        }  
      }      

      if(digitalRead(ok)==HIGH){//переключение разряда выбора частоты 
        delay (30);
        while((digitalRead(ok)==HIGH));
        hag++;
        if(hag>=6){
          hag=0;
        }
        tft.fillRect(6, 100, 154, 28, ST7735_BLACK);//стирание поля
      }
      ////////////

      tft.setCursor(10, 19);
      tft.setTextColor(ST7735_GREEN);
      tft.setTextSize(2);
      tft.println("PWM =");                                      
     // temp = PWM*100/255;
      tft.setCursor(80, 19);
      tft.println( PWM*100/255,1);      
      tft.setCursor(122, 19);
      tft.println( "%");
      
      armcurrent = (127*PWM/255)+25; // вычисляем длинны линии

      tft.drawLine(6,10,armcurrent,10, ST7735_YELLOW);
      tft.drawLine(6,11,armcurrent,11, ST7735_YELLOW);
      tft.drawLine(6,12,armcurrent,12, ST7735_YELLOW);
      tft.drawLine(6,13,armcurrent,13, ST7735_YELLOW);
      tft.drawLine(6,14,armcurrent,14, ST7735_YELLOW);

      tft.drawLine(6,37,armcurrent,37, ST7735_YELLOW);
      tft.drawLine(6,38,armcurrent,38, ST7735_YELLOW);
      tft.drawLine(6,39,armcurrent,39, ST7735_YELLOW);
      tft.drawLine(6,40,armcurrent,40, ST7735_YELLOW);
      tft.drawLine(6,41,armcurrent,41, ST7735_YELLOW);

      ///////////////////////////////////    
      long frequencyX=frequency*(overclock/16.0);
       tft.setTextSize(2);
      if(frequencyX<1000){
        sprintf(str, "%d Hz", frequencyX);
        tft.setCursor(30, 60);
        tft.setTextColor(ST7735_WHITE);      
        tft.println(str);                  
        tft.setTextSize(1); 
      }
     
      if(frequencyX>=1000&&frequencyX<1000000){
        tft.setTextSize(2);
        armcurrent=frequencyX/1000.0;
        temp = (armcurrent - (int)armcurrent) * 1000; // множитель - число знаков после запятой. 10 - 1, 100 - 2, 1000 - 3 и т.д.
        sprintf(str, "%d.%003d kHz", (int)armcurrent, abs(temp));
        tft.setCursor(15, 60);
        tft.setTextColor(ST7735_WHITE);        
        tft.println(str);                
       tft.setTextSize(1);
      }
     
      if(frequencyX>=1000000){
        tft.setTextSize(2);
        armcurrent=frequencyX/1000000.0;
        temp = (armcurrent - (int)armcurrent) * 1000; // множитель - число знаков после запятой. 10 - 1, 100 - 2, 1000 - 3 и т.д.
        sprintf(str, "%d.%003d MHz", (int)armcurrent, abs(temp));
        tft.setCursor(30, 60);
        tft.setTextColor(ST7735_WHITE);        
        tft.println(str);          
       tft.setTextSize(1);
       
      }  
      if(frequencyX>2000000)frequency=0;

      ////////////////////////////////////////////////////////////// 

        tft.setCursor(5, 100);
        tft.setTextColor(ST7735_BLUE);
        tft.setTextSize(1);
        tft.println(">>");          
    
      if(hag==0){//выбор множителя частоты 
        mnog=1;
        flag=0;
        armcurrent = 1*(overclock/16.0);
        tft.setTextSize(2);
        temp = (armcurrent - (int)armcurrent) * 100; // множитель - число знаков после запятой. 10 - 1, 100 - 2, 1000 - 3 и т.д.
        sprintf(str, "%d.%d Hz", (int)armcurrent, abs(temp));
        tft.setCursor(30, 100);
        tft.setTextColor(ST7735_YELLOW);        
        tft.println(str);          

      }
      if(hag==1){//выбор множителя частоты
        mnog=10;
        armcurrent = 10*(overclock/16.0);
        tft.setTextSize(2);
        temp = (armcurrent - (int)armcurrent) * 100; // множитель - число знаков после запятой. 10 - 1, 100 - 2, 1000 - 3 и т.д.
        sprintf(str, "%d.%d Hz", (int)armcurrent, abs(temp));
        tft.setCursor(30, 100);
        tft.setTextColor(ST7735_YELLOW);        
        tft.println(str);        
      }
      if(hag==2){//выбор множителя частоты
        mnog=100;
        armcurrent = 100*(overclock/16.0);
        tft.setTextSize(2);
        temp = (armcurrent - (int)armcurrent) * 100; // множитель - число знаков после запятой. 10 - 1, 100 - 2, 1000 - 3 и т.д.
        sprintf(str, "%d.%d Hz", (int)armcurrent, abs(temp));
        tft.setCursor(30, 100);
        tft.setTextColor(ST7735_YELLOW);        
        tft.println(str);        
      }
      if(hag==3){//выбор множителя частоты
        mnog=1000;
        armcurrent = 1*(overclock/16.0);
        tft.setTextSize(2);
        temp = (armcurrent - (int)armcurrent) * 100; // множитель - число знаков после запятой. 10 - 1, 100 - 2, 1000 - 3 и т.д.
        sprintf(str, "%d.%d kHz", (int)armcurrent, abs(temp));
        tft.setCursor(30, 100);
        tft.setTextColor(ST7735_YELLOW);        
        tft.println(str);        
      } 
      if(hag==4){//выбор множителя частоты
        mnog=10000;
        armcurrent = 10*(overclock/16.0);
        tft.setTextSize(2);
        temp = (armcurrent - (int)armcurrent) * 100; // множитель - число знаков после запятой. 10 - 1, 100 - 2, 1000 - 3 и т.д.
        sprintf(str, "%d.%d kHz", (int)armcurrent, abs(temp));
        tft.setCursor(30, 100);
        tft.setTextColor(ST7735_YELLOW);        
        tft.println(str);        
      } 
      if(hag==5){//выбор  PWM 
        flag=1;
        tft.setTextSize(2);
        tft.setCursor(25, 100);
        tft.setTextColor(ST7735_YELLOW);
        tft.println("PWM =");               
       // temp = PWM*100/255;
        tft.setCursor(95, 100);
        tft.setTextColor(ST7735_YELLOW);      
        tft.println(PWM*100/255,1);                   
        tft.setCursor(132, 100);
        tft.setTextColor(ST7735_YELLOW);
        tft.println("%");               
      }
        tft.setCursor(145, 100);
        tft.setTextColor(ST7735_BLUE);
        tft.setTextSize(1);
        tft.println("<<");         
     

      pwmWrite(Out, PWM);
      delay(50);  
    }
  }
 //************************************************************************************************
  //#######################################  режим DDS ренератор
if(pultoskop==3){
  while(1){
int fr=10;

if(menuDDS==0){
  DDS_Menu ();
    tft.setCursor(35, 30);
    tft.setTextColor(ST7735_RED);    
 //   tft.setTextSize(1);
    tft.println("СИНУС");      

    delay(400); 
    while(!(PIND & (1<<PIND2))){
    PWM=sinM[d];
    pwmWrite(dds,PWM);
    //delayMicroseconds(fr);
    d++;
    if(d==32){d=0;}}
     menuDDS++;
  }
if(menuDDS==1){
  DDS_Menu ();
    tft.setCursor(35, 50);    
    tft.setTextColor(ST7735_RED);
    tft.println("ТРЕУГОЛЬНИК");

    delay(400);
    while(!(PIND & (1<<PIND2))){
      PWM=trianglM[d];
      pwmWrite(dds,PWM);
      //delayMicroseconds(fr);
      d++;
      if(d==32){d=0;}}
    menuDDS++;
  }
if(menuDDS==2){
  DDS_Menu ();

    tft.setTextColor(ST7735_RED);
    tft.setCursor(35, 70); 
    tft.println("ПИЛА");
    
    delay(400);
    while(!(PIND & (1<<PIND2))){
      PWM=pilaM[d];
      pwmWrite(dds,PWM);
      //delayMicroseconds(fr);
      d++;
      if(d==32){d=0;}}
      menuDDS++;
  }
if(menuDDS==3){
  DDS_Menu ();

    tft.setCursor(35, 90);
    tft.setTextColor(ST7735_RED);
    tft.println("ПИЛА ОБР");       

    delay(400);  
    while(!(PIND & (1<<PIND2))){
      PWM=RpilaM[d];
      pwmWrite(dds,PWM);
      //delayMicroseconds(fr);
      d++;
      if(d==32){d=0;}}
      menuDDS++;
  }
if(menuDDS==4){menuDDS=0;}
}
}
/////////////////////DDS
}

[/code]

 

man_200
Offline
Зарегистрирован: 29.04.2016

Так он пойдет на 9341? Как скорость отрисовки?

пошел плату рисовать. У меня на рассыпухе будет

240265
240265 аватар
Offline
Зарегистрирован: 12.08.2015

man_200 пишет:

Так он пойдет на 9341? Как скорость отрисовки?

пошел плату рисовать. У меня на рассыпухе будет

под ST 7735, под 9341 Bosch вроде бы переделал, спросите у него.

Пультоскоп ST7735

Я больше ЕГО ковырять не буду, сейчас ковыряю потихоньку на STM32F303.

 

Juris
Juris аватар
Offline
Зарегистрирован: 28.10.2016

240265 пишет:

... сейчас ковыряю потихоньку на STM32F303.


Это Вы про вариацию осциллографа "Fusion-Мурзик"? Или может другое?

240265
240265 аватар
Offline
Зарегистрирован: 12.08.2015

Да, Fusion-IVL-Мурзик :))

Juris
Juris аватар
Offline
Зарегистрирован: 28.10.2016

просьба 240265, пожалуйста добавте в предыдущий Ваш пост, там где фотки -  коротко ссылки, в каком посту именно этот скетч, какой дисплей, схема. Так будет здоровски удобно и понятно :) Спасибо.

Bosch
Offline
Зарегистрирован: 25.11.2016

А я и не претендовал на авторство)Спасибо за новую версию!Но мне хотелось бы больше функций,как для 128*160,но там нужно много редактировать( 

240265
240265 аватар
Offline
Зарегистрирован: 12.08.2015

Экран ST7735 160x128

Схема пост #2308

Скетч пост 2318

Фото пост 2320

240265
240265 аватар
Offline
Зарегистрирован: 12.08.2015

Bosch пишет:

А я и не претендовал на авторство)Спасибо за новую версию!Но мне хотелось бы больше функций,как для 128*160,но там нужно много редактировать( 

Авторство bodriy2014 , остальное доработки. Доделайте если есть интерес под 9341 Народ Вам спасибо скажет.

У меня там тоже не все гладко. Но чтото смотреть можно.

Сейчас использую как генератор.

Bosch
Offline
Зарегистрирован: 25.11.2016

Интерес-то есть,да только в программировании я не шарю(

240265
240265 аватар
Offline
Зарегистрирован: 12.08.2015

Bosch пишет:

Интерес-то есть,да только в программировании я не шарю(

А из поста 2307 работает?

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

Juris
Juris аватар
Offline
Зарегистрирован: 28.10.2016

Скажите пожалуйста, 240265, что за корпус это у Вас использован?

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

Juris пишет:

Скажите пожалуйста, 240265, что за корпус это у Вас использован?

предполагаю с алиэкспресса за 50 рублей штука

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

Bosch пишет:

Интерес-то есть,да только в программировании я не шарю(

Пришел от кумовей, вечерю носили немного «веселый»,

прочитал ваш пост и сразу на душе потеплело и настроение еще поднялось!!!)

Вот ради таких ощущений многие вещи и выкладываю в сеть!)

240265
240265 аватар
Offline
Зарегистрирован: 12.08.2015

Juris пишет:

Скажите пожалуйста, 240265, что за корпус это у Вас использован?

https://ru.aliexpress.com/item/Free-Shipping-5pcs-lot-Plastic-Electronics-Project-Box-Enclosure-Case-DIY-New-3-34-L-x/32334996832.html?spm=2114.13010608.0.0.PtAkAj

Juris
Juris аватар
Offline
Зарегистрирован: 28.10.2016

Aha, понял про коробочку, Спасибо. 5 штук за 3 доллара - неплохо  :)

Bosch
Offline
Зарегистрирован: 25.11.2016

Ребят,а к каким входам вы подключали щуп?А то на всех схемах лишь один вход

240265
240265 аватар
Offline
Зарегистрирован: 12.08.2015

Bosch пишет:

Ребят,а к каким входам вы подключали щуп?А то на всех схемах лишь один вход

A4,D5  A4 - Вход осцилографа , D5 - Вход частотомера TTL - уровня , D9 - Выход DDS и генератора. На схеме же есть...

Bosch
Offline
Зарегистрирован: 25.11.2016

А как в скетче установить другие пины?

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

 Строки  кода определяющие вход АЦП A3 или A4 http://arduino.ru/forum/proekty/pultoskop-na-arduino-27mgts?page=13#comment-177453

Bosch
Offline
Зарегистрирован: 25.11.2016

А если у меня D5 занят?Как его изменить в скетче?

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

если я правильно понял для измерения частоты в пультоскопе подключается либа FreqCount  https://www.pjrc.com/teensy/td_libs_FreqCount.html  

http://arduino.ru/forum/apparatnye-voprosy/chastotomer-na-arduino-uno-i-lcd-keypad-shield

измеряемая частота подается на pin 5 (для FreqCount), причем, похоже, что изменить их на другие в исходных текстах этих библиотек невозможно, поскольку они связаны с конкретными входами таймеров Arduino

240265
240265 аватар
Offline
Зарегистрирован: 12.08.2015

FreqCountTimers.h

.

.

.

// Arduino Duemilanove, Diecimila, LilyPad, Mini, Fio, etc
#elif defined(__AVR_ATmega328P__) || defined(__AVR_ATmega168__)
  #define COUNTER_USE_TIMER1    // T1 is pin 5
  #define TIMER_USE_TIMER2

.

.

.

 

240265
240265 аватар
Offline
Зарегистрирован: 12.08.2015

Схема и скетч немного не совпадают , вот подправил.

Выходы D11-D13 лучше не менять (Hard SPI)

Stashevskiy68
Offline
Зарегистрирован: 09.01.2017

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

 

sirota
Offline
Зарегистрирован: 18.08.2015

240265, а к какому это скетчу?

Еще как я понял PWM эта та либа? http://arduino.ru/forum/programmirovanie/pwm-biblioteka-shim-arduino

Ну и адафруит https://github.com/adafruit/Adafruit-ST7735-Library Выкладывайте сразу линки на нестандартные библы.

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

zz11ss
Offline
Зарегистрирован: 19.12.2016

Надумал поиграться и импортировать в проект "Коэффициент заполнения" с предыдущей страницы, что заметил: функция останавливает таймеры и нужно опять запустить-в скетче исправил,руссификация по совету  от сюда http://arduino.ru/forum/programmirovanie/rusifikatsiya-biblioteki-adafruit-gfx-i-vyvod-russkikh-bukv-na-displei-v-kodi?page=3,

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


#include "SPI.h"
#include "Adafruit_GFX.h"// Core graphics library
#include "Adafruit_ILI9341.h"
//страничка проекта <a data-cke-saved-href="<a href="http://srukami.inf.ua/pultoscop_v2.html" rel="nofollow">http://srukami.inf.ua/pultoscop_v2.html</a>" href="<a href="http://srukami.inf.ua/pultoscop_v2.html" rel="nofollow">http://srukami.inf.ua/pultoscop_v2.html</a>" rel="nofollow"><a href="http://srukami.inf.ua/pultoscop_v2.html" rel="nofollow">http://srukami.inf.ua/pultoscop_v2.html</a></a>
//дистплей TFT SPFD5408

//#include <Adafruit_ILI9340.h> // Hardware-specific library
//#if defined(__SAM3X8E__)
//#undef __FlashStringHelper::F(string_literal)
//#define F(string_literal) string_literal
//#endif

// These are the pins used for the UNO
// for Due/Mega/Leonardo use the hardware SPI pins (which are different)
#define TFT_DC 7
#define TFT_CS A0
#define TFT_MOSI 11
#define TFT_CLK 13
#define TFT_RST 8
#define TFT_MISO 12
#define BLACK   0x0000
#define BLUE    0x001F
#define RED     0xF800
#define GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF
#define GREY    0x7BEF
#define maxString 21
char target[maxString + 1] = "";
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_MOSI, TFT_CLK, TFT_RST, TFT_MISO);
//пользовательские настройки!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#define levo 4
#define ok 3
#define pravo 2
#define vertikal 2   //размер вертикальной сеткаи(если "0" отключениа)
//пользовательские настройки!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
byte mass[501];//массив АЦП
byte massDEL[501];
byte menu = 1; //переменная верхнего меню
byte razv = 0; //значение развертки
float x = 60; //счетчик оси Х
int Vmax = 0; // максимальное напряжение
float Vakb = 0; //напряженеиЕКБ
unsigned long t = 0; //переменная для ращета развертки
unsigned long pause = 0; //переменная для замены Delay
int t_del = 0; //значение цены деления развертки в микросекундах
bool t_dell = 0; //флаг расчета коэффициента заполнения
int setka = 0;
bool opornoe = 1; //флаг опорного напряжения
bool paus = 0; //флаг режима паузы
bool clen_p = 0; //флаг чистки паузы
bool fullDisp = 0;
bool setka2 = 0;
bool st = 0;
bool flag = 0;
bool izmHz = 0;
uint32_t tic1;
uint32_t tic2;
int duty;

void setup() {
  tft.begin();
  tft.cp437(true);
  Vakb = analogRead(A2) * 5.3 / 1024; //проверка напряжения на АКБ
  if (opornoe == 0) {
    ADMUX = 0b11100011; //выбор внутреннего опорного 1,1В
  }
  if (opornoe == 1) {
    ADMUX = 0b01100011; //Выбор внешнего опорного
  }
  delay(50);
  tft.fillScreen(BLACK);
  delay(500);
  Setka1();
  Opornoe();
}
void Zamer() { //заполнение буфера АЦП
  if (razv >= 6) {
    ADCSRA = 0b11100010; //delitel 4
  }
  if (razv == 5) {
    ADCSRA = 0b11100011; //delitel 8
  }
  if (razv == 4) {
    ADCSRA = 0b11100100; //delitel 16
  }
  if (razv == 3) {
    ADCSRA = 0b11100101; //delitel 32
  }
  if (razv == 2) {
    ADCSRA = 0b11100110; //delitel 64
  }
  if (razv < 2) {
    ADCSRA = 0b11100111; //delitel 128
  }
  if (razv == 0) {
    t = micros();
    for (int i = 0; i < 500; i++) {
      while ((ADCSRA & 0x10) == 0);
      ADCSRA |= 0x10;
      delayMicroseconds(100);
      mass[i] = ADCH;
    }
    t = micros() - t;
    t_del = t * 25 / 501;
  }
  if (razv > 0) {
    t = micros();
    for (int i = 0; i < 500; i++) {
      while ((ADCSRA & 0x10) == 0);
      ADCSRA |= 0x10;
      mass[i] = ADCH;
    }
    t = micros() - t;
    t_del = t * 25 / 501;
  }
  Vmax = 0;
  for (int i = 0; i < 500; i++) {
    if (Vmax < mass[i]) {
      Vmax = mass[i];
    }
  }
  if (fullDisp == 0) {
    for (int i = 0; i < 500; i++) {
      mass[i] = 190 - (mass[i] * 0.7);
    }
  }
  else {
    for (int i = 0; i < 500; i++) {
      mass[i] = 230 - (mass[i] * 0.88);
    }
  }
  if (t_dell == 0){
  tic1 = asm_func(1);
  tic2 = asm_func(0);
  duty=(1/((float)tic1/tic2))*100;
  t_dell=1;
  }
}

void loop() {
  if (paus == 0) {
    Zamer();
  }
  Graf();
  Menu();
}

void Menu() {
  bool flag = 0;
  if (digitalRead(ok) == HIGH) {
    flag = 0;
    delay (10);
    while (digitalRead(ok) == HIGH) {
      if (digitalRead(pravo) == HIGH) {
        opornoe = !opornoe;
        Opornoe();
        Zamer();
        Graf();
        flag = 1;
      }
      if (digitalRead(levo) == HIGH) {
        fullDisp = !fullDisp;
        Zamer();
        Setka1();
        Opornoe();
        Graf();
        flag = 1;
      }
    }
    if (flag == 0) {
      paus = !paus;
    }
  }
  if (paus == 0) {
    if (digitalRead(pravo) == HIGH) { //доработать скорость
      tft.setRotation(0);
      if (fullDisp == 0) {
        tft.fillRect(45, 60, 190, 260, BLACK);
      }
      else {
        tft.fillRect(9, 10, 230, 310, BLACK);
      }
      razv++;
      if (razv == 11) {
        razv = 10;
      }
    }
    if (digitalRead(levo) == HIGH) { //доработать скорость
      tft.setRotation(0);
      if (fullDisp == 0) {
        tft.fillRect(45, 60, 190, 260, BLACK);
      }
      else {
        tft.fillRect(9, 10, 230, 310, BLACK);
      }
      razv--;
      if (razv == 255) {
        razv = 0;
      }
    }
  }
  else {
    if (digitalRead(levo) == HIGH) {
      int flag = 0;
      delay(50);
      if (fullDisp == 0) {
        while (digitalRead(levo) == HIGH) {
          if (digitalRead(ok) == HIGH) {
            IzmHz();
            tft.setRotation(0);
            tft.fillRect(45, 60, 190, 260, BLACK);
            MenuT();
            st = 1;
            Graf();
            flag = 1;
          }
        }
      }
      if (flag == 0) {
        setka2 = !setka2;
        if (setka2 == 1) {
          Setka2();
        }
        else {
          if (fullDisp == 0) {
            tft.setRotation(0);
            tft.fillRect(45, 60, 190, 260, BLACK);
          }
          else {
            tft.setRotation(0);
            tft.fillRect(9, 10, 230, 310, BLACK);
          }
          st = 1;
          Graf();
        }
        delay(300);
      }
    }
  }
}

void MenuT() { //перерисовка нижнего меню
  tft.setTextColor(RED);
  tft.setTextSize(2);
  tft.setRotation(0);
  tft.fillRect(0, 0, 20, 340, BLACK); //стирание поля меню низ
  t_dell=0;
  tft.setRotation(1);
  tft.setCursor(0, 220);
  if (razv < 7) {
    tft.print(t_del);
  }
  if (razv == 7) {
    tft.print(t_del / 2);
  }
  if (razv == 8) {
    tft.print(t_del / 3);
  }
  if (razv == 9) {
    tft.print(t_del / 4);
  }
  if (razv == 10) {
    tft.print(t_del / 5);
  }
  tft.print("us ");
  tft.print("Vm=");
  if (opornoe == 0) {
    tft.print(Vmax * 1.1 / 255);
  }
  if (opornoe == 1) {
    tft.print(Vmax * 5.3 / 255);
  }
  tft.setTextSize(1);
  tft.setCursor(180, 230);
  tft.print(utf8rus("Бат="));
  tft.print(Vakb);
  tft.setCursor(180, 220);
  tft.print(utf8rus("Кзап="));
  tft.print(duty);
  tft.print("%");
  tft.setTextSize(2);
  tft.setCursor(240, 220);
  tft.print(utf8rus("Разв"));
  tft.print(razv);
  if (setka == 1) {
    tft.print(" ");
    tft.print("S");
  }
}
void Opornoe() {
  if (opornoe == 0) {
    ADMUX = 0b11100011; //выбор внутреннего опорного 1,1В
  }
  if (opornoe == 1) {
    ADMUX = 0b01100011; //Выбор внешнего опорного
  }
  if (fullDisp == 0) {
    tft.setRotation(0);
    tft.fillRect(65, 0, 170, 50, BLACK);//стирание напряжения
    tft.fillRect(45, 60, 190, 260, BLACK);//стиране поля графика
    tft.setRotation(1);
    tft.setTextColor(RED);
    tft.setTextSize(2);
    if (opornoe == 0) {
      tft.setCursor(30, 190); tft.println("0");
      tft.setCursor(0, 146); tft.println("0.22");
      tft.setCursor(0, 112); tft.println("0.44");
      tft.setCursor(0, 78); tft.println("0.66");
      tft.setCursor(0, 44); tft.println("0.88");
      tft.setCursor(0, 10); tft.println("1.1V");
    }
    if (opornoe == 1) {
      tft.setCursor(30, 190); tft.println("0");
      tft.setCursor(0, 146); tft.println("1.00");
      tft.setCursor(0, 112); tft.println("2.00");
      tft.setCursor(0, 78); tft.println("3.00");
      tft.setCursor(0, 44); tft.println("4.00");
      tft.setCursor(0, 10); tft.println("5.0V");
    }
    delay(100);
  }
}

void Graf() {
  if (paus == 0) {
    if (fullDisp == 0) {
      MenuT();
      if (setka2 == 1) {
        Setka2();
      }
      int z = 0;
      if (razv < 7) {
        z = 1;
      }
      if (razv == 7) {
        z = 2;
      }
      if (razv == 8) {
        z = 3;
      }
      if (razv == 9) {
        z = 4;
      }
      if (razv == 10) {
        z = 5;
      }
      x = 60;
      tft.setRotation(1);
      for (int y = 0; y < 260 || x < 320; y++) {
        x = x + z;
        tft.drawLine(x, massDEL[y], x + 1, massDEL[y + 1], BLACK); //стираем график
        tft.drawLine(x, mass[y], x + 1, mass[y + 1], GREEN); //график

      }
      for (int i = 0; i < 500; i++) {
        massDEL[i] = mass[i];
      }
    }
    if (fullDisp == 1) {
      if (setka2 == 1) {
        Setka2();
      }
      x = 10;
      int z = 0;
      if (razv < 7) {
        z = 1;
      }
      if (razv == 7) {
        z = 2;
      }
      if (razv == 8) {
        z = 3;
      }
      if (razv == 9) {
        z = 4;
      }
      if (razv == 10) {
        z = 5;
      }
      tft.setRotation(1);
      for (int y = 0; y < 310; y++) {
        x = x + z;
        tft.drawLine(x, massDEL[y], x + 1, massDEL[y + 1], BLACK); //стираем график
        tft.drawLine(x, mass[y], x + 1, mass[y + 1], GREEN); //график

      }
      for (int i = 0; i < 500; i++) {
        massDEL[i] = mass[i];
      }
    }
  }
  if (paus == 1) { //режим паузы
    if (setka2 == 1) {
      Setka2();
    }
    if (fullDisp == 0) {
      if (digitalRead(pravo) == HIGH || st == 1) { //листаем
        Zamer();
        st = 0;
        tft.setRotation(0);
        tft.fillRect(45, 60, 190, 260, BLACK);//стиране графика
        x = 60;
        int z = 0;
        if (razv < 7) {
          z = 1;
        }
        if (razv == 7) {
          z = 2;
        }
        if (razv == 8) {
          z = 3;
        }
        if (razv == 9) {
          z = 4;
        }
        if (razv == 10) {
          z = 5;
        }
        tft.setRotation(1);
        for (int y = 0; y < 260; y++) {
          x = x + z;
          tft.drawLine(x, mass[y], x + 1, mass[y + 1], GREEN); //график
        }
        for (int i = 0; i < 500; i++) {
          massDEL[i] = mass[i];
        }
        MenuT();
      }
    }
    if (fullDisp == 1) {
      if (digitalRead(pravo) == HIGH || st == 1) { //листаем
        Zamer();
        st = 0;
        tft.setRotation(0);
        tft.fillRect(9, 10, 230, 310, BLACK);//стиране графика
        x = 10;
        int z = 0;
        if (razv < 7) {
          z = 1;
        }
        if (razv == 7) {
          z = 2;
        }
        if (razv == 8) {
          z = 3;
        }
        if (razv == 9) {
          z = 4;
        }
        if (razv == 10) {
          z = 5;
        }
        tft.setRotation(1);
        for (int y = 0; y < 310; y++) {
          x = x + z;
          tft.drawLine(x, mass[y], x + 1, mass[y + 1], GREEN); //график
        }
        for (int i = 0; i < 500; i++) {
          massDEL[i] = mass[i];
        }
      }
    }
  }
}
void Setka1() {
  tft.setRotation(0);
  tft.fillRect(0, 0, 240, 360, BLACK);
  if (fullDisp == 0) {
    //ось напряжения##########################################
    tft.drawFastHLine(44, 60, 185, BLUE); tft.drawFastHLine(44, 59, 185, BLUE); tft.drawFastHLine(44, 58, 185, BLUE);
    tft.drawFastVLine(50, 50, 10, BLUE); tft.drawFastVLine(84, 50, 10, BLUE); tft.drawFastVLine(118, 50, 10, BLUE);
    tft.drawFastVLine(152, 50, 10, BLUE); tft.drawFastVLine(186, 50, 10, BLUE); tft.drawFastVLine(220, 50, 10, BLUE);
    //ось времени#############################################
    tft.drawFastVLine(44, 60, 270, RED); tft.drawFastVLine(43, 60, 270, RED); tft.drawFastVLine(42, 60, 270, RED);
    tft.drawFastHLine(35, 60, 10, RED); tft.drawFastHLine(35, 85, 10, RED); tft.drawFastHLine(35, 110, 10, RED); tft.drawFastHLine(35, 135, 10, RED);
    tft.drawFastHLine(35, 160, 10, RED); tft.drawFastHLine(35, 185, 10, RED); tft.drawFastHLine(35, 210, 10, RED); tft.drawFastHLine(35, 235, 10, RED);
    tft.drawFastHLine(35, 260, 10, RED); tft.drawFastHLine(35, 285, 10, RED); tft.drawFastHLine(35, 310, 10, RED);
    //ось времени#############################################
  }
  if (fullDisp == 1) {
    tft.setRotation(0);
    //ось напряжения##########################################
    tft.drawFastHLine(0, 0, 240, BLUE); tft.drawFastHLine(0, 1, 240, BLUE); tft.drawFastHLine(0, 2, 240, BLUE);
    tft.drawFastVLine(10, 0, 10, BLUE); tft.drawFastVLine(51, 0, 10, BLUE); tft.drawFastVLine(93, 0, 10, BLUE);
    tft.drawFastVLine(134, 0, 10, BLUE); tft.drawFastVLine(176, 0, 10, BLUE); tft.drawFastVLine(217, 0, 10, BLUE);
    //ось времени#############################################
    tft.drawFastVLine(0, 0, 320, RED); tft.drawFastVLine(1, 0, 320, RED); tft.drawFastVLine(2, 0, 320, RED);
    tft.drawFastHLine(0, 10, 10, RED); tft.drawFastHLine(0, 35, 10, RED);
    tft.drawFastHLine(0, 60, 10, RED); tft.drawFastHLine(0, 85, 10, RED); tft.drawFastHLine(0, 110, 10, RED); tft.drawFastHLine(0, 135, 10, RED);
    tft.drawFastHLine(0, 160, 10, RED); tft.drawFastHLine(0, 185, 10, RED); tft.drawFastHLine(0, 210, 10, RED); tft.drawFastHLine(0, 235, 10, RED);
    tft.drawFastHLine(0, 260, 10, RED); tft.drawFastHLine(0, 285, 10, RED); tft.drawFastHLine(0, 310, 10, RED);
    //ось времени#############################################
  }
}
void Setka2 () {
  if (fullDisp == 0) {
    tft.setRotation(0);
    tft.drawFastHLine(44, 310, 185, GREY);
    tft.drawFastHLine(44, 285, 185, GREY);
    tft.drawFastHLine(44, 260, 185, GREY);
    tft.drawFastHLine(44, 235, 185, GREY);
    tft.drawFastHLine(44, 210, 185, GREY);
    tft.drawFastHLine(44, 185, 185, GREY);
    tft.drawFastHLine(44, 160, 185, GREY);
    tft.drawFastHLine(44, 135, 185, GREY);
    tft.drawFastHLine(44, 110, 185, GREY);
    tft.drawFastHLine(44, 85, 185, GREY);
  }
  if (fullDisp == 1) {
    tft.setRotation(0);
    tft.drawFastHLine(10, 310, 220, GREY);
    tft.drawFastHLine(10, 285, 220, GREY);
    tft.drawFastHLine(10, 260, 220, GREY);
    tft.drawFastHLine(10, 235, 220, GREY);
    tft.drawFastHLine(10, 210, 220, GREY);
    tft.drawFastHLine(10, 185, 220, GREY);
    tft.drawFastHLine(10, 160, 220, GREY);
    tft.drawFastHLine(10, 135, 220, GREY);
    tft.drawFastHLine(10, 110, 220, GREY);
    tft.drawFastHLine(10, 85, 220, GREY);
    tft.drawFastHLine(10, 60, 220, GREY);
    tft.drawFastHLine(10, 35, 220, GREY);
  }
}
void IzmHz() {
  delay(200);
  tft.setTextColor(RED);
  tft.setTextSize(2);
  tft.setRotation(0);
  tft.fillRect(0, 0, 20, 340, BLACK); //стирание поля меню низ
  tft.setRotation(1);
  tft.setCursor(0, 220);
  int z = 0;
  if (razv < 7) {
    z = 1;
    tft.print(t_del);
  }
  if (razv == 7) {
    z = 2;
    tft.print(t_del / 2);
  }
  if (razv == 8) {
    z = 3;
    tft.print(t_del / 3);
  }
  if (razv == 9) {
    z = 4;
    tft.print(t_del / 4);
  }
  if (razv == 10) {
    z = 5;
    tft.print(t_del / 5);
  }
  tft.print("us ");
  int x1 = 0;
  int xIzm1 = 60;
  int xIzm2 = 0;
  int xIzm1del = 60;
  int xIzm2del = 0;
  int i = 0;
  int Speed = 0;
  while (i < 2) {
    if (digitalRead(ok) == HIGH) {
      i++;
      if (i == 1) {
        xIzm2 = xIzm1;
      }
      delay(300);
    }
    if (i == 0) {
      if (digitalRead(levo) == HIGH) {
        Speed++;
        xIzm1 -= Speed;
        if (xIzm1 < 60) {
          xIzm1 = 60;
        }
      }
      if (digitalRead(pravo) == HIGH) {
        Speed++;
        xIzm1 += Speed;
        if (xIzm1 > 320) {
          xIzm1 = 320;
        }
      }
    }
    else {
      if (digitalRead(levo) == HIGH) {
        Speed++;
        xIzm2 -= Speed;
        if (xIzm2 < xIzm1) {
          xIzm2 = xIzm1;
        }
      }
      if (digitalRead(pravo) == HIGH) {
        Speed++;
        xIzm2 += Speed;
        if (xIzm2 > 320) {
          xIzm2 = 320;
        }
      }
    }
    if (digitalRead(pravo) == LOW && digitalRead(levo) == LOW) {
      Speed = 0;
    }
    tft.setRotation(1);
    x = 60;
    for (int y = 0; y < 260; y++) {
      x = x + z;
      tft.drawLine(x, massDEL[y], x + 1, massDEL[y + 1], BLACK); //стираем график
      tft.drawLine(x, mass[y], x + 1, mass[y + 1], GREEN); //график
    }
    tft.setRotation(1);
    tft.drawFastVLine(xIzm1del, 10, 185, BLACK);
    tft.drawFastVLine(xIzm1, 10, 185, GREY);
    xIzm1del = xIzm1;
    if (i == 1) {
      tft.drawFastVLine(xIzm2del, 10, 185, BLACK);
      tft.drawFastVLine(xIzm2, 10, 185, GREY);
      xIzm2del = xIzm2;
      tft.fillRect(100, 220, 200, 20, BLACK);
      tft.setCursor(100, 220);
      tft.print(1000000 / ((((xIzm2 - xIzm1)*t) / 501) / z));
      tft.print("Hz");
    }
  }
}
/////////////////////Коэффициент заполнения
uint32_t asm_func(uint8_t flag){
asm volatile (         
"cli"                    "\n\t"
"mov r21,%0"    "\n\t" // флаг что считывать
//конфигурация таймеров
"ldi r18,0x83"            "\n\t" // GTCCR=0x83
"out 0x23,r18"            "\n\t" // GTCCR=0x83
"sts 0x80,__zero_reg__"   "\n\t" // TCCR1A=0
"ldi r19,0x4"             "\n\t" 
"sts 0x81,r19"            "\n\t" // TCCR1B=1<<CS12
"sts 0x85, __zero_reg__"  "\n\t"//TCNT1L=0
"sts 0x84, __zero_reg__"  "\n\t"//TCNT1H=0
"sts 0xB0,__zero_reg__"   "\n\t" // TCCR2A=0
"ldi r20,0x1"             "\n\t" 
"sts 0xB1,r20"            "\n\t" // TCCR2B=1<<CS20
"sts 0xB2,__zero_reg__"   "\n\t" // TCNT2=0
"sts 0x70,__zero_reg__"   "\n\t" // TIMSK2=0
// пройти если ноль
"wait_begin:"             "\n\t"
"sbic 0x9,5"             "\n\t"  // Порт D5
"rjmp wait_begin"         "\n\t"
// пройти если единица -> первый импульс
"wait_start:"             "\n\t"
"sbis 0x9,5"              "\n\t"
"rjmp wait_start"         "\n\t"
"sts 0x43,__zero_reg__"   "\n\t" // GTCCR=0 старт синхра
 // импульс пошёл, ждём ноль
"wait_pause:"             "\n\t"
"sbic 0x9,5"             "\n\t"
"rjmp wait_pause"         "\n\t"
"cpi r21,__zero_reg__"    "\n\t" //
"brne duty"  "\n\t"
// импульс кончился, ждём  конца периода (единицу)
"wait_end:"               "\n\t"
"sbis 0x9,5"              "\n\t"
"rjmp wait_end"           "\n\t"
"duty:"                   "\n\t"
"ldi r18,0x00"            "\n\t" // GTCCR=0x00
"out 0x23,r18"            "\n\t" // GTCCR=0x00 старт таймеры
//вывод 3х байт
"lds r22, 0xB2"           "\n\t" //  tctn2  0 байт
"lds r23, 0x84"           "\n\t"  // TCNT1L 1 байт
"lds r24, 0x85"           "\n\t"  // TCNT1H 2 байт
"lds r25, __zero_reg__"   "\n\t" // пустой  3 байт
"sei"                     "\n\t"
::"r" (flag): ); }



/////////////////////Коэффициент заполнения

 

240265
240265 аватар
Offline
Зарегистрирован: 12.08.2015

sirota пишет:

240265, а к какому это скетчу?

Еще как я понял PWM эта та либа? http://arduino.ru/forum/programmirovanie/pwm-biblioteka-shim-arduino

Ну и адафруит https://github.com/adafruit/Adafruit-ST7735-Library Выкладывайте сразу линки на нестандартные библы.

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

Во Вы спросили. где брал, полгода прошло.

Саму ардуину и библиотеки отсюда http://srukami.inf.ua/pultoscop_v25110.html  и http://srukami.inf.ua/pultoscop_v2.html . Русский шрифт находится в Adafruit GFX. А под ST 7735 на сайте  Adafruit посмотрите.

Или в гугле.

А к какому скетчу посмотрите несколькими постами выше. А лучше всю ветку перечитайте ! Я им больше не занимаюсь !

240265
240265 аватар
Offline
Зарегистрирован: 12.08.2015

http://arduino.ru/forum/proekty/pultoskop-na-arduino-27mgts?page=46#comment-249660

И нету там нестандартных библиотек .

sirota
Offline
Зарегистрирован: 18.08.2015

240265 пишет:

http://arduino.ru/forum/proekty/pultoskop-na-arduino-27mgts?page=46#comment-249660

И нету там нестандартных библиотек .

#include <Adafruit_GFX.h>    // Core graphics library
010 #include <Adafruit_ST7735.h> // Hardware-specific library
   
012 #include <FreqCount.h>
013 #include <PWM.h>

Эти все не идут комплектом с дуней. Принято указвать в комментах линки от куда бралась библа и ее версия.

 

240265 пишет:

А к какому скетчу посмотрите несколькими постами выше. А лучше всю ветку перечитайте ! Я им больше не занимаюсь !

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

А так спасибо. Как я понимаю без ОУ - это самая-самая версия?

240265
240265 аватар
Offline
Зарегистрирован: 12.08.2015

Входная часть на Ваше усмотрение.

Скетч переделывался из LS020.

Но в принипе это смотрелка. Посерьезней уже навалом простых проектов.

Bosch
Offline
Зарегистрирован: 25.11.2016

У меня не заработал русский шрифт