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

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

Goblin пишет:

Други, помогите повернуть изображение 5110 на 180 гр. Функция Adafruit display.setRotation() при значениях 0 или 2 (0 гр. или 270 гр.) ничего не делает. при значениях 1 или 3 получается вот так

Я у себя пробовал не прокатило,может у вас заработает зеркально:

В файле Adafruit_PCD8544.h нижняя строчка

#define PCD8544_POWERDOWN 0x04
#define PCD8544_ENTRYMODE 0x02
#define PCD8544_EXTENDEDINSTRUCTION 0x01
#define PCD8544_ROTATION 0x10

В файле Adafruit_PCD8544.cpp 2 нижнии строчки в функции begin();

  // normal mode
  command(PCD8544_FUNCTIONSET);
  // Set display to Normal
  command(PCD8544_DISPLAYCONTROL | PCD8544_DISPLAYNORMAL);
  // Rotation screen on 180 X-coordinate
  command( PCD8544_FUNCTIONSET | PCD8544_ROTATION );

Инфо отсюда http://www.radiokot.ru/articles/29/ , 4-й и 5-й биты Funсtion_set ,только непонятно интерпритация в 0 или 1 , в пример выставил 5-й бит.

 

 

 

Sasha80
Offline
Зарегистрирован: 18.01.2016

Здравствуйте уважаемые форумчане. Довно хотел собрать частотомер на ардуино, а тут аж осцилограф! Спасибо автору темы, все достаточно подробно. Но перед тем как собрать устройство подскажите пожалуйста

1. Тут писпли что на стандартном кварце 16Мгц измеряемая частота порядка 2Мгц. У меня на данный момент лежит без дела ПРО МИНИ 328 версия 3в 8Мгц. Подойдет ли она без модернизации и каков у нее потолок частоты будет?

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

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

Спасибо!!!

 

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

Sasha80 пишет:

Здравствуйте уважаемые форумчане. Довно хотел собрать частотомер на ардуино, а тут аж осцилограф! Спасибо автору темы, все достаточно подробно. Но перед тем как собрать устройство подскажите пожалуйста

1. Тут писпли что на стандартном кварце 16Мгц измеряемая частота порядка 2Мгц. У меня на данный момент лежит без дела ПРО МИНИ 328 версия 3в 8Мгц. Подойдет ли она без модернизации и каков у нее потолок частоты будет?

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

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

Спасибо!!!

 

8 Мгц кварц стоит там потому что питание скорее всего вашей ардуины 3.3В если поменять стабилизатор на 5В, поставить кварц на 16Мгц и перепрошить бутлоадер у вас будет ардуина на 16 Мгц)

Sasha80
Offline
Зарегистрирован: 18.01.2016

Спасибо, но вопрос был всетаки возможно ли использовать эту прошку без переделок и на что она будет способна :)

Sasha80
Offline
Зарегистрирован: 18.01.2016

Честно говоря вопрос 2 и 3 интересуют больше!

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

Sasha80 пишет:

Спасибо, но вопрос был всетаки возможно ли использовать эту прошку без переделок и на что она будет способна :)

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

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

Sasha80 пишет:

Здравствуйте уважаемые форумчане. Довно хотел собрать частотомер на ардуино, а тут аж осцилограф! Спасибо автору темы, все достаточно подробно. Но перед тем как собрать устройство подскажите пожалуйста

1. Тут писпли что на стандартном кварце 16Мгц измеряемая частота порядка 2Мгц. У меня на данный момент лежит без дела ПРО МИНИ 328 версия 3в 8Мгц. Подойдет ли она без модернизации и каков у нее потолок частоты будет?

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

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

Спасибо!!!

Привет.

2---100КГц слишком круто для него, он с кварцем 16МГц оцифровывает со скоростью 327КГц и получится вы увидите сигнал построенный по трем точкам((  сигнал до 30КГц покажет сносно.

3---мерить индуктивности и емкости непланирую, так как используюотлиный прибор разработанный нашим коллегой(коллегами) ТранзисторТестер.

Sasha80
Offline
Зарегистрирован: 18.01.2016

Спасибо, значит для про мини 8МГц - все таки разгон и перепрошивка бутлодера, как советовал Xumuk пост #2203.  Кстати не подскажете адрес ветки где обсуждается ТранзисторТестер.

Ваш пост #2184 С кварцем 16МГц частотомер пультоскопа корректно измеряет до 6МГц какой ардуино касается?

Ну и про  "коэффициент заполнения"  в %.  сможете что нибуд сказать?

Спасибо, хочу все моменты просто для себя прояснить!

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

 Sasha80 http://arduino.ru/forum/proekty/transistor-tester-arduino вот тема про транзистор тестер

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

Sasha80 пишет:

Спасибо, значит для про мини 8МГц - все таки разгон и перепрошивка бутлодера, как советовал Xumuk пост #2203.  Кстати не подскажете адрес ветки где обсуждается ТранзисторТестер.

Ваш пост #2184 С кварцем 16МГц частотомер пультоскопа корректно измеряет до 6МГц какой ардуино касается?

Ну и про  "коэффициент заполнения"  в %.  сможете что нибуд сказать?

Спасибо, хочу все моменты просто для себя прояснить!

---Любой с МК Atmega328 и кварцем 16МГц и более.

---процент заполнения он не считает. только визуально можно оценить.

Sasha80
Offline
Зарегистрирован: 18.01.2016

Ребята, спасибо. Буду ваять!

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

bodriy2014 пишет:

Sasha80 пишет:

Спасибо, значит для про мини 8МГц - все таки разгон и перепрошивка бутлодера, как советовал Xumuk пост #2203.  Кстати не подскажете адрес ветки где обсуждается ТранзисторТестер.

Ваш пост #2184 С кварцем 16МГц частотомер пультоскопа корректно измеряет до 6МГц какой ардуино касается?

Ну и про  "коэффициент заполнения"  в %.  сможете что нибуд сказать?

Спасибо, хочу все моменты просто для себя прояснить!

---Любой с МК Atmega328 и кварцем 16МГц и более.

---процент заполнения он не считает. только визуально можно оценить.

а в новой прошивке какие идеи хотели воплотить? Просто интересно=))) второй дисплей едет с китая 5110 ради такого заказал))) и еще вопрос, а вообще это сильно сложно вкрячить скважность чтобы показывал?

