Поменял UNO на MEGA, скетч не работает

Доброй ночи. Поменял 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) {}//Рабочий фазо-импульсный нагрев
}

Где капкан, друзья?

Что именно не работает? И неплохо бы схему…
volatile режет глаз. В чём его сакральный смысл в данном случае?

Да, собственно вообще ничего. Управляю ардуиной через пк. С уной связка работает нормально. С мегой молчит. Все пины одинаковые, скетч компилятор скушал нормально, загрузил в мегу, но… сейчас уже почти сплю, извини, завтра с утра скину схему, только схему чего? Пока вместо оптронов для управления симисторами заменил просто на светодиоды, термодатчики такие же, подключены стандартно так же к тем же пинам, что и уно.

самогон не варится?

:))) Да нет, с уной варится отлично. Но она осталась на даче в лаборатории. А дома только мега завалялась. Для программных экспериментов хотел ее приспособить, но не хочет, зараза. Скетч тот же, пины те же, прога на ПК та же, скетч в мегу грузится… Не пойму, что ей надо? Плата, вроде, рабочая: скетчик с миганием светодиодами отрабатывает.

1 лайк

стр.46, 47, 62, 63 - надо unsigned

В принципе, правильно, нужно “беззнаково”. Поменял на unsigned. Ноль результата. И, к тому же, на уне-то все работает!

Если код неоднозначный, компилятор может на своё усмотрение решить

Я бы прошёлся по логике программы, выводя в сериал метки.
Сначала из setup() , и дальше смотреть условия, и проверять, где зависает

Конечно, это правильный путь. Но, повторюсь: на Уне-то все работает совершенно нормально! Выходит дело, для каждой платы надо свой скетч писать?

Результат где? В мониторе порта есть вывод?
Если просишь помощи - так рассказывай подробно всё, а не как партизан.

Отвечу позже, увы. Сегодня у меня работа, ухожу на сутки. Завтра отосплюсь, займусь монитором.

фьюзы проверь

вообще-то да

А в чем тогда принципиальная разница в тексте скетча для меги и для уно? Команды те же, их последовательность та же, номера пинов те же…

но означают эти пины совсем другое… например

Ни в чём, если руки прямые. И голова, само собой.

Раз повторяетесь, рискну дать совет: работайте с Уно, забудьте про Мегу.

Ответ на этот вопрос Вы можете найти сами сами.
Рутина, конечно. Но маловероятно, что кто-то захочет заниматься этой рутиной, чтобы удовлетворить ваше любопытство.

Квалификация моя на уровне плинтуса. Я понимаю, что умею делать самый мизер и плохо в вопросе программирования ориентируюсь. До сих пор писал скетчи для платы, которая была под рукой. Мега или уно. И каждый раз, все-таки, платы начинали работать. Проба поменять платы местами - это впервые, и непонятный мне облом. Чисто логически предполагаю, что в скетче ЕСТЬ указание, какую плату надо использовать. Только где оно, это указание? Единственное, что нашел, в инструментах ide надо указывать разновидность ардуины. Так это я сделал в первую очередь. Так что, рутинную проблему решать форумчан я не прошу. А хотелось бы подсказки, в каком месте искать капкан.

Ещё может просто контакта где-то не быть. Непропай. Посмотреть через ув. стекло, прозвонить…
А так, да, сериал обычно помогает

начните с устранения недочетов, на которые Вам уже указали. Например с типа переменной для таймера или удаления лишних волатилей
Кроме того, Вы собирались “заняться монитором” - то есть добавить в код вывод значений переменных в разные моменты выполнения. Как успехи?