помогите с кодом

eclipllze
Offline
Зарегистрирован: 19.06.2017

всем привет, нужна помощь
есть два кода:

один отвечает за фоторезистор - когда освещенность становится низкой, загорается светодиод и издает звук пьезопищалка

второй отвечает за термодатчик KTY81/120 - с него принимаются, обрабатываются и выводятся данные, которые потом преобразуются в температуру

Подключил в одну общую схему - при закидывании кода по отдельности они работают отлично, а вместе шалят

Помогите, пожалуйста, с кодом, чтобы они работали вместе дружно

 

 

ПЕРВЫЙ КОД

int led = 10; //переменная с номером пина светодиода
int ldr = 1; //и фоторезистора
int pz = 11; //и пьезоизлучателя
 
void setup() //процедура setup
 
{
 
pinMode(led, OUTPUT); //указываем, что светодиод - выход
 
}
 
void loop() //процедура loop
 
{
 
if (analogRead(ldr) < 500) digitalWrite(led, HIGH), tone (pz, 100), delay(100), tone(pz, 700), delay(100), tone(pz, 140), delay(400); //если показатель освещенности меньше 500, то вкл. светодиод и мелодия
 
else digitalWrite(led, LOW), noTone (pz) ; //иначе выключаем
 
Serial.println(ldr); 
 
}
 
 
 
///////////////////////////////////////////////////////////////////////////////////////////////////////
 
 
ВТОРОЙ КОД
 
 
// термометр, датчик KTY81/120
#include <MsTimer2.h>
#include <Led4Digits.h>
 
#define MEASURE_PERIOD 500  // время измерения, * 2 мс
#define RO  3300  // сопротивление образцового резистора, Ом
#define MIN_ADC 132 // минимальное значение рабочего диапазона АЦП
#define MAX_ADC 410 // максимальное значение рабочего диапазона АЦП
#define POL_NUM 24  // число полюсов характеристики
 
int sensTable[POL_NUM][2] = {  // таблица характеристики датчика
  {-55, 490}, {-50, 515}, {-40, 567}, {-30, 624}, {-20, 684}, {-10, 747},
  {0, 815}, {10, 886}, {20, 961}, {25, 1000}, {30,1040}, {40, 1122},
  {50, 1209}, {60, 1299}, {70, 1392}, {80, 1490}, {90, 1591}, {100, 1696},
  {110, 1805}, {120, 1915}, {125, 1970}, {130, 2023}, {140, 2124}, {150, 2211}
};
 
int codToTempTable[MAX_ADC - MIN_ADC +1];  // таблица преобразования код в температуру
 
int timeCount;     // счетчик времени измерения
long  sumA0;       // переменная суммирования кодов АЦП
long  avarageTemp; // среднее значение температуры (сумма кодов АЦП, среднее значение * 500)
boolean flagTempReady;  // признак готовности измерения температуры
int temperature;  // рассчитанная температура, °C
 
// тип индикатора 1; выводы разрядов 5,4,3,2; выводы сегментов 6,7,8,9,10,11,12,13
Led4Digits disp(1, 5,4,3,2, 6,7,8,9,10,11,12,13);
 
void setup() {
  MsTimer2::set(2, timerInterrupt); // задаем период прерывания по таймеру 2 мс 
  MsTimer2::start();               // разрешаем прерывание по таймеру
  Serial.begin(9600); // инициализируем порт, скорость 9600 
 
  //--------- предварительный расчет значений температуры -------------
  // вычисление массива codToTempTable[]
  int codBeginPol=0;  // код полюса начала отрезка
  int codEndPol;  // код полюса конца отрезка
  float koeff;  // коэффициент для отрезка между полюсами
 
  // цикл перебора полюсов
  for ( int p= 0; p < (POL_NUM-1); p++ ) {
 
    // вычисление кода для следующего полюса N= Rx * 1023 / (Ro + Rx)
    codEndPol = (int)(((float)sensTable[p+1][1] * 1023.) / (RO + (float)sensTable[p+1][1]) + 0.5) - MIN_ADC ;                
    codToTempTable[codEndPol] = sensTable[p+1][0];  // температура для следующего полюса
 
    // вычисление коэффициента для отрезка
    koeff = (float)(sensTable[p+1][0] - sensTable[p][0]) / (float)(codEndPol - codBeginPol);
 
    // интерполяция температуры
    for ( int n = codBeginPol; n < codEndPol; n++ ) {
      codToTempTable[n]= sensTable[p][0] + (int)((float)(n - codBeginPol) * koeff +0.5 );
    }
    codBeginPol=codEndPol;    
  }    
}
 
void loop() { 
 
  if ( flagTempReady == true ) {
    flagTempReady= false;
    // данные готовы
 
    // вычисление температуры
    temperature = (int)((float)avarageTemp / 500. + 0.5);
 
    // проверка диапазона
    if (temperature < MIN_ADC) temperature= MIN_ADC;
    if (temperature > MAX_ADC) temperature= MAX_ADC;
 
    // выборка готового значения из массива
    temperature= codToTempTable[temperature - MIN_ADC];
    
    // вывод температуры на индикатор
    if (temperature >= 0) {
      // температура положительная
      disp.digit[3]= 0; // минус не светится
      disp.print((int)(temperature), 3, 1);   
    }
    else {
      // температура отрицательная
      disp.digit[3]= 0x40;  // отображается минус
      disp.print((int)(temperature * -1), 3, 1);         
    }
            
    // передача температуры на компьютер
    Serial.println(temperature);    
    }        
}
 
//-------------------------------------- обработчик прерывания 2 мс
void  timerInterrupt() {
  disp.regen(); // регенерация индикатора
 
  // измерение среднего значения темпрературы
  timeCount++;  // +1 счетчик выборок усреднения
  sumA0+= analogRead(A0);  // суммирование кодов канала A0 АЦП
 
  // проверка числа выборок усреднения
  if ( timeCount >= MEASURE_PERIOD ) {
    timeCount= 0;
    avarageTemp= sumA0; // перегрузка среднего значения 
    sumA0= 0;
    flagTempReady= true;  // признак готовности результата
    }  
}

 

bwn
Offline
Зарегистрирован: 25.08.2014

Для начала, это.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Чукча не читатель, чукча писатель?

IMHO Mauvais ton писать на форум, ничего перед этим на нем не читая.

Буквально вчера или позавчера уже писал:

чтобы объединить два скетча, их нужно переписать так, чтобы ни один из них не содержал delay().