Связь портов rx tx с функцией analogread()

Flikk
Offline
Зарегистрирован: 22.11.2017

Делаю проект, к Ардуино нано подключен дисплейный модуль на max7219. Модуль подключен к портам D2 D0 и D1. Стоит задача измерять напряжение на аналоговом порту a7 и выводить на дисплей.

Проверочный скетч:

#include "LedControl.h"
#include
#include

// define pins attached to MAX7219 (and also see notes above)
#define MAX7219_DIN 2
#define MAX7219_CS 0
#define MAX7219_CLK 1
// enumerate the MAX7219 registers
// See MAX7219 Datasheet, Table 2, page 7
enum { MAX7219_REG_DECODE = 0x09,
MAX7219_REG_INTENSITY = 0x0A,
MAX7219_REG_SCANLIMIT = 0x0B,
MAX7219_REG_SHUTDOWN = 0x0C,
MAX7219_REG_DISPTEST = 0x0F
};

// enumerate the SHUTDOWN modes
// See MAX7219 Datasheet, Table 3, page 7
enum { OFF = 0,
ON = 1
};

const byte DP = 0b10000000;
const byte C = 0b01001110;
const byte F = 0b01000111;
unsigned char str = 0;

//переменные паяльника

int ScrSolder = 0; //флаг показа температуры паяльника с энкодера
int ScrSolderCount = 0; //количество циклов показа измененного значения температуры паяльника с энкодера
int ScrFan = 0; //флаг показа температуры фена с энкодера
int ScrFanCount = 0; //количество циклов показа измененного значения температуры фена с энкодера
int ScrFanSpeed = 0; //флаг показа оборотов фена с энкодера
int ScrFanSpeedCount = 0; //количество циклов показа измененного значения оборотов фена с энкодера

int countDisp = 0; //счетчик таймера обновления дисплея

int TempSolder = 350 ;
int TempFan = 222 ;

int analogPin = 6; // номер порта к которому подключен потенциометр
int val = 0; // переменная для хранения считываемого значения

//--------------------------------------------------------------------------------------------

// ... write a value into a max7219 register
// See MAX7219 Datasheet, Table 1, page 6
void set_register(byte reg, byte value)
{
digitalWrite(MAX7219_CS, LOW);
shiftOut(MAX7219_DIN, MAX7219_CLK, MSBFIRST, reg);
shiftOut(MAX7219_DIN, MAX7219_CLK, MSBFIRST, value);
digitalWrite(MAX7219_CS, HIGH);
}

// ... reset the max7219 chip
void resetDisplay()
{
set_register(MAX7219_REG_SHUTDOWN, OFF); // turn off display
set_register(MAX7219_REG_DISPTEST, OFF); // turn off test mode
set_register(MAX7219_REG_INTENSITY, 0x0D); // display intensity
}

// ... ВЫВОД на ДИСПЛЕЙ ...
void displayAll(String tempString)
{
set_register(MAX7219_REG_SHUTDOWN, OFF); // turn off display
set_register(MAX7219_REG_SCANLIMIT, 7); // scan limit 8 digits
set_register(MAX7219_REG_DECODE, 0b11100111); // decode 7 digits

set_register(1, tempString.charAt(7));
set_register(2, tempString.charAt(6));
set_register(3, tempString.charAt(5));
set_register(4, 0);
set_register(5, 0);
set_register(6, tempString.charAt(2));
set_register(7, tempString.charAt(1));
set_register(8, tempString.charAt(0));

set_register(MAX7219_REG_SHUTDOWN, ON); // Turn on display
}

//--------------------------------------------------------------------------------------

void setup()
{
//Serial.begin(9600); // установка связи по serial
//Serial.end();
// назначаем пины для экрана
pinMode(MAX7219_DIN, OUTPUT); // serial data-in
pinMode(MAX7219_CS, OUTPUT); // chip-select, active low
pinMode(MAX7219_CLK, OUTPUT); // serial clock
digitalWrite(MAX7219_CS, HIGH);
resetDisplay(); // reset the MAX2719 display

}

