Помогите разобраться как подружить два скетча
- Войдите на сайт для отправки комментариев
Пт, 28/10/2016 - 14:06
Это реализация алгоритма для управления 8 реле нагревательных элементов.
Может не очень складно, но как-то так... Функции требуемые выполняет.
Не могу к нему прилепить скетч замера температуры с двух датчиков, который позаимствовал на форуме....
По отдельности работают а вдвоем не хотят
byte LED=13;
int Temp; //Текущая температура канала
int Tn; //Наружная температура
byte Tnp=8; //Температура наружная пороговая которой даетсся разрешение на включение
byte Tmax=8; //Максимальная температура рабочего диапазона
byte Tmin=6; //Минимальная температура рабочего диапазона
byte pinV=3; //Номер pin для разрешения включения от вентилятора
byte pinT=4; //Номер pin для разрешения включения от датчика перегрева
byte i; //Номер включаемого реле
byte j; //Номер выключаемого реле
byte Rel[]={5, 6, 7, 8, 9, 10, 11, 12}; //Массив с номерами pin для подключения реле
void setup() {
for (i=0; i<=7; i++) {pinMode (Rel[i], OUTPUT); digitalWrite (Rel[i], HIGH);}
pinMode (LED,OUTPUT);
digitalWrite (LED, LOW);
pinMode (pinV,INPUT);
pinMode (pinT,INPUT);
i=0; J=0;
Serial.begin(9600);
}
void loop()
{
for (int k=1; k<=5; k++)
{
if (Tn>Tnp || digitalRead(pinV) == LOW || digitalRead(pinT) == LOW) //условия ИЛИ для блокировки нагревателей
{
for (int l=0; l<=7; l++) { digitalWrite (Rel[l], HIGH); i=0; j=0; delay (500);}
while ( digitalRead(pinT) == LOW)
{digitalWrite (LED, HIGH); delay(100); digitalWrite (LED, LOW);delay (300);}
while (digitalRead(pinV) == LOW)
{digitalWrite (LED, HIGH); delay(100); digitalWrite (LED, LOW);delay (300);
digitalWrite (LED, HIGH); delay(1000);digitalWrite (LED, LOW);delay (1200);}
while ( Tn>Tnp)
{digitalWrite (LED, HIGH); delay(100); digitalWrite (LED, LOW);delay (300);
digitalWrite (LED, HIGH); delay(100); digitalWrite (LED, LOW);delay (300);
digitalWrite (LED, HIGH); delay(1000); digitalWrite (LED, LOW);delay (300);
digitalWrite (LED, HIGH); delay(1000); digitalWrite (LED, LOW); delay(2000);}
}
digitalWrite (LED, HIGH); delay(800); digitalWrite (LED, LOW);delay (1000);
}
if (Temp<Tmin) {digitalWrite (Rel[i], LOW); i=i+1;}
if (Temp>Tmax) {digitalWrite (Rel[j], HIGH); j=j+1;}
if (i>7) {i=0;}
if (j>7) {j=0;}
}
от dimax позаимствовал
01#include <OneWire.h>02OneWire ds(2);03byteaddr1[8]={0x28,0x04,0x13,0x80,0x06,0x00,0x00,0xF8};04byteaddr2[8]={0x28,0x47,0x1F,0x5C,0x06,0x00,0x00,0xE6};0506volatileinttemp1,temp2;0708voidsetup(void) {09Serial.begin(9600);10WDTCSR=(1<<WDCE)|(1<<WDE);//установить биты WDCE WDE (что б разрешить запись в другие биты11WDTCSR=(1<<WDIE)| (1<<WDP2)|(1<<WDP1);// разрешение прерывания + выдержка 1 секунда12// (55 страница <a href="<a href="<a href="http://www.atmel.com/images/Atmel-8271-8-bit-AVR-Microcontroller-ATmega48A-48PA-88A-88PA-168A-168PA-328-328P_datasheet_Complete.pdf" rel="nofollow">http://www.atmel.com/images/Atmel-8271-8-bit-AVR-Microcontroller-ATmega48A-48PA-88A-88PA-168A-168PA-328-328P_datasheet_Complete.pdf</a>" rel="nofollow"><a href="http://www.atmel.com/images/Atmel-8271-8-bit-AVR-Microcontroller-ATmega48A-48PA-88A-88PA-168A-168PA-328-328P_datasheet_Complete.pdf" rel="nofollow">http://www.atmel.com/images/Atmel-8271-8-bit-AVR-Microcontroller-ATmega48A-48PA-88A-88PA-168A-168PA-328-328P_datasheet_Complete.pdf</a></a>" rel="nofollow">даташита</a>)13// снять все ремарки если нужно поменять разрешение14// ds.reset(); // сброс шины15// ds.select(addr2); //выставить адрес16// ds.write(0x4E); // разрешение записать конфиг17// ds.write(0x7F); // Th контроль температуры макс 128грд18// ds.write(0xFF); //Tl контроль температуры мин -128грд19// ds.write(0x60); // 0x60 12-бит разрешение, 0x00 -9бит разрешение20}2122voidloop(void) {23Serial.print("Temp1= ");24Serial.print(temp1/16.0);25Serial.print(" ");26Serial.print("Temp2= ");27Serial.println(temp2/16.0);2829}3031ISR (WDT_vect){//вектор прерывания WD32staticboolean n=0;// флаг работы: запрос температуры или её чтение33n=!n;34if(n) {ds.reset();// сброс шины35ds.write(0xCC);//обращение ко всем датчикам36ds.write(0x44);// начать преобразование (без паразитного питания)37}38else{ds.reset();39ds.select(addr1);40ds.write(0xBE);// Read Scratchpad (чтение регистров)41temp1 = ds.read() | (ds.read()<<8);//прочитаны 2 байта42// получение с 2-го датчика43ds.reset();44ds.select(addr2);45ds.write(0xBE);// Read Scratchpad (чтение регистров)46temp2 = ds.read() | (ds.read()<<8);//прочитаны 2 байта47}48}495051byte LED=13; int Temp; //Текущая температура канала int Tn; //Наружная температура byte Tnp=8; //Температура наружная пороговая которой даетсся разрешение на включение byte Tmax=8; //Максимальная температура рабочего диапазона byte Tmin=6; //Минимальная температура рабочего диапазона byte pinV=3; //Номер pin для разрешения включения от вентилятора byte pinT=4; //Номер pin для разрешения включения от датчика перегрева byte i; //Номер включаемого реле byte j; //Номер выключаемого реле byte Rel[]={5, 6, 7, 8, 9, 10, 11, 12}; //Массив с номерами pin для подключения реле void setup() { for (i=0; i<=7; i++) {pinMode (Rel[i], OUTPUT); digitalWrite (Rel[i], HIGH);} pinMode (LED,OUTPUT); digitalWrite (LED, LOW); pinMode (pinV,INPUT); pinMode (pinT,INPUT); i=0; J=0; Serial.begin(9600); } void loop() { for (int k=1; k<=5; k++) { if (Tn>Tnp || digitalRead(pinV) == LOW || digitalRead(pinT) == LOW) //условия ИЛИ для блокировки нагревателей { for (int l=0; l<=7; l++) { digitalWrite (Rel[l], HIGH); i=0; j=0; delay (500);} while ( digitalRead(pinT) == LOW) {digitalWrite (LED, HIGH); delay(100); digitalWrite (LED, LOW);delay (300);} while (digitalRead(pinV) == LOW) {digitalWrite (LED, HIGH); delay(100); digitalWrite (LED, LOW);delay (300); digitalWrite (LED, HIGH); delay(1000);digitalWrite (LED, LOW);delay (1200);} while ( Tn>Tnp) {digitalWrite (LED, HIGH); delay(100); digitalWrite (LED, LOW);delay (300); digitalWrite (LED, HIGH); delay(100); digitalWrite (LED, LOW);delay (300); digitalWrite (LED, HIGH); delay(1000); digitalWrite (LED, LOW);delay (300); digitalWrite (LED, HIGH); delay(1000); digitalWrite (LED, LOW); delay(2000);} } digitalWrite (LED, HIGH); delay(800); digitalWrite (LED, LOW);delay (1000); } if (Temp<Tmin) {digitalWrite (Rel[i], LOW); i=i+1;} if (Temp>Tmax) {digitalWrite (Rel[j], HIGH); j=j+1;} if (i>7) {i=0;} if (j>7) {j=0;} }