Терморегулятор - ошибка обработки файла

UFO 007
UFO 007 аватар
Offline
Зарегистрирован: 11.01.2018

Доброго всем времени суток!

В общем, диспозиция такова: существует (в природе) прибор (то ли Воронежской, то ли Волгоградской) фирмы ТермоПРО, который кроме простого ПИД (а может и не пид) поддержания заданной Т может паять по профилю. Судя по тому, что окромя прибора были разработаны УСБ-дривер и прога поддержки для ПК, разрабатывал не такой домашний кулибин как я, а худо-бедно КБ и, стало быть, аппарат стОит тысячей немерянных...  Я же пошёл по пути наименьшего капиталловложения: Нано-3, ЛСД-1602, Лед-Ремувер (300Вт за 300р), МОСФЕТ (900Вт) и 2 зарядки: +5в и +12в... Ну... Просто ПИД-"поддержатель" температуры - как 2 пальца об асфальт ( прямо на макетке, благо библИотИк = тонны), а вот пайка по профилю... Прога от ТермоПРО (как я подозреваю) на том же Мемо1 делает не Мемо1.Lines.Add('Я тЭбЮ лублу');, а Мемо1.Canvas.Draw(Temp, Time); и график = оч красивый: от точки до точки... Я же не стал заморачиваться с УСБ-дривером (а вдруг ещё и под Линух?) и прогой поддержки, а просто записал "точки" в файл graphic.txt: 40,120,190,60,190,20,230,2,40. Что означает: стартовая Т=40 ºС, через 120 сек она должна стать 190 ºС, 60 сек прогреваем (аллюминий под светоИдами), за 20 сек доводим до 230 и после 2-х сек "пайки" охлаждаем до 40 ºС. И вот код, который всё это делает:

void SolderFromFile(){
  LCDTimer.Enable = false;
  if (!card.init(SPI_HALF_SPEED, chipSelect)) {//ФлэхаВставлена?
    MyPrint("SD-Card: Error", "ФлэхаВставлена?");
    delay(2500);
  }
  if (!volume.init(card)) {// ФлэхаФорматирвана?
    MyPrint("PartitionNotFound", "ФлэхаФорматирвана?");
    delay(2500);
  }
  if (!SD.begin(chipSelect)) {
    MyPrint("Initialization","Failed!");
    delay(2500);
  }
  if (!SD.exists("GRAPHIC.TXT")) {
    MyPrint("Файл graphic.txt","не существует");
    delay(2000);
    exit;
  }
  String Krivaja;
  MyFile = SD.open("graphic.txt");//, FILE_WRITE);
  if (!MyFile){// Файл не открылся
    MyPrint("ОШИБКА:         ","Файл не открылся");
    delay(2000);
  }
  else
  {
    while (MyFile.available()) {
      Krivaja += (char)MyFile.read();
    }
    MyFile.close();
  }//                       файл считан
Serial.print("Krivaja = ");
Serial.println(Krivaja);
  int i;
  FileLen = 0;
  for (i = 0; i<Krivaja.length(); i++){
    if(Krivaja[i] == ',') FileLen++;
  }
  byte bytes[FileLen]; 
  mString<50> mstr;// 50 знакомест
  mstr += Krivaja;
Serial.print("FileLen = ");
Serial.println(FileLen);
  mstr.parseBytes(bytes, FileLen, ',', '\n');//в массив
  for (i = 0; i<FileLen; i++){
    graphArray[i] = bytes[i];//
  }
  SetPoint = graphArray[0];
  graphIndex = 1;
  SolderTimer.Start = millis();
  SolderTimer.Enable = true;
  SolderTime = 1;
  GpaphTime = 1;
 }

  if ((SolderTimer.Enable) && (TimerOn(SolderTimer))){// секунда прошла - работаем
    SolderTimer.Start = millis();
    Zamer();//   RealTemp = thermocouple.readCelsius();
    if(graphIndex>=15) exit;//byte graphArray[15] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
    static float Delta, SetPointOld=0;

    if (SolderTime == GpaphTime){
      SolderTime = 0;
      GpaphTime = graphArray[graphIndex]; //120...60 сек
      SetPoint2 = graphArray[graphIndex+1];//190...190 ºС
      SetPointOld = graphArray[graphIndex-1];
      if (graphIndex < FileLen){// FileLen = 9 значений
        if (SetPoint2 >= SetPointOld){
          Delta = (SetPoint2-SetPointOld)/GpaphTime;//градусов в секунду
          digitalWrite(vent, 0);// вентилятор не нужен
        }
        else
          {
            Delta = 0;
            SetPoint = SetPoint2;
            digitalWrite(vent, 1);
Serial.println("Охлаждаем");
          }
        graphIndex += 2;
      } else {
        MyPrint("График обработан","полностью");// на ЖКИ 1602
        do {
          delay(10);
//          if (btMode.isPress()) Mode = 0;
        }
        while (Mode == 2);
//        delay(1000);
//        SolderTimer.Enable = false;
//        LCDTimer.Enable = true;
Serial.print("График обработан");// = выводится
      }
    }
    if (SetPoint < SetPoint2) SetPoint += Delta;
    MyPrint("Задание = " + String(SetPoint), 
            "Реально : " + String(RealTemp, 2));//3
    SolderTime++;
//40,120,190,60,190,20,230,2,40
  }

