Arduino nano 328. Сразу говорю, дело не в питании и да, я знаю про DDRD, PORTD = B00000000 проверял - не то.
Время ардуительных историй: делаю прошивку для своего аппарата, в котором есть пневматическая система, электроклапан, датчик давления, управляется это всё дело энкодером, информация выводится на экранчик lcd1602. В меню есть возможность нажать на >Start (при этом начинает выполняться код с расчетами со всех датчиков и возможностью открывать и закрывать клапан когда надо) и >Open valve (исключительно нужно чтобы стравить оставшееся давление из пневмосистемы по окончанию работы, по сути выполняет те же расчёты что и при >Start).
Так вот, когда я включаю >Open valve, где прописана команда digitalWrite(valve, HIGH) на открытие клапана, экран тускнеет, а значения с одного и того же датчика, обрабатываются не верно (ну то есть не так как в >Start где я еще не успел прописать digitalWrite(valve, HIGH)). Когда я комментирую digitalWrite(valve, HIGH) в >Open valve, экран снова работает исправно, а значения с датчика давления обрабатываются корректно.
Тогда я решил прям в setup прописать digitalWrite(valve, HIGH) и у меня всё меню стало отоброжаться полутусклым.
Если что, пины подключены:
const int valve = 6;
const int pressure_meter = A0;
Код:
#include <TimerOne.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <Button.h>
#include <EEPROM.h>
LiquidCrystal_I2C lcd(0x3F, 16, 2);
const int PUL = 3;
const int DIR = 4;
const int ENA = 2;
const int compressor = 5;
const int valve = 6;
const int heater_2 = 7;
const int heater_1 = 8;
const int heater_3 = 9;
const int pressure_meter = A0;
const int tempPin_front = A1;
const int tempPin_rear = A2;
Button encoderA (11, 4); // сигнал A
Button encoderB (12, 4); // сигнал B
Button encoderButton(10, 40); // кнопка
uint16_t FRONT;
uint16_t REAR;
uint16_t TEMP;
float SPEED;
uint8_t pos = 0;
uint8_t border;
uint32_t last_time;
uint8_t start;
boolean heating_temp;
boolean feed_speed;
boolean upper_pressure;
boolean operating_pressure;
boolean pressure_flag;
boolean open_valve;
uint8_t i = 0;
uint8_t j = 0;
uint8_t k = 0;
// переменные для EEPROM
const int addrHeat = 0;
uint8_t Heat = 0;
const int addrFeedSpeed = 1;
uint8_t FeedSpeed = 0;
const int addrPmax = 2;
uint8_t Pmax = 0;
const int addrP = 3;
uint8_t P = 0;
uint8_t gradus[8] = {
B00110,
B01001,
B01001,
B00110,
B00000,
B00000,
B00000
};
void setup() {
Serial.begin(9600);
pos = 0;
start = 0;
lcd.init();
lcd.backlight();
lcd.home();
lcd.clear();
lcd.createChar(0, gradus);
Timer1.initialize(250); // инициализация таймера 1, период 250 мкс
Timer1.attachInterrupt(timerInterrupt, 250); // задаем обработчик прерываний
pinMode(PUL, OUTPUT);
pinMode(DIR, OUTPUT);
pinMode(ENA, OUTPUT);
pinMode(valve, OUTPUT);
pinMode(compressor, OUTPUT);
pinMode(heater_1, OUTPUT);
pinMode(heater_2, OUTPUT);
pinMode(heater_3, OUTPUT);
pinMode(pressure_meter, INPUT);
pinMode(tempPin_front, INPUT);
pinMode(tempPin_rear, INPUT);
digitalWrite(valve, LOW);
digitalWrite(compressor, LOW);
}
void loop() {
struct menu {
uint8_t border;
char* headline;
char* content;
};
menu array[5][3][4] =
{ { {{4, " Menu >", ">Start "}, { }, { }, {}},
{ },
{ }
},
{ {{4, "< Menu >", ">Heating temp "}, {1, ">Change: ", " Save & exit " }, { }, {}},
{{ }, {1, " Change: ", ">Save & exit " }, { }, {}},
{ }
},
{ {{4, "< Menu >", ">Feed speed "}, {1, ">Change: ", " Save & exit " }, { }, {}},
{{ }, {1, " Change: ", ">Save & exit " }, { }, {}},
{ }
},
{ {{4, "< Menu >", ">Pressure "}, {2, " Pressure >", ">Upper press "}, {1, ">Change: ", " Save & exit "}, {1, ">Change: ", " Save & exit "}},
{{}, {2, "< Pressure >", ">Operating press"}, {1, " Change: ", ">Save & exit "}, {1, " Change: ", ">Save & exit "}},
{{}, {2, "< Pressure ", ">Back "}, {}, {}},
},
{ {{4, "< Menu ", ">Open valve "}, {}, {}, {}},
{},
{},
}
};
int pressure_m[100];
uint8_t front_m[300];
uint8_t rear_m[300];
SPEED = 75000 / EEPROM.read(addrFeedSpeed);
if (start == 1) {
if (encoderButton.flagClick == true) {
encoderButton.flagClick = false;
start = 0;
digitalWrite(valve, LOW);
digitalWrite(compressor, LOW); //ВЫКЛЮЧАЕМ НАСОС И ЗАКРЫВАЕМ КЛАПАН
lcd.clear();
}
for (int i = 0; i < 100; i++) {
int16_t dPressure = analogRead(pressure_meter);
pressure_m[i] = dPressure;
}
for (int j = 0; j < 99; j++) {
for (int i = 0; i < 99; i++) {
if (pressure_m[i] > pressure_m[i + 1]) {
int pressure_temp = 0;
pressure_temp = pressure_m[i];
pressure_m[i] = pressure_m[i + 1];
pressure_m[i + 1] = pressure_temp;
}
}
}
for (int i = 0; i < 300; i++) {
int16_t front_t = analogRead(tempPin_front);
float front_tr = 1023.0 / front_t - 1;
front_tr = 96500 / front_tr;
float front;
front = front_tr / 100000; // (R/Ro)
front = log(front); // ln(R/Ro)
front /= 3950; // 1/B * ln(R/Ro)
front += 1.0 / (25 + 273.15); // + (1/To)
front = 1.0 / front; // Invert
front -= 273.15;
front_m[i] = front;
}
for (int j = 0; j < 299; j++) {
for (int i = 0; i < 299; i++) {
if (front_m[i] > front_m[i + 1]) {
int front_temp = 0;
front_temp = front_m[i];
front_m[i] = front_m[i + 1];
front_m[i + 1] = front_temp ;
}
}
}
for (int i = 0; i < 300; i++) {
int16_t rear_t = analogRead(tempPin_rear);
float rear_tr = 1023.0 / rear_t - 1;
rear_tr = 96500 / rear_tr;
float rear;
rear = rear_tr / 100000; // (R/Ro)
rear = log(rear); // ln(R/Ro)
rear /= 3950; // 1/B * ln(R/Ro)
rear += 1.0 / (25 + 273.15); // + (1/To)
rear = 1.0 / rear; // Invert
rear -= 273.15;
rear_m[i] = rear;
}
for (int j = 0; j < 299; j++) {
for (int i = 0; i < 299; i++) {
if (rear_m[i] > rear_m[i + 1]) {
int rear_temp = 0;
rear_temp = rear_m[i];
rear_m[i] = rear_m[i + 1];
rear_m[i + 1] = rear_temp ;
}
}
}
float vPressure = pressure_m[50] * (5.0000000 / 1023.0000000);
float pressure = (3 * ((float)vPressure - 0.5)) + 0.2096775;// - 0.2096775 - эмпирическая погрешность модуля
FRONT = front_m[150];
REAR = rear_m[150];
TEMP = FRONT + REAR;
TEMP = TEMP / 2;
if (FRONT < EEPROM.read(addrHeat)) {
digitalWrite(heater_1, HIGH); //ВКЛЮЧАЕМ НАГРЕВАТЕЛЬ heater_1
} else {
digitalWrite(heater_1, LOW); //ВЫКЛЮЧАЕМ НАГРЕВАТЕЛЬ heater_1
}
if (TEMP < EEPROM.read(addrHeat)) {
digitalWrite(heater_2, HIGH); //ВКЛЮЧАЕМ НАГРЕВАТЕЛЬ heater_2
} else {
digitalWrite(heater_2, LOW); //ВЫКЛЮЧАЕМ НАГРЕВАТЕЛЬ heater_2
}
if (REAR < EEPROM.read(addrHeat)) {
digitalWrite(heater_3, HIGH); //ВКЛЮЧАЕМ НАГРЕВАТЕЛЬ heater_3
} else {
digitalWrite(heater_3, LOW); //ВЫКЛЮЧАЕМ НАГРЕВАТЕЛЬ heater_3
}
lcd.setCursor(0, 0);
lcd.print((float)EEPROM.read(addrPmax) / 10, 1);
lcd.print(F("MPa "));
if (pressure < 0) {
lcd.setCursor(0, 1);
lcd.print("0.0");
lcd.print(F("MPa "));
} else {
lcd.setCursor(0, 1);
lcd.print(pressure, 10);
lcd.print(F("MPa "));
}
lcd.setCursor(10, 0);
lcd.print(TEMP);
lcd.print(char(0));
lcd.print(F("C "));
lcd.setCursor(10, 1);
lcd.print(EEPROM.read(addrFeedSpeed));
lcd.print(F("rpm "));
}
if (start == 0) {
lcd.setCursor(0, 0);
lcd.print(array[i][j][k].headline);
lcd.setCursor(0, 1);
lcd.print(array[i][j][k].content);
border = array[i][j][k].border;
if (k == 0) {
i = pos;
} else if (k > 0) {
j = pos;
}
if (k == 0) {
if (encoderButton.flagClick == true && i == 0) {
encoderButton.flagClick = false;
start = 1;
lcd.clear();
} else if (encoderButton.flagClick == true && i == 1) {
encoderButton.flagClick = false;
pos = 0;
lcd.clear();
k++;
} else if (encoderButton.flagClick == true && i == 2) {
encoderButton.flagClick = false;
pos = 0;
lcd.clear();
k++;
} else if (encoderButton.flagClick == true && i == 3) {
encoderButton.flagClick = false;
pos = 0;
lcd.clear();
k++;
}
else if (encoderButton.flagClick == true && i == 4) {
encoderButton.flagClick = false;
start = 2;
open_valve = true;
lcd.clear();
digitalWrite(valve, HIGH); //ОТКРЫВАЕМ КЛАПАН
}
} else if (i == 1 && k == 1) {
lcd.setCursor(9, 0);
lcd.print(EEPROM.read(addrHeat));
lcd.print(char(0));
lcd.print(F("C "));
if (encoderButton.flagClick == true && j == 0) {
encoderButton.flagClick = false;
start = 2;
heating_temp = true;
pos = EEPROM.read(addrHeat);
} else if (encoderButton.flagClick == true && j == 1) {
encoderButton.flagClick = false;
pos = 1;
j = 0;
k = 0;
lcd.clear();
}
} else if (i == 2 && k == 1) {
lcd.setCursor(9, 0);
lcd.print(EEPROM.read(addrFeedSpeed));
lcd.print(F("rpm "));
if (encoderButton.flagClick == true && j == 0) {
encoderButton.flagClick = false;
start = 2;
feed_speed = true;
pos = EEPROM.read(addrFeedSpeed);
} else if (encoderButton.flagClick == true && j == 1) {
encoderButton.flagClick = false;
pos = 2;
j = 0;
k = 0;
lcd.clear();
}
} else if (i == 3 && k == 1) {
if (encoderButton.flagClick == true && j == 0) {
encoderButton.flagClick = false;
k++;
pos = 0;
lcd.clear();
} else if (encoderButton.flagClick == true && j == 1) {
encoderButton.flagClick = false;
k = k + 2;
pos = 0;
lcd.clear();
} else if (encoderButton.flagClick == true && j == 2) {
encoderButton.flagClick = false;
pos = 3;
j = 0;
k = 0;
lcd.clear();
}
} else if (i == 3 && k == 2) {
lcd.setCursor(9, 0);
lcd.print((float)EEPROM.read(addrPmax) / 10, 1);
lcd.print(F("MPa "));
if (encoderButton.flagClick == true && j == 0) {
encoderButton.flagClick = false;
start = 2;
upper_pressure = true;
pos = EEPROM.read(addrPmax);
} else if (encoderButton.flagClick == true && j == 1) {
encoderButton.flagClick = false;
pos = 0;
k = 1;
lcd.clear();
}
} else if (i == 3 && k == 3) {
lcd.setCursor(9, 0);
lcd.print((float)EEPROM.read(addrP) / 10, 1);
lcd.print(F("MPa "));
if (encoderButton.flagClick == true && j == 0) {
encoderButton.flagClick = false;
start = 2;
operating_pressure = true;
pos = EEPROM.read(addrP);
} else if (encoderButton.flagClick == true && j == 1) {
encoderButton.flagClick = false;
pos = 1;
k = 1;
lcd.clear();
}
}
}
if (open_valve) {
for (int i = 0; i < 100; i++) {
int16_t dPressure = analogRead(pressure_meter);
pressure_m[i] = dPressure;
}
for (int j = 0; j < 99; j++) {
for (int i = 0; i < 99; i++) {
if (pressure_m[i] > pressure_m[i + 1]) {
int pressure_temp = 0;
pressure_temp = pressure_m[i];
pressure_m[i] = pressure_m[i + 1];
pressure_m[i + 1] = pressure_temp;
}
}
}
float vPressure = pressure_m[50] * (5.0000000 / 1023.0000000);
float pressure = (3 * ((float)vPressure - 0.5)) + 0.2096775;// - 0.2096775 - эмпирическая погрешность модуля
lcd.setCursor(0, 0);
lcd.print((float)EEPROM.read(addrPmax) / 10, 1);
lcd.print(F("MPa "));
if (pressure < 0) {
lcd.setCursor(0, 1);
lcd.print("0.0");
lcd.print(F("MPa "));
} else {
lcd.setCursor(0, 1);
lcd.print(pressure, 10);
lcd.print(F("MPa "));
}
if (encoderButton.flagClick == true) {
encoderButton.flagClick = false;
digitalWrite(valve, LOW); //ЗАКРЫВАЕМ КЛАПАН
pos = 4;
open_valve = false;
start = 0;
lcd.clear();
}
}
if (heating_temp) {
lcd.setCursor(9, 0);
lcd.print(Heat);
lcd.print(char(0));
lcd.print(F("C "));
border = 255;
Heat = pos;
if (encoderButton.flagClick == true) {
encoderButton.flagClick = false;
EEPROM.write(addrHeat, Heat);
heating_temp = false;
pos = 0;
start = 0;
}
}
if (feed_speed) {
lcd.setCursor(9, 0);
lcd.print(FeedSpeed);
lcd.print(F("rpm "));
border = 255;
FeedSpeed = pos;
if (FeedSpeed < 1) {
FeedSpeed = 1;
}
if (encoderButton.flagClick == true) {
encoderButton.flagClick = false;
EEPROM.write(addrFeedSpeed, FeedSpeed);
feed_speed = false;
pos = 0;
start = 0;
}
}
if (upper_pressure) {
lcd.setCursor(9, 0);
lcd.print((float)Pmax / 10, 1);
lcd.print(F("MPa "));
border = 120;
Pmax = pos;
if (encoderButton.flagClick == true) {
encoderButton.flagClick = false;
EEPROM.write(addrPmax, Pmax);
upper_pressure = false;
pos = 0;
start = 0;
}
}
if (operating_pressure) {
lcd.setCursor(9, 0);
lcd.print((float)P / 10, 1);
lcd.print(F("MPa "));
border = 120;
P = pos;
if (encoderButton.flagClick == true) {
encoderButton.flagClick = false;
EEPROM.write(addrP, P);
operating_pressure = false;
pos = 0;
start = 0;
}
}
}
// обработчик прерывания 250 мкс
void timerInterrupt() {
encoderA.filterAvarage();
encoderB.filterAvarage();
encoderButton.filterAvarage();
if ( encoderA.flagClick == true ) {
encoderA.flagClick = false;
if (( encoderB.flagPress == true) && (pos > 0)) {
// против часовой стрелки
pos--;
}
else if (( encoderB.flagPress == false) && (pos < border)) {
// по часовой стрелке
pos++;
}
if (pos < 0) {
pos = 0;
}
if (pos > border) {
pos = border;
}
}
if (pressure_flag) {
digitalWrite(DIR, HIGH);
digitalWrite(ENA, HIGH);
digitalWrite(PUL, HIGH); //ВЫСОКОЕ ЗНАЧЕНИЕ STEP(PUL) И УДЕРЖАНИЕ(ENA)
if (micros() - last_time >= SPEED) {
last_time = micros();
digitalWrite(PUL, LOW); //НИЗКОЕ ЗНАЧЕНИЕ STEP(PUL)
}
}
}
Помогите, торчу с этой фигнёй 2 неделю.
http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii
#include <TimerOne.h> #include <LiquidCrystal_I2C.h> #include <Wire.h> #include <Button.h> #include <EEPROM.h> LiquidCrystal_I2C lcd(0x3F, 16, 2); const int PUL = 3; const int DIR = 4; const int ENA = 2; const int compressor = 5; const int valve = 6; const int heater_2 = 7; const int heater_1 = 8; const int heater_3 = 9; const int pressure_meter = A0; const int tempPin_front = A1; const int tempPin_rear = A2; Button encoderA (11, 4); // сигнал A Button encoderB (12, 4); // сигнал B Button encoderButton(10, 40); // кнопка uint16_t FRONT; uint16_t REAR; uint16_t TEMP; float SPEED; uint8_t pos = 0; uint8_t border; uint32_t last_time; uint8_t start; boolean heating_temp; boolean feed_speed; boolean upper_pressure; boolean operating_pressure; boolean pressure_flag; boolean open_valve; uint8_t i = 0; uint8_t j = 0; uint8_t k = 0; // переменные для EEPROM const int addrHeat = 0; uint8_t Heat = 0; const int addrFeedSpeed = 1; uint8_t FeedSpeed = 0; const int addrPmax = 2; uint8_t Pmax = 0; const int addrP = 3; uint8_t P = 0; uint8_t gradus[8] = { B00110, B01001, B01001, B00110, B00000, B00000, B00000 }; //переменные для вывода меню void setup() { Serial.begin(9600); pos = 0; start = 0; lcd.init(); lcd.backlight(); lcd.home(); lcd.clear(); lcd.createChar(0, gradus); Timer1.initialize(250); // инициализация таймера 1, период 250 мкс Timer1.attachInterrupt(timerInterrupt, 250); // задаем обработчик прерываний pinMode(PUL, OUTPUT); pinMode(DIR, OUTPUT); pinMode(ENA, OUTPUT); pinMode(valve, OUTPUT); pinMode(compressor, OUTPUT); pinMode(heater_1, OUTPUT); pinMode(heater_2, OUTPUT); pinMode(heater_3, OUTPUT); pinMode(pressure_meter, INPUT); pinMode(tempPin_front, INPUT); pinMode(tempPin_rear, INPUT); digitalWrite(valve, LOW); digitalWrite(compressor, LOW); } void loop() { struct menu { uint8_t border; char* headline; char* content; }; menu array[5][3][4] = { { {{4, " Menu >", ">Start "}, { }, { }, {}}, { }, { } }, { {{4, "< Menu >", ">Heating temp "}, {1, ">Change: ", " Save & exit " }, { }, {}}, {{ }, {1, " Change: ", ">Save & exit " }, { }, {}}, { } }, { {{4, "< Menu >", ">Feed speed "}, {1, ">Change: ", " Save & exit " }, { }, {}}, {{ }, {1, " Change: ", ">Save & exit " }, { }, {}}, { } }, { {{4, "< Menu >", ">Pressure "}, {2, " Pressure >", ">Upper press "}, {1, ">Change: ", " Save & exit "}, {1, ">Change: ", " Save & exit "}}, {{}, {2, "< Pressure >", ">Operating press"}, {1, " Change: ", ">Save & exit "}, {1, " Change: ", ">Save & exit "}}, {{}, {2, "< Pressure ", ">Back "}, {}, {}}, }, { {{4, "< Menu ", ">Open valve "}, {}, {}, {}}, {}, {}, } }; int pressure_m[100]; uint8_t front_m[300]; uint8_t rear_m[300]; SPEED = 75000 / EEPROM.read(addrFeedSpeed); if (start == 1) { if (encoderButton.flagClick == true) { encoderButton.flagClick = false; start = 0; digitalWrite(valve, LOW); digitalWrite(compressor, LOW); //ВЫКЛЮЧАЕМ НАСОС И ЗАКРЫВАЕМ КЛАПАН lcd.clear(); } for (int i = 0; i < 100; i++) { int16_t dPressure = analogRead(pressure_meter); pressure_m[i] = dPressure; } for (int j = 0; j < 99; j++) { for (int i = 0; i < 99; i++) { if (pressure_m[i] > pressure_m[i + 1]) { int pressure_temp = 0; pressure_temp = pressure_m[i]; pressure_m[i] = pressure_m[i + 1]; pressure_m[i + 1] = pressure_temp; } } } for (int i = 0; i < 300; i++) { int16_t front_t = analogRead(tempPin_front); float front_tr = 1023.0 / front_t - 1; front_tr = 96500 / front_tr; float front; front = front_tr / 100000; // (R/Ro) front = log(front); // ln(R/Ro) front /= 3950; // 1/B * ln(R/Ro) front += 1.0 / (25 + 273.15); // + (1/To) front = 1.0 / front; // Invert front -= 273.15; front_m[i] = front; } for (int j = 0; j < 299; j++) { for (int i = 0; i < 299; i++) { if (front_m[i] > front_m[i + 1]) { int front_temp = 0; front_temp = front_m[i]; front_m[i] = front_m[i + 1]; front_m[i + 1] = front_temp ; } } } for (int i = 0; i < 300; i++) { int16_t rear_t = analogRead(tempPin_rear); float rear_tr = 1023.0 / rear_t - 1; rear_tr = 96500 / rear_tr; float rear; rear = rear_tr / 100000; // (R/Ro) rear = log(rear); // ln(R/Ro) rear /= 3950; // 1/B * ln(R/Ro) rear += 1.0 / (25 + 273.15); // + (1/To) rear = 1.0 / rear; // Invert rear -= 273.15; rear_m[i] = rear; } for (int j = 0; j < 299; j++) { for (int i = 0; i < 299; i++) { if (rear_m[i] > rear_m[i + 1]) { int rear_temp = 0; rear_temp = rear_m[i]; rear_m[i] = rear_m[i + 1]; rear_m[i + 1] = rear_temp ; } } } float vPressure = pressure_m[50] * (5.0000000 / 1023.0000000); float pressure = (3 * ((float)vPressure - 0.5)) + 0.2096775;// - 0.2096775 - эмпирическая погрешность модуля FRONT = front_m[150]; REAR = rear_m[150]; TEMP = FRONT + REAR; TEMP = TEMP / 2; if (FRONT < EEPROM.read(addrHeat)) { digitalWrite(heater_1, HIGH); //ВКЛЮЧАЕМ НАГРЕВАТЕЛЬ heater_1 } else { digitalWrite(heater_1, LOW); //ВЫКЛЮЧАЕМ НАГРЕВАТЕЛЬ heater_1 } if (TEMP < EEPROM.read(addrHeat)) { digitalWrite(heater_2, HIGH); //ВКЛЮЧАЕМ НАГРЕВАТЕЛЬ heater_2 } else { digitalWrite(heater_2, LOW); //ВЫКЛЮЧАЕМ НАГРЕВАТЕЛЬ heater_2 } if (REAR < EEPROM.read(addrHeat)) { digitalWrite(heater_3, HIGH); //ВКЛЮЧАЕМ НАГРЕВАТЕЛЬ heater_3 } else { digitalWrite(heater_3, LOW); //ВЫКЛЮЧАЕМ НАГРЕВАТЕЛЬ heater_3 } lcd.setCursor(0, 0); lcd.print((float)EEPROM.read(addrPmax) / 10, 1); lcd.print(F("MPa ")); if (pressure < 0) { lcd.setCursor(0, 1); lcd.print("0.0"); lcd.print(F("MPa ")); } else { lcd.setCursor(0, 1); lcd.print(pressure, 10); lcd.print(F("MPa ")); } lcd.setCursor(10, 0); lcd.print(TEMP); lcd.print(char(0)); lcd.print(F("C ")); lcd.setCursor(10, 1); lcd.print(EEPROM.read(addrFeedSpeed)); lcd.print(F("rpm ")); } if (start == 0) { lcd.setCursor(0, 0); lcd.print(array[i][j][k].headline); lcd.setCursor(0, 1); lcd.print(array[i][j][k].content); border = array[i][j][k].border; if (k == 0) { i = pos; } else if (k > 0) { j = pos; } if (k == 0) { if (encoderButton.flagClick == true && i == 0) { encoderButton.flagClick = false; start = 1; lcd.clear(); } else if (encoderButton.flagClick == true && i == 1) { encoderButton.flagClick = false; pos = 0; lcd.clear(); k++; } else if (encoderButton.flagClick == true && i == 2) { encoderButton.flagClick = false; pos = 0; lcd.clear(); k++; } else if (encoderButton.flagClick == true && i == 3) { encoderButton.flagClick = false; pos = 0; lcd.clear(); k++; } else if (encoderButton.flagClick == true && i == 4) { encoderButton.flagClick = false; start = 2; open_valve = true; lcd.clear(); digitalWrite(valve, HIGH); //ОТКРЫВАЕМ КЛАПАН } } else if (i == 1 && k == 1) { lcd.setCursor(9, 0); lcd.print(EEPROM.read(addrHeat)); lcd.print(char(0)); lcd.print(F("C ")); if (encoderButton.flagClick == true && j == 0) { encoderButton.flagClick = false; start = 2; heating_temp = true; pos = EEPROM.read(addrHeat); } else if (encoderButton.flagClick == true && j == 1) { encoderButton.flagClick = false; pos = 1; j = 0; k = 0; lcd.clear(); } } else if (i == 2 && k == 1) { lcd.setCursor(9, 0); lcd.print(EEPROM.read(addrFeedSpeed)); lcd.print(F("rpm ")); if (encoderButton.flagClick == true && j == 0) { encoderButton.flagClick = false; start = 2; feed_speed = true; pos = EEPROM.read(addrFeedSpeed); } else if (encoderButton.flagClick == true && j == 1) { encoderButton.flagClick = false; pos = 2; j = 0; k = 0; lcd.clear(); } } else if (i == 3 && k == 1) { if (encoderButton.flagClick == true && j == 0) { encoderButton.flagClick = false; k++; pos = 0; lcd.clear(); } else if (encoderButton.flagClick == true && j == 1) { encoderButton.flagClick = false; k = k + 2; pos = 0; lcd.clear(); } else if (encoderButton.flagClick == true && j == 2) { encoderButton.flagClick = false; pos = 3; j = 0; k = 0; lcd.clear(); } } else if (i == 3 && k == 2) { lcd.setCursor(9, 0); lcd.print((float)EEPROM.read(addrPmax) / 10, 1); lcd.print(F("MPa ")); if (encoderButton.flagClick == true && j == 0) { encoderButton.flagClick = false; start = 2; upper_pressure = true; pos = EEPROM.read(addrPmax); } else if (encoderButton.flagClick == true && j == 1) { encoderButton.flagClick = false; pos = 0; k = 1; lcd.clear(); } } else if (i == 3 && k == 3) { lcd.setCursor(9, 0); lcd.print((float)EEPROM.read(addrP) / 10, 1); lcd.print(F("MPa ")); if (encoderButton.flagClick == true && j == 0) { encoderButton.flagClick = false; start = 2; operating_pressure = true; pos = EEPROM.read(addrP); } else if (encoderButton.flagClick == true && j == 1) { encoderButton.flagClick = false; pos = 1; k = 1; lcd.clear(); } } } if (open_valve) { for (int i = 0; i < 100; i++) { int16_t dPressure = analogRead(pressure_meter); pressure_m[i] = dPressure; } for (int j = 0; j < 99; j++) { for (int i = 0; i < 99; i++) { if (pressure_m[i] > pressure_m[i + 1]) { int pressure_temp = 0; pressure_temp = pressure_m[i]; pressure_m[i] = pressure_m[i + 1]; pressure_m[i + 1] = pressure_temp; } } } float vPressure = pressure_m[50] * (5.0000000 / 1023.0000000); float pressure = (3 * ((float)vPressure - 0.5)) + 0.2096775;// - 0.2096775 - эмпирическая погрешность модуля lcd.setCursor(0, 0); lcd.print((float)EEPROM.read(addrPmax) / 10, 1); lcd.print(F("MPa ")); if (pressure < 0) { lcd.setCursor(0, 1); lcd.print("0.0"); lcd.print(F("MPa ")); } else { lcd.setCursor(0, 1); lcd.print(pressure, 10); lcd.print(F("MPa ")); } if (encoderButton.flagClick == true) { encoderButton.flagClick = false; digitalWrite(valve, LOW); //ЗАКРЫВАЕМ КЛАПАН pos = 4; open_valve = false; start = 0; lcd.clear(); } } if (heating_temp) { lcd.setCursor(9, 0); lcd.print(Heat); lcd.print(char(0)); lcd.print(F("C ")); border = 255; Heat = pos; if (encoderButton.flagClick == true) { encoderButton.flagClick = false; EEPROM.write(addrHeat, Heat); heating_temp = false; pos = 0; start = 0; } } if (feed_speed) { lcd.setCursor(9, 0); lcd.print(FeedSpeed); lcd.print(F("rpm ")); border = 255; FeedSpeed = pos; if (FeedSpeed < 1) { FeedSpeed = 1; } if (encoderButton.flagClick == true) { encoderButton.flagClick = false; EEPROM.write(addrFeedSpeed, FeedSpeed); feed_speed = false; pos = 0; start = 0; } } if (upper_pressure) { lcd.setCursor(9, 0); lcd.print((float)Pmax / 10, 1); lcd.print(F("MPa ")); border = 120; Pmax = pos; if (encoderButton.flagClick == true) { encoderButton.flagClick = false; EEPROM.write(addrPmax, Pmax); upper_pressure = false; pos = 0; start = 0; } } if (operating_pressure) { lcd.setCursor(9, 0); lcd.print((float)P / 10, 1); lcd.print(F("MPa ")); border = 120; P = pos; if (encoderButton.flagClick == true) { encoderButton.flagClick = false; EEPROM.write(addrP, P); operating_pressure = false; pos = 0; start = 0; } } } // обработчик прерывания 250 мкс void timerInterrupt() { encoderA.filterAvarage(); encoderB.filterAvarage(); encoderButton.filterAvarage(); if ( encoderA.flagClick == true ) { encoderA.flagClick = false; if (( encoderB.flagPress == true) && (pos > 0)) { // против часовой стрелки pos--; } else if (( encoderB.flagPress == false) && (pos < border)) { // по часовой стрелке pos++; } if (pos < 0) { pos = 0; } if (pos > border) { pos = border; } } if (pressure_flag) { digitalWrite(DIR, HIGH); digitalWrite(ENA, HIGH); digitalWrite(PUL, HIGH); //ВЫСОКОЕ ЗНАЧЕНИЕ STEP(PUL) И УДЕРЖАНИЕ(ENA) if (micros() - last_time >= SPEED) { last_time = micros(); digitalWrite(PUL, LOW); //НИЗКОЕ ЗНАЧЕНИЕ STEP(PUL) } } }в 513 строках никто копаться не станет.
Нужно уменьшать програму, выкидывая незначащие для диагностики куски, сохраняя видимую ошибку - то есть твое мерцание или что-там у тебя с отображением. Видимое как "вполовину яркости" на 1602 - это, скорее всего, быстрое мерцание.
Выкидывай, пока програма не станет "на страничку". Скорее всего тогда сам заметишь причину, если нет - кидай сюда. Но не полтыщщи строк, уж не обижайся!
А калапан как подключен? Случайно не напрямую к пину? Или может с питанием проблемы. Может клапан при открытии жрет столько что ардуине с экраном ниче не остается
А схемы не будет?
Клапан открывается через мосфет, 5 вольт как понимашь на ногу затвора идет, на клапан питание отдельно от бп.
Не вижу смысла ее показывать, 6 пин на мосфет клапана, А0 +5V и GND с датчика давления. Всё предельно просто, если абстрагироваться от всего остального.
Тогда я решил прям в setup прописать digitalWrite(valve, HIGH) и у меня всё меню стало отоброжаться полутусклым.
питание 100 пудов. Что конкретно - надо разбираться
Сразу говорю, дело не в питании и да, я знаю про DDRD, PORTD = B00000000 проверял - не то.
Не надо про питание. Если бы понимали, в чем дело - не пришли бы сюда. Вы явно просто не разбираетесь, что делаете. Особенно умиляет, "DDRD, PORTD = B00000000 проверял - не то" :)))
Нужна схема подключения.
Не вижу смысла ее показывать,
тогда не вижу смысла что-то обсуждать. Посидите еще 2 недели - может сами догадаетесь
Не вижу смысла ее показывать
Ну, на нет и суда нет. Удачи!
Нашел в чем проблема, в пинах 5 и 6, когда ставлю другие пины в HIGH, всё нормально, так что это даже не digitalWrite
+1.
BelkaGudelka, что подключено на D5, D6? Если они вызывают проблемы.
Моя метода работы с этим: включать. всё. по. одному. каждое.
Включать и смотреть, как оно себя ведёт. Напряг мониторить. Надо кстати вольтметр с цыфирками купить, как у алексагайвера, бо с тестером люто неудобно. Подключаете экран и по всяческому клацаете. Вклацали в меню open valve - чпок тестером тыкнули, появилась ли единица там где клапан. Вклацали что-то другое - проверять тоже чтобы другое работало
Потом цепляете по кускам остальную аппаратную часть и можно как угонщики с проводами - бзз, бзз, ну чисто два провода замкнуть. не с ардуины.
Ничего при этом не должно просесть, лагнуть или отвалиться.
Приделайте какой цикл, чтобы в углу экрана цифры тикали (способ выяснения, была ли жива ардуина, разгоняемая под жидким азотом). Остановились - проблема.
Питание ещё раз внимательно посмотреть. Электромагнитное вообще не любит рядом с ардуиной находиться, точнее наоборот. В идеале два блока питания, один на клапана-салиноиды (я то знаю как работяги склоняют, не клапаны а клапана). Второй на ардуины-экраны. И никаких соединений по минусу, всё развязать оптопарами.
У обоих блоков хотя-бы маломальский синфазный входной фильтр. Китайские прямоугольные, с двумя сплошными стенками и двумя с дырками, за 70 юаней - не подходят. Или в пару к таким БП фильтры от микроволновки. Два, на оба.
Кстати вывод арды прямо на затвор мосфета это круто. Есть такие специяльные радиодетали- резисторы называются. Там их еще двештуки разных нужно.
А коль скоро Вы управляете соленоидным клапаном , то есть индуктивной нагрузкой то еще потребуется диод, или уверенность , что оный есть внутри мосфета.
У меня стоит резистор на Ком
Короче проблема решена, да проблема была в питании, для самого было неожиданностью когда обнаружил, что с компа идёт питание 4 Вольта. Всяк сюда прибывший с той же проблемой ответственно советую:
1) Проверить питание с компа
2) Питать логику ардуины ОТДЕЛЬНО от силовой части блоков питания.
3) Если есть цель питать ардуино NANO отдельно от компа, то на пин Vin подавать от 7 до 12 Вольт.
3) Если есть цель питать ардуино NANO отдельно от компа, то на пин Vin подавать от 7 до 12 Вольт.
5в на VIN подавали небось
5в на VIN подавали небось
Какая разница, схему-то всё равно
Не вижу смысла ее показывать
Нет, на Vin все 12 подавал, просто когда редачил код с компа, 12В отключал, и соответственно значения совсем другие и с 4 вольтами при подаче питания на мосфет управляющий клапаном, вольтаж проседал еще ниже 4 Вольт и поэтому экран был тусклый а значения с датчика стали считать не от 4В а от 3,8В.
Нет, на Vin все 12 подавал, просто когда редачил код с компа, 12В отключал, и соответственно значения совсем другие и с 4 вольтами при подаче питания на мосфет управляющий клапаном, вольтаж проседал еще ниже 4 Вольт и поэтому экран был тусклый а значения с датчика стали считать не от 4В а от 3,8В.
Гуделка - попробуйте внимательно прочитать свой текст и представить, как его читают другие. Написана полная фигня. Учитесь выражать мысли правильно и четко, это очень важно для программиста.