Ви не увійшли.
Как говорил один запрещённый у нас мыслитель: "Учиться, учиться и ещё раз учиться"! Параллелизм требуется!
Накидал скетч, который управляет канальным вентилятором, регулируя мощность в зависимости от уровня влажности. Использую датчик АМ2302(DHT22), RTC1302, AC Light Dimmer Module от RobotDyn, LCD Nokia 5101. Проблема в том, что в момент считывания данных с датчика DHT22 происходит просадка напряжения на выходе из диммира в среднем на 60-70 вольт. Подключенная лампа мигает один раз в пять секунд. В этот момент на Arduino Nano 3.0 "блымает" диод (TX). Что посоветуете? Не пинайте за код, в первой с этим имею дело.
AC Light Dimmer Module от RobotDyn: vcc-5v, gnd-gnd, z-0 - D2 pin, PWM - D11.
DHT22: vcc - 5v, data - D12, gnd-gnd.
Скетч:
#include <iarduino_RTC.h>
#include <LCD5110_Basic.h>
#include "DHT.h"
#include <TimerOne.h>
#define DHTPIN 12 // номер пина, к которому подсоединен датчик
extern uint8_t BigNumbers[];
extern uint8_t MediumNumbers[];
extern uint8_t SmallFont[];
unsigned long timing2;
int minuts;
int days;
int hourse;
int g_fan_speed = 0;
int g_fan_stat = 0;
volatile int i = 0; // Variable to use as a counter volatile as it is in an interrupt
volatile boolean zero_cross = 0; // Boolean to store a "switch" to tell us if we have crossed zero
int AC_pin = 11; // Output to Opto Triac
int dim = 128; // Dimming level (0-128) 0 = on, 128 = 0ff
int inc = 1; // counting up or down, 1=up, -1=down
int freqStep = 75; // This is the delay-per-brightness step in microseconds.
int h = 0;
int t = 0;
/* SCK / CLK, MOSI / DIN, DC, RST, CS */
LCD5110 lcd(3, 4, 5, 7, 6);
byte myList[][24] = {
// 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,16,17,18,19,20,21,22,23//часы
{ 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0}, //будние
{ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0}, //выходные
};
byte SpeedFan[][10] = {
{128, 110, 100, 90, 80, 70, 60, 50, 40, 30},
};
DHT dht(DHTPIN, DHT22);
iarduino_RTC time(RTC_DS1302, 10, 8, 9);
void setup() {
delay(300);
pinMode(AC_pin, OUTPUT); // Set the Triac pin as output
attachInterrupt(0, zero_cross_detect, RISING); // Attach an Interupt to Pin 2 (interupt 0) for Zero Cross Detection
Timer1.initialize(freqStep); // Initialize TimerOne library for the freq we need
Timer1.attachInterrupt(dim_check, freqStep);
Serial.begin(9600);
dht.begin();
lcd.InitLCD(60);
time.begin();
//time.settime(0,13,16,13,11,19,3);
minuts = time.minutes;
lcd_stat_change(0, 0, 1);
lcd_stat_change(0, 0, 2);
statvent(0, 0);
driver_fan(hourse, days);
}
void zero_cross_detect() {
zero_cross = true; // set the boolean to true to tell our dimming function that a zero cross has occured
i = 0;
digitalWrite(AC_pin, LOW); // turn off TRIAC (and AC)
}
// Turn on the TRIAC at the appropriate time
void dim_check() {
if (zero_cross == true) {
if (i >= dim) {
digitalWrite(AC_pin, HIGH); // turn on light
i = 0; // reset time step counter
zero_cross = false; //reset zero cross detection
}
else {
i++; // increment time step counter
}
}
}
void statvent(int stat_fan, int speed_fan) {
Serial.println((String)"Val:" + stat_fan + "Fan: " + speed_fan);
if (stat_fan == 1) {
lcd.clrRow(5, 10);
lcd.print((String)"Fan:on" + " Spd:" + speed_fan, LEFT, 40);
} else {
lcd.clrRow(5, 10);
lcd.print("Fan:off", LEFT, 40);
};
}
void lcd_stat_change(int h, int t, int m) {
if (m == 1) {
lcd.clrScr();
}
lcd.setFont(SmallFont);
lcd.print(time.gettime("d-m-y, D"), 0, 0);
if (m == 2 ) {
lcd.clrRow(1, 10);
lcd.clrRow(2, 10);
lcd.setFont(MediumNumbers);
lcd.print(time.gettime("H"), 15, 15);
lcd.setFont(SmallFont);
lcd.print(":", CENTER, 20);
lcd.setFont(MediumNumbers);
lcd.print(time.gettime("i"), 45, 15);
}
if (m == 3) {
lcd.clrRow(4, 10);
lcd.setFont(SmallFont);
lcd.printNumI(h, LEFT, 35);
lcd.printNumI(t, 45, 35);
lcd.print("%", 15, 35);
lcd.print("C", 60, 35);
}
}
void driver_fan(int h, int d) {
int Int;
if ( d == 0 || d == 6) {
Int = 1;
} else {
Int = 0;
}
int stat = myList[Int][h];
if ( stat == 1 ) {
g_fan_stat = 1;
} else {
g_fan_stat = 0;
}
}
void driver_fan_speed(int vl) {
Serial.println((String)"g_fan_stat : " + g_fan_stat);
Serial.println((String)"vl : " + vl);
if (g_fan_stat > 0) {
int speed_fan = round(vl / 10);
dim = SpeedFan[0][speed_fan];
g_fan_speed = (speed_fan * 10);
Serial.println((String)"пиздец" + g_fan_speed);
} else {
dim = 128;
}
}
void loop() {
time.gettime();
int nd = time.weekday;
int nh = time.Hours;
int mh = time.minutes;
if (millis() - timing2 > 5000) {
timing2 = millis();
h = dht.readHumidity();
t = dht.readTemperature();
Serial.println(round(h / 10));
lcd_stat_change(h, t, 3);
statvent(g_fan_stat, g_fan_speed);
driver_fan_speed(h);
}
if (days != time.day) {
days = time.day;
lcd_stat_change(h, t, 1);
lcd_stat_change(h, t, 3);
lcd_stat_change(h, t, 2);
}
if (minuts != time.minutes) {
minuts = time.minutes;
Serial.println((String)g_fan_stat + " : " + g_fan_speed);
lcd_stat_change(h, t, 2);
}
if (hourse != time.Hours) {
hourse = time.Hours;
driver_fan(hourse, days);
}
}