Goblin
Goblin аватар
Offline
Зарегистрирован: 27.07.2014

Не дождался ответов (подумал испугались аватара ;), переклеил и перепаял.  Спасибо zz11ss за совет. Будет время, попробую, чисто из спортивного интереса.

vasska пишет:

помоему у вас смещение в лево.испавте или нач. координаты или координаты раб поля

Это когда setRotation() задаешь поворот на 90° или 270°.

Если можно, еще вопрос всем Гуру. Кто-то здесь уже подымал вопрос по поводу использования экрана JLX12864G-086 https://ru.aliexpress.com/item/12864G-086-P-12864-LCD-Module-COG-3-3V-Or...

Вроде, как на контроллере ST7565R. Очень хочется собрать ослика на нем. В отзывах на Али видел "Подошел для ремонта Транзистор Тестера MG328". Наткнулся на статью http://alex-exe.ru/radio/stm32/connect-cog-lcd-st7565r/ , но там человек прикручивает к STM32.

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

Xumuk пишет:

а в новой прошивке какие идеи хотели воплотить? Просто интересно=))) второй дисплей едет с китая 5110 ради такого заказал))) и еще вопрос, а вообще это сильно сложно вкрячить скважность чтобы показывал?

-целый список набросал, озвучивать пока не сделал не буду.

-Но математики добавлю.

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

Xumuk пишет:

а в новой прошивке какие идеи хотели воплотить? Просто интересно=))) второй дисплей едет с китая 5110 ради такого заказал))) и еще вопрос, а вообще это сильно сложно вкрячить скважность чтобы показывал?

Пожалуйста может уже кто делал для дисплея 1.8" 128X160 SPI на ST7735 ну и для себя сделал уже: в меню автоматом через 10 сек в текущий выбор, запоминает в осциллографе текущие настройки в EEPROM и при включении восстанавливает, у меня делитель 1:15 поэтому в меню добавил выбор множителя x1 или x3 для вольтметра, для этого удалил правда терминал-памяти для данных не хватало!

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

Хочу обратится с вопросом к fly245, есть ли у Вас чем поделится что я спрашивал в этой ветке (пост #401)?
Или просто краткое резюме, чем те эксперименты закончились.
Спасибо! :)
http://arduino.ru/forum/proekty/mini-ostsillograf-arduino-na-lcd-5110?pa...

serglt
Offline
Зарегистрирован: 23.12.2016

Всем привет, ожидаю железко для повторения данного изделия, я новичек, в глаза не видел еще ниразу ардуинку :), сам по профессии программист. Интересует такой вопрос, а почему не используется обработчик прерывания от ацп вместо цикла loop? Может кто то уже пробовал и это не актуально? Просто смотрите вот основной код замера
 

      for(byte i=0;i<255;i++){ 
          while ((ADCSRA & 0x10)==0);
          ADCSRA|=0x10;
          mass[i]=ADCH;
      }

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

Главный вопрос вот в чем. Почему нельзя использовать вместо loop прерывание типа
 

ISR(ADC_vect) {
	if (counter < 255) {
		mas[++counter] = ADCL + ADCH << 8;
	} else {
		// прорисовка
		// Код остального
		counter = -1; // Погнали опять в заполнение буфера
	}
}

Что мы тут получаем: ниодного цикла, одно условие, один инкремент для наполнения, скорость выполнения = скорость ацп, сокращается количество операций, ну и

while ((ADCSRA & 0x10)==0);

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

Вот человек замеры делал http://robotosha.ru/arduino/analog-measurements-arduino.html
Было бы железо попробовал
Заранее благодарен за разъяснения, не судите строго если чего то не знаю

serglt
Offline
Зарегистрирован: 23.12.2016

Да кстати по битым данным вот что в исходниках кода wiring_analog.c

// we have to read ADCL first; doing so locks both ADCL
// and ADCH until ADCH is read.  reading ADCL second would
// cause the results of each conversion to be discarded,
// as ADCL and ADCH would be locked when it completed.
low  = ADCL;
high = ADCH;
return (high << 8) | low;

Очередность получения байтов важна

serglt
Offline
Зарегистрирован: 23.12.2016

Все нормально, нету буфера никакого, можно пробовать.
Либо наполнение делать только прерываниями
А цикл loop оставить, просто сделать
volatile bite counter = -1;
Для начала прорисовки счетчик = 255, для начала наполнения счетчик < 255

 

serglt
Offline
Зарегистрирован: 23.12.2016

