Терморегулятор - ошибка обработки файла
- Войдите на сайт для отправки комментариев
Доброго всем времени суток!
В общем, диспозиция такова: существует (в природе) прибор (то ли Воронежской, то ли Волгоградской) фирмы ТермоПРО, который кроме простого ПИД (а может и не пид) поддержания заданной Т может паять по профилю. Судя по тому, что окромя прибора были разработаны УСБ-дривер и прога поддержки для ПК, разрабатывал не такой домашний кулибин как я, а худо-бедно КБ и, стало быть, аппарат стОит тысячей немерянных... Я же пошёл по пути наименьшего капиталловложения: Нано-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"?
Заранее благодарен.
они вроде немецкие нагреватели используют, не?
а вот из Режима2 ("Пайка из файла") согласно строкам 83..87 "вырваться" невозможно ("зависон") но за то на ЛСД гордо красуется: "График обработан","полностью".
87стр. while (Mode == 2); // Может здесь причина?
87стр. while (Mode == 2); // Может здесь причина?
надпись (по идее) должна отображаться до тех пор пока не нажмёшь кнопку Режим, но реально: из-за того, что опрос кнопки (строка 4) заREMирован получается "зависон" (что само по себе - логично)... И соль тут в следующем: стОит разREMировать строку 4 (равно как и перенести REMарк на строку 3) - на 1-й строке жки получаю: Задание = 40.00н - ("н" выделил жирным потому что) сначала печатается "График обработан" и сразу же (пару-тройку машинных циклов спустя) без какого бы то ни было ожидания нажатия выводится "Задание = 40.00" - 15 символов перезаписываются и полюбоваться отчётом не представляется возможным... Почему?
Трудно что-то сказать по обрывку кода, тем более, я сам ещё "зелёный" в Ардуино))
Если всё это одна функция SolderFromFile(), то скобки расставлены не верно(стр.55 ??).
Если же, представленный код - это функция , плюс ещё кусок чего-то, то тем более трудно разобраться