void loop()
{
String strSolder;
String str;

val = analogRead(analogPin); // считываем значение
strSolder = 222; //переменная для проверки

str = strSolder + "--" + 111;// формируем строку для вывода на
//экран - значение srtSolder, два погашенных индикатора и //111(для проверки)

if ( countDisp == 3000 ) { //проверка обновлять ли дисплей (50 лучший вариант)
displayAll(str);//выводим на дисплей
countDisp = 0;

}

countDisp = countDisp + 1 ;//увеличиваем счетчик обновления дисплея

}

И собственно проблема- если я вывожу на дисплей значение переменной strsolder, то все отлично выводится. Если делаю счётчик и вывожу значения счётчика, то то же гуд. А вот как только пытаюсь вывести значения полученные от analogread(), сразу начинается пляска цифр. Значения скачут как будто порт висит в воздухе и генерит рандомные значения. Если не отключать Ардуино от питания и залить другой скетч с функцией analodread(), то все равно значения будут скакать. А вот стоит только отключить питание и заново включить( ничего не перепрошить. Просто сбросить питание) как все налаживается и analogread снова работает и выдает верные данные.
То же происходит если в скетче закоментировать процедуру вывода на дисплей displayAll(). Понимаю что самый простой способ это отказаться от использования D0, но плата уже распаяна и хочется разобраться что происходит.
Буду благодарен совета

sadman41
Offline
Зарегистрирован: 19.10.2016

Во-первых программный код вставляется через иконку {code}. 
Во-вторых посмотрите в своем скетче на каком пине АЦП измеряет напряжение.

Flikk
Offline
Зарегистрирован: 22.11.2017

Извиняюсь за код, писал с телефона, не нашел кнопу для кода.

В том то и дело что измеряю с А6, а дисплей висит на D1 и D0. Если отключаю функцию вывода на дисплей и вывожу в serial, то измерения правильные.

 

b707
Offline
Зарегистрирован: 26.05.2017

а к А6 что-нибудь подключено?

sadman41
Offline
Зарегистрирован: 19.10.2016

Я вот вижу: "Стоит задача измерять напряжение на аналоговом порту a7". Может еще что-то неправильно написали? И напишите для определенности "A6" в коде. analogRead() может и пересчитает пин правильно, если написать просто "6", но я внутрь к ней не лазил.

Flikk
Offline
Зарегистрирован: 22.11.2017

Пробовал менял на разные аналоговые пины не помогает. У меня на пинай A6 И A7 висит выход операционника Lm358, снего идет сигнал. Если закоментировать функцию вывода на индикатор - displayAll и отправлять данные в порт, то все показания верные получаю. Но только после полного отключения питания, если просто перезалить скетч с отключиной функцией вывод на индикатор, то в порту бегут рандомные цифры. Явно конфликт в способе вывода на индикатор, но вот где

Flikk
Offline
Зарегистрирован: 22.11.2017

Название темы оказалось не верным. Тут не связь RX TX, а связь библиотеки Max7219 и всех аналоговых портов. Как только активируешь вывод информации на дисплей MAX7219, так на аналоговых портах начинается пляска с данными. Как решить проблему не понимаю.

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

Может есть у кого мысли

sadman41
Offline
Зарегистрирован: 19.10.2016

MAX7219 неплохо срет по питанию, вроде, а вход чипа AVCC соединен с входом VCC  на плате Arduino (т.е. тут проблема чисто схемотехническая), т.е. все с индикатора летит в АЦП по цепям питания. Высаживайте индикатор на отдельный стабилизатор, к примеру. 

SLKH
Offline
Зарегистрирован: 17.08.2015

sadman41 пишет:

MAX7219 неплохо срет по питанию, вроде, а вход чипа AVCC соединен с входом VCC  на плате Arduino (т.е. тут проблема чисто схемотехническая), т.е. все с индикатора летит в АЦП по цепям питания. Высаживайте индикатор на отдельный стабилизатор, к примеру. 

Для начала стоит припаять на модуль индикатора конд. 100-200мф после входного диода.