Вопрос снят, будет медленнее :)

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

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

1: в скетче писать меню справо налево (Пила->алиП)

2: в glcdfont.c букву например 0x7F, 0x41, 0x41, 0x22, 0x1C,// D 0x44 преобразовать в 0x1C, 0x22, 0x41, 0x41, 0x7F,// D 0x44 зеркально

3: ну и расчет например напряжений:

   float tmp=0;
   long TMP=0;
#####
#####
    display.print("В");
    tmp=(analogRead(akb)*5.0/1024);
    TMP=round(tmp*10);
    display.print(TMP%10);display.print(".");display.print(TMP/10);
    display.print("=яератаБ");

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

 

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

zz11ss пишет:

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

1: в скетче писать меню справо налево (Пила->алиП)

2: в glcdfont.c букву например 0x7F, 0x41, 0x41, 0x22, 0x1C,// D 0x44 преобразовать в 0x1C, 0x22, 0x41, 0x41, 0x7F,// D 0x44 зеркально

3: ну и расчет например напряжений:

   float tmp=0;
   long TMP=0;
#####
#####
    display.print("В");
    tmp=(analogRead(akb)*5.0/1024);
    TMP=round(tmp*10);
    display.print(TMP%10);display.print(".");display.print(TMP/10);
    display.print("=яератаБ");

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

Проблема у вас специфическая.

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

display.print(tmp,0);

 

Русл@н
Offline
Зарегистрирован: 14.04.2016

-

Sasha80
Offline
Зарегистрирован: 18.01.2016

Ребята, вопрос по отображению значения питания. Вот в эту строчку нужно вписывать значение напряжения померенного мультиметром или нет? 5.0 

display.print(analogRead(akb)*5.0/1024);

От куда берется значение 5.0/1024?

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

Sasha80 пишет:

Ребята, вопрос по отображению значения питания. Вот в эту строчку нужно вписывать значение напряжения померенного мультиметром или нет? 5.0 

display.print(analogRead(akb)*5.0/1024);

От куда берется значение 5.0/1024?

это чтобы перевести сразу в вольты, т.к. analogRead(akb) возвращает нам значение от 0 до 1024, и на дисплее вместо вольтажа будет билибирда, а так мы умножаем на коэфициент типо, который переводит значение ацп в вольты, сорри не умею грамотно обьяснять)

Sasha80
Offline
Зарегистрирован: 18.01.2016

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

Sasha80
Offline
Зарегистрирован: 18.01.2016

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

Подключил Vcc на А3 через резистор 10к  (временно про мини 3,3в)

В сетче так: 

#define akb A3  //любой свободный аналоговый пин для измерения напряжения АКБ

float VCC=3.35;  //напряжение питания, меряем мультиметром 

 

В главном меню показывает 5.0 В.   При измерении мультиметром на ноге Vcc - 3.35v

 

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

Sasha80 пишет:

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

Подключил Vcc на А3 через резистор 10к  (временно про мини 3,3в)

В сетче так: 

#define akb A3  //любой свободный аналоговый пин для измерения напряжения АКБ

float VCC=3.35;  //напряжение питания, меряем мультиметром 

 

В главном меню показывает 5.0 В.   При измерении мультиметром на ноге Vcc - 3.35v

 


это все не для вас.
---у вас Ардуинка трехвольтовая и нужно будет подключать через делитель напряжения и формулу править. и переменную VCC изменить на 3.35
---и значение кварца вместо 16 вписаиь 8

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

Попробуйте так:

float VCC=3.35;  //напряжение питания, меряем мультиметром 

####
####

display.print(analogRead(akb)*VCC/1024)

(5.0 это опорное напряжение,а у вас сейчас 3.3 ), только нужно менять в 4-х строчках меню!

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

zz11ss пишет:

Попробуйте так:

float VCC=3.35;  //напряжение питания, меряем мультиметром 

####
####

display.print(analogRead(akb)*VCC/1024)

(5.0 это опорное напряжение,а у вас сейчас 3.3 ), только нужно менять в 4-х строчках меню!


Это правильный совет.
Но напряжение заряженного литиевого АКБ 4.2В это больше чем опорное поэтому нужен делитель напояжения.

Sasha80
Offline
Зарегистрирован: 18.01.2016

Мой аккамулятор выдает 7.2в. А если ее питать от кренки 5 вольт напрямую через Vcc а не через RAV. В этом случае ардуинка будет от 5в питаться. Вопрос, нужны ли будут все эти правки и делители напряжений? 

volodya198024
Offline
Зарегистрирован: 26.12.2016

Уже хочу повторить ваш прибор. Очень он мне нравится.  Жду цветной  дисплей с китая. Но проблема заключается в другом, мне нужен вход внешней синхронизации или (синхронизоция от сети). Это для ремонта тиристорных преобразователей. С железом проблем нет, а вот с ПО полнонолие. Прибор я всёравно соберу очень он мне нравится. даже в таком виде. И работаю я на низких частотах. Но хотелось-бы дополнительный вход.  Десяти килограмовый СССР тяжело таскать за километр. А новый модный АКИП жалко. А сам собрал-бы с удовольствием такой прибор. (каробочка у меня уже есть). с уважением Володя.  

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

Sasha80 пишет:

Мой аккамулятор выдает 7.2в. А если ее питать от кренки 5 вольт напрямую через Vcc а не через RAV. В этом случае ардуинка будет от 5в питаться. Вопрос, нужны ли будут все эти правки и делители напряжений? 


