помогите с кодом
- Войдите на сайт для отправки комментариев
Пнд, 19/06/2017 - 08:32
всем привет, нужна помощь
есть два кода:
один отвечает за фоторезистор - когда освещенность становится низкой, загорается светодиод и издает звук пьезопищалка
второй отвечает за термодатчик 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; // признак готовности результата
}
}
Для начала, это.
Чукча не читатель, чукча писатель?
IMHO Mauvais ton писать на форум, ничего перед этим на нем не читая.
Буквально вчера или позавчера уже писал:
чтобы объединить два скетча, их нужно переписать так, чтобы ни один из них не содержал delay().