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