Смело можно подавать на Vcc 5V , но чтоб мерить 7,2V все равно нужен делитель и правка кода.

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

Sasha80 пишет:

Мой аккамулятор выдает 7.2в. А если ее питать от кренки 5 вольт напрямую через Vcc а не через RAV. В этом случае ардуинка будет от 5в питаться. Вопрос, нужны ли будут все эти правки и делители напряжений? 


Смело можно подавать на Vcc 5V , но чтоб мерить 7,2V все равно нужен делитель и правка кода.

Sasha80
Offline
Зарегистрирован: 18.01.2016

Для "особо одаренных" повторите пожалуйста. При условии питания прошки от 7.2в через кренку 5в напрямую от Vcc, с  заменой кварца на 27МГц/

1. Править код, - это где?  

Только ли в этой строке? float VCC=3.35;  //напряжение питания, меряем мультиметром

Или еще где? Может еще куда советовал zz11ss в четыре строчки точное значение по мультиметру

display.print((analogRead(akb)*5.0/1024), 1);

2. Делитель, какоого номинала резисторы? Пойдут ли 5% погрешности? Куда поять ноги? 

Буду признателен за подробный ответ.

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

Sasha80 пишет:

Для "особо одаренных" повторите пожалуйста. При условии питания прошки от 7.2в через кренку 5в напрямую от Vcc, с  заменой кварца на 27МГц/

1. Править код, - это где?  

Только ли в этой строке? float VCC=3.35;  //напряжение питания, меряем мультиметром

Или еще где? Может еще куда советовал zz11ss в четыре строчки точное значение по мультиметру

display.print((analogRead(akb)*5.0/1024), 1);

2. Делитель, какоого номинала резисторы? Пойдут ли 5% погрешности? Куда поять ноги? 

Буду признателен за подробный ответ.


Я вам напишу что править и куда что припаять.
Но мне нужно чтоб вы мне сказали какие у вас резисторы будут в делителе, так как те что я вам напишу может у вас не быть. Точность резисторов не имеет значения так как все равно промеряем точно мультиметром.
Подбирайте делитель на резисторах так чтоб когда на делитель входило 8В с него выхдило 5В.
Жду номиналы резисторов.

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

Здравствуйте,решил собрать ваш пультоскоп,в наличии:

Дисплей 2.2 240*320 SPI TFT ili9341;

Arduino UNO;

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

Заранее спасибо.

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

Sasha80 пишет:

Буду признателен за подробный ответ.

можно собрать делитель на 2, например 2 резистора по 2кОм и величина опорного принять = 10, питание +5v

 
display.print(analogRead(akb)*10.0/1024)

 

 

Sasha80
Offline
Зарегистрирован: 18.01.2016

Благодарю zz11ss. Есть еще резисторы на 1К, 3,3К, 4,7К, 10К, Вопрос куда паять. Для точности нужно ли резисторы мультиметром замерить? Заодно подскажите про делитель на щуп (номиналы и куда паять?), вольт до 15 - 30. Спасибо! Поставил кренку. На микросхему приходит 5,05в.

 

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

Bosch пишет:

Здравствуйте,решил собрать ваш пультоскоп,в наличии:

Дисплей 2.2 240*320 SPI TFT ili9341;

Arduino UNO;

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

Заранее спасибо.

С этим дсплеем никто не делал. А править весь вывод на экран. Дофига где.

Sasha80
Offline
Зарегистрирован: 18.01.2016

Согласно совету zz11ss и изученному материалу о делителях напряжения получается вроде так. Вопрос такой - Оставлять ли в цепи резистор на 10К который указан в схеме (А5-АКБ) тут http://srukami.inf.ua/pultoscop_v25110.html 

Прошу сказать, правильна ли схема?

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

Sasha80 пишет:

....

Прошу сказать, правильна ли схема?

Привет схема правильная, но делитель на 2 как вы предлагаете подходит только если ваша Ардуино питается от 5В.

7,2В / 2 = 3,6В а это больше чем 3.3В как у человека выше.

И еще рекомендовал бы увеличить номинал резисторов так как через них будет утекать с АКБ 2мА с учетм что это будет круглосуточно, то ваш делитль выжрет АКБ.

После делителя можно напрямую заводить в ардуино.

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

Bosch пишет:

Здравствуйте,решил собрать ваш пультоскоп,в наличии:

Дисплей 2.2 240*320 SPI TFT ili9341;

Arduino UNO;

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

Заранее спасибо.

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

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

Sasha80 пишет:

Благодарю zz11ss. Есть еще резисторы на 1К, 3,3К, 4,7К, 10К, Вопрос куда паять. Для точности нужно ли резисторы мультиметром замерить? Заодно подскажите про делитель на щуп (номиналы и куда паять?), вольт до 15 - 30. Спасибо! Поставил кренку. На микросхему приходит 5,05в.

Отлично.

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

А я напишу что в скетче менять.

Для щупа принцып тот же.

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

Sasha80

скетч под ваш делитель и питание 5,05В

Отпишитесь когда зальете.

