Как digitalWrite руинит проект?

BelkaGudelka
Offline
Зарегистрирован: 22.11.2018

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 неделю.
wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016
BelkaGudelka
Offline
Зарегистрирован: 22.11.2018
#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)
    }
  }
}

 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

в 513  строках никто копаться не станет.

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

Выкидывай, пока програма не станет "на страничку". Скорее всего тогда сам заметишь причину, если нет - кидай сюда. Но не полтыщщи строк, уж не обижайся!

gfx125
Offline
Зарегистрирован: 27.05.2017

А калапан как подключен? Случайно не напрямую к пину? Или может с питанием проблемы. Может клапан при открытии жрет столько что ардуине с экраном ниче не остается

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А схемы не будет?

BelkaGudelka
Offline
Зарегистрирован: 22.11.2018

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

BelkaGudelka
Offline
Зарегистрирован: 22.11.2018

Не вижу смысла ее показывать, 6 пин на мосфет клапана, А0 +5V и GND с датчика давления. Всё предельно просто, если абстрагироваться от всего остального.

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

BelkaGudelka пишет:

Тогда я решил прям в setup прописать digitalWrite(valve, HIGH) и у меня всё меню стало отоброжаться полутусклым.

питание 100 пудов. Что конкретно - надо разбираться

Цитата:

Сразу говорю, дело не в питании и да, я знаю про DDRD, PORTD = B00000000 проверял - не то.

Не надо про питание. Если бы понимали, в чем дело - не пришли бы сюда.  Вы явно просто не разбираетесь, что делаете. Особенно умиляет, "DDRD, PORTD = B00000000 проверял - не то" :)))

Нужна схема подключения.

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

BelkaGudelka пишет:

Не вижу смысла ее показывать,

тогда не вижу смысла что-то обсуждать. Посидите еще 2 недели - может сами догадаетесь

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

BelkaGudelka пишет:

Не вижу смысла ее показывать

Ну, на нет и суда нет. Удачи!

BelkaGudelka
Offline
Зарегистрирован: 22.11.2018

Нашел в чем проблема, в пинах 5 и 6, когда ставлю другие пины в HIGH, всё нормально, так что это даже не digitalWrite

Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016

b707 пишет:
питание 100 пудов (...) Нужна схема подключения.

+1. 

BelkaGudelka, что подключено на D5, D6? Если они вызывают проблемы.

Моя метода работы с этим: включать. всё. по. одному. каждое.

Включать и смотреть, как оно себя ведёт. Напряг мониторить. Надо кстати вольтметр с цыфирками купить, как у алексагайвера, бо с тестером люто неудобно. Подключаете экран и по всяческому клацаете. Вклацали в меню open valve - чпок тестером тыкнули, появилась ли единица там где клапан. Вклацали что-то другое - проверять тоже чтобы другое работало

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

Ничего при этом не должно просесть, лагнуть или отвалиться.

Приделайте какой цикл, чтобы в углу экрана цифры тикали (способ выяснения, была ли жива ардуина, разгоняемая под жидким азотом). Остановились - проблема.

Питание ещё раз внимательно посмотреть. Электромагнитное вообще не любит рядом с ардуиной находиться, точнее наоборот. В идеале два блока питания, один на клапана-салиноиды (я то знаю как работяги склоняют, не клапаны а клапана). Второй на ардуины-экраны. И никаких соединений по минусу, всё развязать оптопарами.

У обоих блоков хотя-бы маломальский синфазный входной фильтр. Китайские прямоугольные, с двумя сплошными стенками и двумя с дырками, за 70 юаней - не подходят. Или в пару к таким БП фильтры от микроволновки. Два, на оба.

inspiritus
Offline
Зарегистрирован: 17.12.2012

 Кстати вывод арды прямо на затвор мосфета это круто. Есть такие специяльные радиодетали- резисторы называются. Там их еще двештуки разных нужно.

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

BelkaGudelka
Offline
Зарегистрирован: 22.11.2018

У меня стоит резистор на Ком

BelkaGudelka
Offline
Зарегистрирован: 22.11.2018

Короче проблема решена, да проблема была в питании, для самого было неожиданностью когда обнаружил, что с компа идёт питание 4 Вольта. Всяк сюда прибывший с той же проблемой ответственно советую:

1) Проверить питание с компа

2) Питать логику ардуины ОТДЕЛЬНО от силовой части блоков питания.

3) Если есть цель питать ардуино NANO отдельно от компа, то на пин Vin подавать от 7 до 12 Вольт.

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

BelkaGudelka пишет:

3) Если есть цель питать ардуино NANO отдельно от компа, то на пин Vin подавать от 7 до 12 Вольт.

5в на VIN подавали небось

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

b707 пишет:

5в на VIN подавали небось

Какая разница, схему-то всё равно

BelkaGudelka пишет:

Не вижу смысла ее показывать

BelkaGudelka
Offline
Зарегистрирован: 22.11.2018

Нет, на Vin все 12 подавал, просто когда редачил код с компа, 12В отключал, и соответственно значения совсем другие и с 4 вольтами при подаче питания на мосфет управляющий клапаном, вольтаж проседал еще ниже 4 Вольт и поэтому экран был тусклый а значения с датчика стали считать не от 4В а от 3,8В.

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

BelkaGudelka пишет:

Нет, на Vin все 12 подавал, просто когда редачил код с компа, 12В отключал, и соответственно значения совсем другие и с 4 вольтами при подаче питания на мосфет управляющий клапаном, вольтаж проседал еще ниже 4 Вольт и поэтому экран был тусклый а значения с датчика стали считать не от 4В а от 3,8В.

Гуделка - попробуйте внимательно прочитать свой текст и представить, как его читают другие. Написана полная фигня. Учитесь выражать мысли правильно и четко, это очень важно для программиста.