Доброй ночи. Поменял UNO на MEGA, скетч загрузился, но работать не хочет. Хотя все пины под теми же номерами.
//UNO
//__________________БЛОК ИЗМЕРЕНИЯ ТЕМПЕРАТУР
#include <OneWire.h> //Подключение библиотеки термометров
// Объявление пинов термометров ds18s20
int pin_sensor_col=A0; //Пин термодатчика колонны
int pin_sensor_wat=A1; //Пин термодатчика охлаждения
int pin_sensor_cub=A2; //Пин термодатчика куба
int pin_sensor_def=A3; //Пин термодатчика дефлегматора
// Объявление пинов исполнения
int pin_heater=8; //Синий - ТЭН
int pin_cooler=9; //Красный - Вентилятор
int pin_valve=10; //Зеленый - Клапан
int pin_pump=11; //Белый - Насос (ШИМ)
// Объявление пинов считывания из сети
int pin_volt=A4; //Пин вольтметра
//int pin_zero=2; //Пин прерывания зеро-кросс
//Cоздаём объекты класса OneWire для 4 датчиков температуры
OneWire ds_col(pin_sensor_col); // Датчик T° колонны на пине A0
OneWire ds_wat(pin_sensor_wat); // Датчик T° охлаждения на пине A1
OneWire ds_cub(pin_sensor_cub); // Датчик T° куба на пине A2
OneWire ds_def(pin_sensor_def); // Датчик T° дефлегматора на пине A3
//________Объявляем переменные температур
volatile int temp_col; // Температура ректификационной колонны
volatile int temp_wat; // Температура выходящей воды
volatile int temp_cub; // Температура куба
volatile int temp_def; // Температура дефлегматора
//Переменная периода опроса термодатчиков
long ds18b20_time;
//Переменная периода связи ПК и Ардуино
long string_time;
//Подвязывание рабочих переменных к библиотеке датчиков
byte i;
byte present = 0;
byte data[12];
byte addr_col[8];
byte addr_wat[8];
byte addr_cub[8];
byte addr_def[8];
//Строки приема и посыла в порт
String string_in;
String string_out;
//Переменные исполнения
//Нагрев
volatile long heater_previous; //Время последнего переключения нагрева
int heater_time; //Интервал переключения нагрева
int heater_open=0; //Время зажженного нагрева
int heater_close=0; //Время погасшего нагрева
int heater_multi=25; //Множитель для установки миллисекунд
int heater_mode=0; //Режим нагрева (0 - отключен, 1-турбо, 2-нагрев по Ружицкому, 3-нагрев по Брезенхему, 4-нагрев фазо-импульсный)
int heater_status=HIGH; //Состояние нагрева
// Переменные для Брезенхема
int heater_power=0; //% мощности нагрева
int heater_error; //Ошибка округления
int heater_reg; //ПGеременная для расчета
//Ветилятор охлаждения
int cool_status=0; //Состояние вентилятора (0 - выключен, 1-включен)
//Насос
int pump_value=0; //Производительность насоса 0-255 для ШИМ
//Клапан отбора
volatile long valve_previous; //Время последнего переключения клапана
volatile long valve_time; //Интервал переключения клапана
int valve_open=0; //Время открытого клапана
int valve_close=0; //Время закрытого клапана
int valve_multi=1000; //Множитель для установки миллисекунд
int valve_mode=0; //Режим работы клапана (0 - выключен, 1-включен)
int valve_status=HIGH; //Состояние клапана
//Переменные вольметра
volatile unsigned long volt_summ=0; //Сумма
volatile long volt_meas=0; //Измеренное напряжение
volatile long volt_aver=0; //Среднее
String volt; //Посыляемое напряжение в символах
long time_volt_meas=0; //Период измерения напряжения
int clc=0; //Число измерений
void setup()
{
// Объявляем скорость порта
Serial.begin(115200);
//Инициализация пинов управления
pinMode (pin_heater, OUTPUT); //Синий - ТЭН
pinMode (pin_cooler, OUTPUT); //фиолетовыйй - Вентилятор
pinMode (pin_valve, OUTPUT); //Серый - Клапан
pinMode (pin_pump, OUTPUT); //Белый - Насос (ШИМ)
//Инициализация пинов термодатчиков
pinMode(pin_sensor_col, INPUT); //Термодатчик колонны
pinMode(pin_sensor_cub, INPUT); //Термодатчик куба
pinMode(pin_sensor_wat, INPUT); //Термодатчик охлаждения
pinMode(pin_sensor_def, INPUT); //Термодатчик дефлегматора
//Инициализация пина вольтметра
pinMode(pin_volt, INPUT);
//Запрос термодатчикам на измерение температуры
if ( !ds_col.search(addr_col)) {}
if ( !ds_cub.search(addr_cub)) {}
if ( !ds_wat.search(addr_wat)) {}
if ( !ds_def.search(addr_def)) {}
//Инициируем датчики температуры
//Колонна
ds_col.reset();
ds_col.select(addr_col);
ds_col.write(0x44);
//Куб
ds_cub.reset();
ds_cub.select(addr_cub);
ds_cub.write(0x44);
//Охлаждение
ds_wat.reset();
ds_wat.select(addr_wat);
ds_wat.write(0x44);
//Дефлегматор
ds_def.reset();
ds_def.select(addr_def);
ds_def.write(0x44);
}
void loop()
{
//Чтение строки из ПК
if (Serial.available() > 0)
{
//Формат строки
//ТЭН Вентилятор Насос Клапан Конец строки
//xxx Cx Pxxx Vxxx #
String string_in = Serial.readStringUntil('#'); //Читаем строку из порта до знака окончания "#"
int lenstr = string_in.length(); //Определяем длину строки
if (lenstr == 13) //Проверка длины строки, если она=13, то:
{
//Вычленяем параметры мощности нагрева
heater_mode = string_in.substring (0,1).toInt();
heater_power = string_in.substring (1,3).toInt();
heater_open = string_in.substring (1,2).toInt();
heater_open = heater_multi;
heater_close = string_in.substring (2,3).toInt();
heater_close = heater_close*heater_multi;
//Вычленяем состояние вентилятора охлаждения
cool_status = string_in.substring (4,5).toInt();
//Вычленяем производитиельность насоса
pump_value = string_in.substring (6,9).toInt();
//Вычленяем параметры работы клапана
valve_mode = string_in.substring (10,11).toInt();
valve_open = string_in.substring (11,12).toInt();
valve_open=valve_open*valve_multi;
valve_close = string_in.substring (12,13).toInt();
valve_close=valve_close*valve_multi;
}
}
//Вольтметр
if (millis()-time_volt_meas>7) //По прошествии 7 миллисек
{
//time_volt_meas=millis(); //Обнуляем таймер
volt_meas=analogRead(pin_volt); //Измеряем напряжение в "0-1023"
volt_meas=volt_meas*volt_meas; //Возводим к вадрат
volt_summ=volt_summ+volt_meas; //Суммируем
clc++; //Считаем количество измерений
if (clc==1003) //Если количество измерений = 1003
{
volt_aver=volt_summ/1003; //Делим сумму на количество измерений
volt_aver=sqrt(volt_aver); //Извлекаем квадратный корень
volt_aver=volt_aver/2.89; //Переводим "0-1023" в вольты
if (volt_aver<10) {volt="00" + String(volt_aver);}
if (volt_aver<100 && volt_aver>9) {volt="0" + String(volt_aver);}
if (volt_aver<1000 && volt_aver>99) {volt=String(volt_aver);}
//volt="123";// + String(volt_aver);
volt_summ=0;
volt_meas=0;
volt_aver=0;
clc=0;
time_volt_meas=millis(); //Обнуляем таймер
}
}
//Опрос показаний датчиков температуры 1 раз в 850 мсек
if (millis()-ds18b20_time>850)
{
//Опрашиваем датчик колонны
present = ds_col.reset();
ds_col.select(addr_col);
ds_col.write(0xBE);
for ( i = 0; i < 9; i++)
{
data[i] = ds_col.read();
}
int16_t raw = (data[1] << 8) | data[0];
temp_col=raw / 1.6;
//Опрашиваем датчик куба
present = ds_cub.reset();
ds_cub.select(addr_cub);
ds_cub.write(0xBE);
for ( i = 0; i < 9; i++)
{
data[i] = ds_cub.read();
}
raw = (data[1] << 8) | data[0];
temp_cub=raw / 1.6;
//Опрашиваем датчик охлаждения
present = ds_wat.reset();
ds_wat.select(addr_wat);
ds_wat.write(0xBE);
for ( i = 0; i < 9; i++)
{
data[i] = ds_wat.read();
}
raw = (data[1] << 8) | data[0];
temp_wat=raw / 1.6;
//Опрашиваем датчик дефлегматора
present = ds_def.reset();
ds_def.select(addr_def);
ds_def.write(0xBE);
for ( i = 0; i < 9; i++)
{
data[i] = ds_def.read();
}
raw = (data[1] << 8) | data[0];
temp_def=raw / 1.6;
//Очередной запрос датчикам на измерение температуры
if ( !ds_col.search(addr_col)) {}
if ( !ds_cub.search(addr_cub)) {}
if ( !ds_wat.search(addr_wat)) {}
if ( !ds_def.search(addr_def)) {}
//Инициируем датчики температуры
//Колонна
ds_col.reset();
ds_col.select(addr_col);
ds_col.write(0x44);
//Куб
ds_cub.reset();
ds_cub.select(addr_cub);
ds_cub.write(0x44);
//Охлаждение
ds_wat.reset();
ds_wat.select(addr_wat);
ds_wat.write(0x44);
//Воздух
ds_def.reset();
ds_def.select(addr_def);
ds_def.write(0x44);
ds18b20_time=millis();
//Посылаем строку температур и напряжения в порт
string_out=String(temp_col) + '-' + String(temp_wat) + '-' + String(temp_cub) + '-' + String(temp_def) + '-' + volt;
//string_out=String(heater_power);
Serial.println (string_out);
}
//Работа насоса
analogWrite (pin_pump, pump_value);
//Работа вентилятора охлаждения
if (cool_status==1) {digitalWrite (pin_cooler, HIGH);}
else {digitalWrite (pin_cooler, LOW);}
//Работа клапана
if (valve_mode==0) {digitalWrite (pin_valve, LOW);}
else
{
unsigned long valve_current = millis();
if (valve_current - valve_previous > valve_time)
{
valve_previous=valve_current;
if (valve_status==LOW)
{
valve_status=HIGH;
valve_time=valve_open;
}
else
{
valve_status=LOW;
valve_time=valve_close;
}
digitalWrite(pin_valve, valve_status);
}
}
//Работа ТЭНа
if(heater_mode==0) {digitalWrite (pin_heater, LOW);} //Нагрев запрещен
if(heater_mode==1) {digitalWrite (pin_heater, HIGH);} //Турбонагрев
if(heater_mode==2) //Рабочий нагрев по Ружицкому
{
unsigned long heater_current = millis();
if(heater_current - heater_previous > heater_time)
{
heater_previous=heater_current;
if (heater_status==LOW)
{
heater_status=HIGH;
heater_time=heater_open;
}
else
{
heater_status=LOW;
heater_time=heater_close;
}
digitalWrite(pin_heater, heater_status);
}
}
if(heater_mode==3) //Рабочий нагрев по Брезенхему
{
if (heater_power==99) {heater_power=100;} //Долю мощности 99% считаем за 100%
heater_time=29;
unsigned long heater_current = millis();
if(heater_current - heater_previous > heater_time)
{
heater_previous = heater_current; //Cохраняем время последнего переключения
//Определяем надобность включить ТЭН
heater_reg = heater_power + heater_error;
if (heater_reg < 50)
{
heater_status=0;
heater_error=heater_reg;
}
else
{
heater_status=1;
heater_error=heater_reg-100;
}
digitalWrite(pin_heater,heater_status);
}
}
if(heater_mode==4) {}//Рабочий фазо-импульсный нагрев
}
Где капкан, друзья?