//Страница проэкта  http://srukami.inf.ua/pultoscop_v25110.html
#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 14//пин который управляет ключем питания
#define  timepowerON 50 //время удержания кнопки выключения
#define levo 13  //кнопка ЛЕВО(можно любой пин)
#define ok 12    //кнопка ОК(можно любой пин)
#define pravo 11 //кнопка ПРАВО(можно любой пин)
#define akb A5 //любой своюодный аналоговый пин для измерения напряжения АКБ 
#define overclock 16  //Частота на которой работает Ардуино 
Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 4, 3, 2);//пины к которым у вас подключен дисплей         
byte cont=52;//контрастность дисплея
byte SinU=30;   //уровень синхронизации 0 до 255 
int PWM = 128;//стартовое значение ШИМ от 0 до 255        
int32_t frequency = 500; //стартовое значение частоты в Гц
float VCC=5.05;  //напряжение питания, меряем мультиметром
//###########################################################
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(){
pinMode(A4,INPUT);
digitalWrite(OFF,HIGH);//включем питание 
//Serial.begin(9600);
display.begin();
display.setContrast(cont);  
while(digitalRead(ok)==LOW){  
/////////////////////////////////////////удержание кнопки отключения
if(digitalRead(power)==HIGH){powerON++;delay(10);}  
if(powerON>=timepowerON){digitalWrite(OFF,LOW);}///отключаем питание
/////////////////////////////////////////удержание кнопки отключения 
  if(pultoskop==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)*VCC/1024/3.13);
    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)*VCC/1024/3.13);
    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)*VCC/1024/3.13);
    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)*VCC/1024/3.13);
    display.print("В");   
    }
if(digitalRead(levo)==HIGH){delay(300);pultoskop=pultoskop+1;}
if(digitalRead(pravo)==HIGH){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)==HIGH){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)==HIGH){opornoe=!opornoe;}
    if(digitalRead(pravo)==HIGH){opornoe=!opornoe;}    
}
if(menu==1){
    display.setCursor(0,0);
    display.setTextColor( BLACK);
    if(opornoe==0){display.print("1.1");}
    if(opornoe==1){display.print(VCC,1);}
    display.setTextColor(WHITE, BLACK); // 'inverted' text 
    display.print(" ");
    display.print(razv);
    display.setTextColor( BLACK); // 'inverted' text
    display.print(" P");
    if(digitalRead(levo)==HIGH){razv=razv-1;if(razv==255){razv=0;}}
    if(digitalRead(pravo)==HIGH){razv=razv+1;if(razv==9){razv=8;}}
}
if(menu==2){
    display.setCursor(0,0);
    display.setTextColor( BLACK);
    if(opornoe==0){display.print("1.1");}
    if(opornoe==1){display.print(VCC,1);}
    display.print(" ");
    display.print(razv);
    display.setTextColor(WHITE, BLACK); // 'inverted' text 
    display.print(" P");
    paus=1;
    if(digitalRead(levo)==HIGH){prokr=prokr-10;if(prokr<0){prokr=0;}}
    if(digitalRead(pravo)==HIGH){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)==HIGH){SinU=SinU-20;if(SinU<20){SinU=20;}}
    if(digitalRead(pravo)==HIGH){SinU=SinU+20;if(SinU>230){SinU=230;}}   
    display.fillCircle(80,47-SinU/7, 5, BLACK);
    display.fillCircle(80,47-SinU/7, 2, WHITE); 
}
if(digitalRead(ok)==HIGH){menu++;if(menu==4){menu=0;paus=0;}}//перебор меню
if (FreqCount.available()) { count = FreqCount.read();}//вывод частоты по готовности счетчика
//#######################################частоты сигнала
byte Frec1=0;
long Frec=0;
bool flagFrec1=0;
bool flagFrec2=0;
bool flagFrec3=0;
for(int y=1;y<255;y++){
  if(flagFrec1==0){if(mass[y]<SinU){flagFrec2=1;}}
  if(flagFrec1==0){if(flagFrec2==1){if(mass[y]>SinU){flagFrec1=1;Frec1=y;}}}
  if(flagFrec1==1){if(mass[y]<SinU){flagFrec3=1;}}
  if(flagFrec3==1){if(mass[y]>SinU){
  if (razv>=6){Frec=1000000/((y-Frec1-1)*3.27);}//delitel 4
  if (razv==5){Frec=1000000/((y-Frec1)*3.27)/2;}//delitel 8
  if (razv==4){Frec=1000000/((y-Frec1)*3.27)/4;}//delitel 16
  if (razv==3){Frec=1000000/((y-Frec1)*3.27)/8;}//delitel 32
  if (razv==2){Frec=1000000/((y-Frec1)*3.27)/16;}//delitel 64
  if (razv==2){Frec=1000000/((y-Frec1)*3.27)/32;}//delitel 128
  if (razv==1){Frec=1000000/((y-Frec1)*3.27)/32;}//delitel 128
  if (razv==0){Frec=1000000/((y-Frec1)*500);}//delitel 128
  flagFrec1=0;flagFrec3=0;}}}
