Відповісти

Введіть повідомлення і натисніть Надіслати
Параметри

Назад

Огляд теми (нові повідомленні вгорі)

Watchdog
2019-11-19 00:28:16

Как говорил один запрещённый у нас мыслитель: "Учиться, учиться и ещё раз учиться"!  smile  Параллелизм требуется!

mario512
2019-11-19 00:17:53

Накидал скетч, который управляет канальным вентилятором, регулируя мощность в зависимости от уровня влажности. Использую датчик АМ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);
  }
}

Підвал форуму