andr128,огромное спасибо, с Вашим примером все заработало))
Только переменную TempC на float пришлось изменить для большей плавности. Теперь значения буду подбирать для реальных условий, да и код надо в порядок привести.
И конечно отдельное спасибо Admin'у этого форума за помощь, и замечательный многоканальный димер .
вот такой код получился, он конечно требует доработки(хотелось бы больше плавности при изменении скорости вентилятора),но основную задачу выполняет и это очень радует ))
PHP код:
#include <MsTimer2.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include "nanopins.h" //быстрое управление пинами
#include <TimerOne.h> //использует Timer1
#define VAR_REZ A0
#define VAR_REZ2 A1
#define LM_35 A5
#define ONE_WIRE_BUS 10 // датчик DS1820 DATA подкл. на pin 10
#define RES_TEMP 12 // разрешение (точность) темп. датчика в битах
volatile uint8_t tic, Dimmer1, Dimmer2, Dimmer3;
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress Thermometer; // адрес устройства
float TempC=0;
int led = 13;
void setup()
{
Serial.begin(9600);
sensors.begin(); // Start up the library
sensors.getAddress(Thermometer, 0); // получить адрес DS18B20 (0 - 1 датчик)
sensors.setResolution(Thermometer, RES_TEMP); // установить разрешение (точность)
sensors.setWaitForConversion(false); // отключить ожидание при изм.темп.
// время на изм. должно быть > 750ms
sensors.requestTemperatures(); // Команда на измерение температуры,
// выборка произойдет по прерыванию таймера через 2 сек (первый раз)
MsTimer2::set(2000, Tizm); // установка таймера на 2 сек. для изм. температуры
MsTimer2::start(); // запустить таймер
D4_Out; //Настраиваем порт на выход Dimmer1
D5_Out; //Настраиваем порт на выход Dimmer2
D6_Out; //Настраиваем порт на выход Dimmer3
D4_Low; D5_Low; D6_Low; //установить на выходах низкий уровень сигнала
D2_In; //настраиваем порт на вход для отслеживания прохождения сигнала через ноль
pinMode(led, OUTPUT);
Serial.begin(9600);
Serial.println("Start");
attachInterrupt(0, detect_up, FALLING); // настроить срабатывание прерывания int0 на pin 2
Timer1.initialize(40); // Интервал срабатывания таймера в мкс
Timer1.attachInterrupt(halfcycle); //будет вызыватся каждый раз при отсчете заданого времени
Timer1.stop();
}
//********************обработчики прерываний*******************************
void halfcycle() //прерывания таймера
{
tic++; //счетчик
if(Dimmer1 < tic ) D4_High; //управляем выходом
if(Dimmer2 < tic ) D5_High; //управляем выходом
if(Dimmer3 < tic ) D6_High; //управляем выходом
}
void detect_up() // обработка внешнего прерывания. Сработает по переднему фронту синусоиды
{
tic=0; //обнулить счетчик
Timer1.resume(); //запустить таймер
attachInterrupt(0, detect_down, RISING); //перепрограммировать прерывание на другой обработчик
}
void detect_down() // обработка внешнего прерывания. Сработает по заднему фронту синусоиды
{
Timer1.stop(); //остановить таймер
D4_Low; D5_Low; D6_Low; //логический ноль на выходы
tic=0; //обнулить счетчик
attachInterrupt(0, detect_up, FALLING); //перепрограммировать прерывание на другой обработчик
}
void Tizm() //обработка прерывания таймера - изм температуры
{
TempC = sensors.getTempC(Thermometer); // Получить температуру в градусах
sensors.requestTemperatures(); // Команда на измерение температуры для следующего раза
}
//*************************************************************************
void loop()
{
int valrez = analogRead(VAR_REZ);
int valrez2 = analogRead(VAR_REZ2);
int tempmin = map(valrez,147,1023,2000,5000) ;
int tempmax = map(valrez2,135,1023,2000,5000) ;
Serial.print(" Requesting temperatures...");
Serial.println("DONE");
Serial.print("min temp-");
Serial.println(tempmin);
Serial.print("max temp-");
Serial.println(tempmax);
Serial.println(valrez);
Serial.println(valrez2);
int pwmval = map(TempC*100,tempmin,tempmax,110,60);
Serial.print("pwm-");
Serial.println(pwmval);
if (TempC*100<tempmin)
{Dimmer1=255;}
else if (TempC*100>tempmax)
{Dimmer1=0;}
else if (TempC*100>tempmin)
{Dimmer1=pwmval;}
Serial.print("Temperature: ");
Serial.print(TempC);
if (TempC*100>tempmin) digitalWrite(led, HIGH);
if (TempC*100<tempmin) digitalWrite(led, LOW);
delay(200);
}