//#######################################частоты сигнала
display.setTextColor( BLACK);
if(opornoe==1){
if((Vmax*VCC/255)>2.5){countX=count*(overclock/16.0);}
if((Vmax*VCC/255)<2.5){countX=Frec*(overclock/16.0);}}
if(opornoe==0){countX=Frec*(overclock/16.0);}
if(countX<1000){display.print(" ");display.print(countX);display.print("Hz");}
if(countX>1000){float countXK=countX/1000.0;display.print(countXK,1);display.print("KHz");}
if(opornoe==1){display.setCursor(0,40);display.setTextColor(BLACK);
display.print(Vmax*VCC/255,1);}
if(opornoe==0){display.setCursor(0,40);display.setTextColor(BLACK);
display.print(Vmax*1.1/255,1);}
display.print("V");
//#######################################отрисовка menu
delay(200);  
display.display();
}
if(pultoskop==1){Generator();}
if(pultoskop==2){DDSGenerator();}
if(pultoskop==3){TTL();}
}
//#######################################режим ренератора
void Generator(){
display.clearDisplay();  
if (flag==0){//флаг выборов режима настройки ШИМ или Частоты
            if(digitalRead(levo)==HIGH){
              frequency=frequency-mnog;
              if(frequency<0){frequency=0;}
              bool success = SetPinFrequencySafe(led, frequency);
              delay(3);//защита от дребезга 
            }
            if(digitalRead(pravo)==HIGH){
              frequency=frequency+mnog;
              bool success = SetPinFrequencySafe(led, frequency);
              delay(3);//защита от дребезга 
            }  
}
if (flag==1){//флаг выборов режима настройки ШИМ или Частоты
            if(digitalRead(levo)==HIGH){
              PWM=PWM-1;
              if(PWM<0){PWM=255;} 
              delay(3);//защита от дребезга
            
            }
            if(digitalRead(pravo)==HIGH){
              PWM=PWM+1;
              if(PWM>255){PWM=0;} 
              delay(3);//защита от дребезга 
            }  
}      
if(digitalRead(ok)==HIGH){//переключение разряда выбора частоты 
  delay(3);//защита от дребезга
  hag++;
  if(hag>=5){hag=0;}
} 
////////////
display.setTextSize(1);
display.setCursor(0,5);
display.print("PWM=");
display.print(PWM*100.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
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==LOW){
      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==LOW){
      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==LOW){
      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==LOW){
      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)==HIGH){speedTTL=speedTTL+100;}
if(digitalRead(levo)==HIGH){speedTTL=speedTTL-100;}
if(speedTTL<0){speedTTL=250000;}
if(speedTTL>250000){speedTTL=0;}
if(digitalRead(ok)==HIGH){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

 

Sasha80
Offline
Зарегистрирован: 18.01.2016

Делитель прикрутил. Номиналы резисторов 4.7К ровно и 9.92К. Выводит показания 0.85в. Напряжение на делителе 2,68в Заряженный аккумулятор 8,38в

Скетч залил свой, подправил вот эти строки 

display.print(analogRead(akb)*VCC/1024/3.13);

Кстати про скетч. Добавил возможность сохранения состояния фонарика и подсветки экрана после перезагрузки. Удобно светить на место платы и смотреть показаня. Вобщем идея pultoskope_5110_lexdi немного доработанная.

Все ли верно в скетче? почему обманывает в 10 раз. Может ли это быть связано с резистором в 10К который я убрал? Пост #2241

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

//--------------пользовательские настройки-----------------//
//###########################################################
// #define power 8 //пин который опрашивает кнопку включения
// #define OFF 14  //пин который управляет ключем питания
// #define  timepowerON 50 //время удержания кнопки выключения

Adafruit_PCD8544 display = Adafruit_PCD8544(2, 3, 4, 6, 7);//пины к которым у вас подключен дисплей 
#define overclock 8      //Частота на которой работает Ардуино  
#define levo   11        //кнопка ЛЕВО(можно любой пин)
#define ok     12        //кнопка ОК(можно любой пин)
#define pravo  13        //кнопка ПРАВО(можно любой пин)
#define ledPin 8         //выход на контакт фонарика
#define LCDPin A2        //выход на контакт подсветки LCD
#define akb A3           //любой свободный аналоговый пин для измерения напряжения АКБ через резистор 10К      
byte cont=55;            //контрастность дисплея
byte SinU=30;            //уровень синхронизации 0 до 255 
int PWM = 128;           //стартовое значение ШИМ от 0 до 255        
int32_t frequency = 500; //стартовое значение частоты в Гц
float VCC=5.05;           //напряжение питания, меряем мультиметром
//###########################################################

int d=0;
byte menuDDS=0; 
byte menuLight=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;
int prokr=0;

int LCDOnOff;
int LEDOnOff;


void setup(){
display.begin();
display.setContrast(cont);  

pinMode(LCDPin, OUTPUT);  // подсветка дисплея
pinMode(ledPin, OUTPUT);  // фонарик
     
//digitalWrite(OFF,HIGH);//включем питание 
//Serial.begin(9600);

while(digitalRead(ok)==LOW){  

LCDOnOff = EEPROM.read(0);
LEDOnOff = EEPROM.read(1);

if(LCDOnOff == 1){analogWrite(A2, 0);}
if(LCDOnOff == 0){analogWrite(A2, 255);}

if(LEDOnOff == 1){digitalWrite(8, HIGH);}
if(LEDOnOff == 0){digitalWrite(8, LOW);}

/////////////////////////////////////////удержание кнопки отключения
//if(digitalRead(power)==HIGH){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)*VCC/1024/3.13);
    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)*VCC/1024/3.13);
    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)*VCC/1024/3.13);
    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)*VCC/1024/3.13);
    display.print(" В"); 
    }
if(digitalRead(pravo)==HIGH){delay(300);pultoskop=pultoskop-1;}
 //if(pultoskop<0){pultoskop=3;}