И всё это дело самым чудным (как утверждает Serial.print, да и ЛСД) образом работает, но (тут нуно пояснить: Режим0 - коррекция и ПИД-поддержание СетПоинта, Режим1 - коррекция П, И и Д коэффициентов) а вот из Режима2 ("Пайка из файла") согласно строкам 83..87 "вырваться" невозможно ("зависон") но за то на ЛСД гордо красуется: "График обработан","полностью"... Но стОит перенести REMарк со строки 85 на 84 - получаю: Задание = 40.0н... Т.е. сначала выводится "График обработан" и следом ЛСДТимер выводит Задание = 40.0... Где собака порылась? Как лицезреть сообщение пока не нажмёшь кнопку "Mode"?

Заранее благодарен.

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

они вроде немецкие нагреватели используют, не?

Дим-мычъ
Offline
Зарегистрирован: 20.03.2021

UFO 007 пишет:

а вот из Режима2 ("Пайка из файла") согласно строкам 83..87 "вырваться" невозможно ("зависон") но за то на ЛСД гордо красуется: "График обработан","полностью".

87стр.          while (Mode == 2);  // Может здесь причина?

 

UFO 007
UFO 007 аватар
Offline
Зарегистрирован: 11.01.2018

Дим-мычъ пишет:

87стр.          while (Mode == 2);  // Может здесь причина?

В том-то и изюминка:

        MyPrint("График обработан","полностью");// на ЖКИ 1602: каждая "фраза" на своей строке
        do {
          delay(10);
//          if (btMode.isPress()) Mode = 0;
        }
        while (Mode == 2);

надпись (по идее) должна отображаться до тех пор пока не нажмёшь кнопку Режим, но реально: из-за того, что опрос кнопки (строка 4) заREMирован получается "зависон" (что само по себе - логично)... И соль тут в следующем: стОит разREMировать строку 4 (равно как и перенести REMарк на строку 3) - на 1-й строке жки получаю: Задание = 40.00н - ("н" выделил жирным потому что) сначала печатается "График обработан" и сразу же (пару-тройку машинных циклов спустя) без какого бы то ни было ожидания нажатия выводится "Задание = 40.00" - 15 символов перезаписываются и полюбоваться отчётом не представляется возможным... Почему?

Дим-мычъ
Offline
Зарегистрирован: 20.03.2021

Трудно что-то сказать по обрывку кода, тем более, я сам ещё "зелёный" в Ардуино))

Если всё это одна функция SolderFromFile(), то скобки расставлены не верно(стр.55 ??).

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