if(digitalRead(levo)==HIGH){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() {
LCDOnOff = EEPROM.read(0);
LEDOnOff = EEPROM.read(1);

if(LCDOnOff == 1){analogWrite(A2, 0);}
if(LCDOnOff == 0){analogWrite(A2, 255);}

if(LEDOnOff == 1){digitalWrite(8, HIGH);}
if(LEDOnOff == 0){digitalWrite(8, LOW);}
      
/////////////////////////////////////////удержание кнопки отключения
//if(digitalRead(power)==HIGH){powerON++;delay(10);}  
//if(powerON>=timepowerON){digitalWrite(OFF,LOW);}   //отключаем питание
/////////////////////////////////////////удержание кнопки отключения  
  
if(pultoskop==0){  
if(opornoe==0){ADMUX = 0b11100011;}//выбор внутреннего опорного 1,1В и номер аналогового входа (0b11100011, А3)(0b11100100, A4) (0b11100001, A1)
if(opornoe==1){ADMUX = 0b01100011;}//Выбор внешнего опорного (0b01100011, А3)(0b01100100, A4) (0b01100001, A1)
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)==HIGH) {opornoe=!opornoe;}
    if(digitalRead(pravo)==HIGH){opornoe=!opornoe;}    
}
if(menu==1){
    display.setCursor(0,0);
    display.setTextColor( BLACK);
    if(opornoe==0){display.print("1.1");}
    if(opornoe==1){display.print(VCC,1);}
    display.setTextColor(WHITE, BLACK); // 'inverted' text 
    display.print(" ");
    display.print(razv);
    display.setTextColor( BLACK); // 'inverted' text
    display.print(" P");
    if(digitalRead(levo)==HIGH){razv=razv-1;if(razv==255){razv=0;}}
    if(digitalRead(pravo)==HIGH){razv=razv+1;if(razv==9){razv=8;}}
}
if(menu==2){
    display.setCursor(0,0);
    display.setTextColor( BLACK);
    if(opornoe==0){display.print("1.1");}
    if(opornoe==1){display.print(VCC,1);}
    display.print(" ");
    display.print(razv);
    display.setTextColor(WHITE, BLACK); // 'inverted' text 
    display.print(" P");
    paus=1;
    if(digitalRead(levo)==HIGH){prokr=prokr-10;if(prokr<0){prokr=0;}}
    if(digitalRead(pravo)==HIGH){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)==HIGH){SinU=SinU-20;if(SinU<20){SinU=20;}}
    if(digitalRead(pravo)==HIGH){SinU=SinU+20;if(SinU>230){SinU=230;}}   
    display.fillCircle(80,47-SinU/7, 5, BLACK);
    display.fillCircle(80,47-SinU/7, 2, WHITE); 
}
if(digitalRead(ok)==HIGH){menu++;if(menu==4){menu=0;paus=0;}}//перебор меню
if (FreqCount.available()) { count = FreqCount.read();}      //вывод частоты по готовности счетчика
//#######################################частоты сигнала
byte Frec1=0;
long Frec=0;
bool flagFrec1=0;
bool flagFrec2=0;
bool flagFrec3=0;
for(int y=1;y<255;y++){
  if(flagFrec1==0){if(mass[y]<SinU){flagFrec2=1;}}
  if(flagFrec1==0){if(flagFrec2==1){if(mass[y]>SinU){flagFrec1=1;Frec1=y;}}}
  if(flagFrec1==1){if(mass[y]<SinU){flagFrec3=1;}}
  if(flagFrec3==1){if(mass[y]>SinU){
  if (razv>=6){Frec=1000000/((y-Frec1-1)*3.27);}//delitel 4
  if (razv==5){Frec=1000000/((y-Frec1)*3.27)/2;}//delitel 8
  if (razv==4){Frec=1000000/((y-Frec1)*3.27)/4;}//delitel 16
  if (razv==3){Frec=1000000/((y-Frec1)*3.27)/8;}//delitel 32
  if (razv==2){Frec=1000000/((y-Frec1)*3.27)/16;}//delitel 64
  if (razv==2){Frec=1000000/((y-Frec1)*3.27)/32;}//delitel 128
  if (razv==1){Frec=1000000/((y-Frec1)*3.27)/32;}//delitel 128
  if (razv==0){Frec=1000000/((y-Frec1)*500);}//delitel 128
  flagFrec1=0;flagFrec3=0;}}}
//#######################################частоты сигнала
display.setTextColor( BLACK);
if(opornoe==1){
if((Vmax*VCC/255)>2.5){countX=count*(overclock/16.0);}
if((Vmax*VCC/255)<2.5){countX=Frec*(overclock/16.0);}}
if(opornoe==0){countX=Frec*(overclock/16.0);}
if(countX<1000){display.print(" ");display.print(countX);display.print("Hz");}
if(countX>1000){float countXK=countX/1000.0;display.print(countXK,1);display.print("KHz");}
if(opornoe==1){display.setCursor(0,40);display.setTextColor(BLACK);
display.print(Vmax*VCC/255,1);}
if(opornoe==0){display.setCursor(0,40);display.setTextColor(BLACK);
display.print(Vmax*1.1/255,1);}
display.print("V");
//#######################################отрисовка menu
delay(200);  
display.display();
}
if(pultoskop==1){Generator();}
if(pultoskop==2){DDSGenerator();}
if(pultoskop==3){Light();}
}



//#######################################режим ренератора
void Generator(){
display.clearDisplay();  
if (flag==0){//флаг выборов режима настройки ШИМ или Частоты
            if(digitalRead(levo)==HIGH){
              frequency=frequency-mnog;
              if(frequency<0){frequency=0;}
              bool success = SetPinFrequencySafe(led, frequency);
              delay(3);//защита от дребезга 
            }
            if(digitalRead(pravo)==HIGH){
              frequency=frequency+mnog;
              bool success = SetPinFrequencySafe(led, frequency);
              delay(3);//защита от дребезга 
            }  
}
if (flag==1){//флаг выборов режима настройки ШИМ или Частоты
            if(digitalRead(levo)==HIGH){
              PWM=PWM-1;
              if(PWM<0){PWM=255;} 
              delay(3);//защита от дребезга
            
            }
            if(digitalRead(pravo)==HIGH){
              PWM=PWM+1;
              if(PWM>255){PWM=0;} 
              delay(3);//защита от дребезга 
            }  
}      
if(digitalRead(ok)==HIGH){//переключение разряда выбора частоты 
  delay(3);//защита от дребезга
  hag++;
  if(hag>=5){hag=0;}
} 
////////////
display.setTextSize(1);
display.setCursor(0,5);
display.print("PWM=");
display.print(PWM*100.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
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==LOW){
      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==LOW){
      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==LOW){
      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==LOW){
      PWM=RpilaM[d];
      pwmWrite(dds,PWM);
      //delayMicroseconds(fr);
      d++;
      if(d==32){d=0;}}
      menuDDS++;
    delay(200);}
if(menuDDS==4){menuDDS=0;}
}
/////////////////////Генератор DDS

/////////////////////Меню Light
void Light(){
int fr=10;
  if(menuLight==0){
    display.clearDisplay();
    display.setCursor(3,5);
    display.setTextColor(WHITE, BLACK); // 'inverted' text
    display.println("Подсветка LCD");
    display.setCursor(22,16);
    display.setTextColor(BLACK); 
    display.println("Фонарик");
    
    display.setCursor(0,40);
    display.print("Батарея  ");
    display.print(analogRead(akb)*VCC/1024/3.13);
    display.print(" В");    
  }
    if(menuLight==1){
    display.clearDisplay();
    display.setCursor(3,5);
    display.setTextColor(BLACK); // 'inverted' text
    display.println("Подсветка LCD");
    display.setCursor(22,16);
    display.setTextColor(WHITE, BLACK); // 'inverted' text
    display.println("Фонарик");
    display.setTextColor(BLACK); // 'inverted' text;
    
    display.setCursor(0,40);
    display.setTextColor(BLACK); 
    display.print("Батарея  ");
    display.print(analogRead(akb)*VCC/1024/3.13);
    display.print(" В");   
  } 
    
if(digitalRead(ok)==HIGH){delay(150);menuLight=menuLight+1;}
if(menuLight>1){menuLight=0;}

if((menuLight==0)&&(digitalRead(pravo)==HIGH))    LCDOnOff=1;
else if((menuLight==0)&&(digitalRead(levo)==HIGH))LCDOnOff=0;
EEPROM.write(0, LCDOnOff); 

if((menuLight==1)&&(digitalRead(pravo)==HIGH))    LEDOnOff=1;
else if((menuLight==1)&&(digitalRead(levo)==HIGH))LEDOnOff=0;
EEPROM.write(1, LEDOnOff); 

delay(100);   
display.display(); }
/////////////////////Меню Light


 

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

Sasha80

---Показывает не правильно, я виноват вместо умножить поделил.)))

нужно так display.print((analogRead(akb)*VCC/1024)*3.11);

---на 10К резистор не нужен, он в схеме для защиты порта если каким то образом туду попадет дольше 5В то падение напряжение на нем убережет порт.

Sasha80
Offline
Зарегистрирован: 18.01.2016

Ребята , большое вам спасибо. Вобщем прошивка меня устраиватет :) Сегодня перепаяю кварц и в бой! (мелкий вот только он там). Ах да, если впаять делитель на щуп (такой же 10К на 4.7К), корекции в скетче нужно будет где то делать? И я так понимаю резистор на входе 10К тоже убирать?

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

Sasha80 пишет:

Ребята , большое вам спасибо. Вобщем прошивка меня устраиватет :) Сегодня перепаяю кварц и в бой! (мелкий вот только он там). Ах да, если впаять делитель на щуп (такой же 10К на 4.7К), корекции в скетче нужно будет где то делать? И я так понимаю резистор на входе 10К тоже убирать?

С вас фото!

Резистор можно оставить, дополнительная защита если не туда ткнете!)

Если по серьезному то на щуп нужно брать резисторы 100КОм и выше, лучше мегаомы.

---Чем выше сопротивление щупа осциллографа тем меньше он влияет на измеряемый сигнал и искажает его.

---Чем выше сопротивление щупа осциллографа тем больше защищен ваш прибор от  статики и просто ошибочного тыканья в цепь с более высоким напряжением.

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

 

Sasha80
Offline
Зарегистрирован: 18.01.2016

bodriy2014 фото обещаю!

Планирую делитель на постоянной основе. Есть резистор на 100К и в пару к нему 10К (9,85). Подскажи пожалуйста как изменить формулы (сам боюсь ошибиться). Это те же строки я полагаю? display.print((analogRead(akb)*VCC/1024)*3.11);

множитель только 3,11 нужно будет подобрать, правильно я понимаю? Если так, то это не сложно, Там и другие строчки я видел с Vcc, там не знаю как менять.