Ниже код для домашней метеостанции, на улице сгорит датчик.
Предыдущий код подобного — пример подключения ESP8266 01 модуля к Arduino UNO через TX/RX
Считывал значения и изменения освещения, отправлял на сервер. Сервер записывал значения в CSV формат. Отдельной страницей выдавал массив значений в JSON формате и уже можно было обработать
//#include <Wire.h> // Подключаем библиотеку для работы с шиной I2C
//#include <LiquidCrystal_I2C.h> // Подключаем библиотеку для работы с LCD дисплеем по шине I2C
//LiquidCrystal_I2C lcd(0x27,20,4); // Объявляем объект библиотеки, указывая параметры дисплея (адрес I2C = 0x27, количество столбцов = 16, количество строк = 2)
#include<time.h>
#include <avr/wdt.h>
#include "DHT.h"
//#include <ArduinoJson.h>
#include <WiFiEsp.h>
// Для сброса счетчика арБуино.
void(* resetFunc) (void) = 0;
void reset(void)
{
resetFunc();
wdt_enable(WDTO_15MS); // resets the MCU after 15 milliseconds
while (true);
}
//DHT11
constexpr auto data_pin = 4; // информация ДХТ. Буква S
constexpr auto vPin = 2; // питания для дхт дхт пин (+). На плате не подписан. GND в - блин надо, иначе сгорит нафиг https://antebeot.world/blog/2023/11/06/%d0%bf%d1%80%d0%b8%d0%bc%d0%b5%d1%80-%d0%bf%d0%be%d0%b4%d0%ba%d0%bb%d1%8e%d1%87%d0%b5%d0%bd%d0%b8%d1%8f-esp8266-%d0%bc%d0%be%d0%b4%d1%83%d0%bb%d1%8f-%d0%ba-arduino-uno-%d1%87%d0%b5%d1%80%d0%b5%d0%b7-t/
constexpr auto dhtType = DHT11;
DHT dht(data_pin, dhtType);
//WIFIESP
int status = WL_IDLE_STATUS;
int reqCount = 0;
int iteration = 0;
WiFiEspServer server(80);
#ifndef HAVE_HWSERIAL1
#include "SoftwareSerial.h"
SoftwareSerial Serial1(6, 7); // RX, TX не спутать блин.. Лучше резисторы добавить
#endif
char ssid[] = "TP_LINK"; // your network SSID (name)
char pass[] = "PqCCugF0"; // your network password
/*
Иницилизирует DHT модуль, для получения температуры и влажности
*/
void initDHT(void){
dht.begin();
pinMode(vPin, OUTPUT);
}
/*
Подает питание на модуль DHT
*/
void enableDHT(void)
{
digitalWrite(vPin, HIGH);
}
/*
Отключает питание на модуль DHT
*/
void disableDHT(void)
{
digitalWrite(vPin, LOW);
}
/*
Читает информацию с фоторезистора, принимает WiFiEspClient из цикла обработки модуля. Вторая переменная это пин фоторезистора для чтения его значения, аналогового.
*/
void readPhotoRezisterAndSendData(WiFiEspClient client, uint8_t photoRezister = A0)
{
client.print("{\"photoSensor\": ");client.print(analogRead(A0));client.print("}" );
//client.print(t);client.print(", \"tempF\":");client.print(f);
//client.println("}");
//DynamicJsonDocument doc(128);
//doc["photoSensor"] = ;
//serializeJson(doc, client);
}
// Читает значение с модуля DHT и передает клиенту WifiESP в JSON формате
void readDHTAndSendData(WiFiEspClient client)
{
enableDHT();
delay(1000);
float h = dht.readHumidity();
float t = dht.readTemperature();
float f = dht.readTemperature(true);
client.print("{\"humanity\": ");client.print(h);client.print(", \"temp\":" );client.print(t);client.print(", \"tempF\":");client.print(f);
client.println("}");
/*DynamicJsonDocument doc(128);
if (!isnan(h) && !isnan(t) && !isnan(f)) {
doc["humidity"] = h;
doc["temp"] = t;
doc["tempF"] = f;
} else {
doc["error"] = "Failed to read from DHT sensor";
}
*/
disableDHT();
// Serial.println(h);
//serializeJson(doc, client);
}
// Для цикла и счетчика обработки
unsigned long previousTime = millis(); // or millis()
long timeInterval = 60000 * 15;//* 60;
// Абсолютно ненужное для светоидоида разноцветного. Пины для красного, синего и зеленного.
constexpr auto rPin = 9;
constexpr auto bPin = 10;
constexpr auto gPin = 11;
// Включить или выключить свет. Пины для аналогового вывода должны иметь на плате символ ~
// Контролируют они "силу тока". Первая перменная это красный цвет, остальные опционально зеленный и синий.
// Практика показала, что ниже 128 не будет нормально работать
void rgb_set(int r, int g = 0, int b = 0)
{
analogWrite(rPin, r);
analogWrite(gPin, g);
analogWrite(bPin, b);
}
// Последнее значение фото резистора
int last_photo_rezister = 0;
// Минимальное значение фоторезистора для значения, чт обы отправить данные на сервер
int minRezister = 12;
static int r,g,b;// глоабальные переменные. Можно обозначить static . Для сохранения значения для светоидоида разноцветного
// Отправляет данные на сервер, на пхп скрипт.
// У меня этот сервер был на виртуальной машине убунту и скрипт был примитивный.
void sendData(void)
{
rgb_set(rand() % 256, rand() % 256, rand() % 256);
//last_send_millis = millis();
constexpr auto def_ip_1 = "10.42.0.1"; // первый вариант адреса сервера
constexpr auto def_ip_2 = "192.168.43.225"; // второй вариант адреса сервера
constexpr auto def_port = 5960; // порт
constexpr auto page = "/test.php"; // страница куда будут передаваться данные в GET формате для PHP
// PHP скрипт записывал данные в CSV формате, сам скрипт тривиальный
WiFiEspClient cli;
if(cli.connect(def_ip_2, def_port))
{
Serial.println("Connected to def ip 2");
}
else if(cli.connect(def_ip_1, def_port))
{
Serial.println("Connected to def ip 1");
}
else
{
Serial.println("Err to send info");
return;
}
cli.print("GET ");cli.print(page);
//
enableDHT();
delay(1000);
float h = dht.readHumidity();
// float t = dht.readTemperature();
float f = dht.readTemperature(true);
disableDHT();
auto p = analogRead(A0);
cli.print("?h=");cli.print(h);cli.print("&");
cli.print("t=");cli.print(f);cli.print("&");
cli.print("p=");cli.print(p);cli.println(" HTTP/1.1");
cli.println("Host: arbuino.sender");
cli.println("Connection: close");
cli.println();
Serial.println("Info was send; Answer:");
while (cli.available()) {
char c = cli.read();
Serial.write(c);
}
cli.stop();
rgb_set(0,0,0);
}
// главный обработчик
void loop()
{
//delay(100);
//reset();
//Serial.println("was reset");
WiFiEspClient client = server.available();
if (client) {
Serial.println("New client");
String httpRequest = "";
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
Serial.write(c);
httpRequest += c;
if (c == '\n' && currentLineIsBlank) {
Serial.println("Sending response");
client.print(
"HTTP/1.1 200 OK\r\n"
"Content-Type: application/json\r\n"
"Connection: close\r\n"
"\r\n");
// получение температуры с датчика ДХТ
if (httpRequest.indexOf("GET /temp") != -1) {
// Обработка запроса /temp
Serial.println("temp get");
readDHTAndSendData(client);
} else if(httpRequest.indexOf("GET /light") != -1) // значение фоторезистора
{
readPhotoRezisterAndSendData(client);
}
//#define PARSEHTMLDATA(w) httpRequest.substring(httpRequest.indexOf(w) + sizeof(w)) // макрос не рабочий
//#define COLOR(p, v)
else if(httpRequest.indexOf("GET /diod?r=") != -1) // выставляет значение для красного в светодиоде, не проверялось
{
auto data=PARSEHTMLDATA("GET /diod?r=");// + sizeof("GET /diod?r="));
r = data.toInt();
rgb_set(r,g,b);
}
else if(httpRequest.indexOf("GET /diod?g=") != -1) // выставляет значение для зелёного в светодиоде, не проверялось
{
auto data=PARSEHTMLDATA("GET /diod?g=");// + sizeof("GET /diod?r="));
g = data.toInt();
rgb_set(r,g,b);
}
else if(httpRequest.indexOf("GET /diod?b=") != -1) // выставляет значение для синего в светодиоде, не проверялось
{
Serial.println(httpRequest.indexOf("GET /diod?b="));
String data = httpRequest.substring(httpRequest.indexOf("GET /diod?b=") + sizeof("GET /diod?b=") - 1);
Serial.print("DATA:");
Serial.println(data);
int b = data.toInt();
Serial.println("b for now is");
Serial.println(b);
rgb_set(r, g, b);
}
//else if(httpRequest.)
else if (httpRequest.indexOf("GET /lamp?pin=") != -1) {
// Обработка запроса /lamp?pin=$ID
// Ваш код обработки включения лампы (parseInt)
//auto data=httpRequest.substring(httpRequest.indexOf("GET /lamp?pin="));
//auto ID = data.toInt();
} else if (httpRequest.indexOf("GET /off?pin=") != -1) {
// Обработка запроса /off?pin=$ID
// Ваш код обработки выключения лампы (parseInt)
}
break;
}
if (c == '\n') {
currentLineIsBlank = true;
} else if (c != '\r') {
currentLineIsBlank = false;
}
}
}
delay(10);
client.stop();
Serial.println("Client disconnected");
} // client
unsigned long currentTime = millis(); // or millis()
// Enter the If block only if at least 800 micros (or millis) has passed since last time
int s = analogRead(A0);
if ( currentTime - previousTime > timeInterval || ( s > 50 && s > last_photo_rezister) ) {
// do action
Serial.println("send data");
Serial.println(s);
sendData();
previousTime = currentTime;
last_photo_rezister = s;
iteration++;
if (iteration > 60) reset();
}
}
//void lcdTest(void)
//{
/*lcd.init(); // Инициируем работу с LCD дисплеем
lcd.backlight(); // Включаем подсветку LCD дисплея
lcd.setCursor(0, 0); // Устанавливаем курсор в позицию (0 столбец, 0 строка)
lcd.print("LCD"); // Выводим текст "LCD", начиная с установленной позиции курсора
lcd.setCursor(0, 1); // Устанавливаем курсор в позицию (0 столбец, 1 строка)
lcd.print("text"); // Выводим текст "www.iarduino.ru", начиная с установленной позиции курсора
*/
//}
void setup()
{
srand(millis() + time(NULL));//time(NULL));
//rgb_set(255,255,255);
//delay(1000);
rgb_set(255,0,0);
// delay(1000);
rgb_set(0,255,0);
// delay(1000);
rgb_set(0,0,255);
// delay(1000);
rgb_set(128,255,255);
//delay(1000);
Serial1.begin(9600);
Serial.begin(19200);
initDHT();
// Initialize ESP module
WiFi.init(&Serial1);
if (WiFi.status() == WL_NO_SHIELD) {
Serial.println("WiFi shield not present");
while (true);
}
while (status != WL_CONNECTED) {
Serial.print("Attempting to connect to WPA SSID: ");
Serial.println(ssid);
status = WiFi.begin(ssid, pass);
// WiFi.beginAP(ssid, 10, pass, ENC_TYPE_WPA2_PSK); // если нужно АП режим, что нам и нужно будет в будующем
}
Serial.println("You're connected to the network");
printWifiStatus();
server.begin();
}
void printWifiStatus()
{
// print the SSID of the network you're attached to
Serial.print("SSID: ");
Serial.println(WiFi.SSID());
// print your WiFi shield's IP address
IPAddress ip = WiFi.localIP();
Serial.print("IP Address: ");
Serial.println(ip);
// print where to go in the browser
Serial.println();
Serial.print("To see this page in action, open a browser to http://");
Serial.println(ip);
Serial.println();
}
<!DOCTYPE html>
<html>
<head>
<!-- Load the AJAX API -->
<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script type="text/javascript">
google.charts.load('current', { packages: ['line'] }).then(function () {
$.ajax({
url: 'http://localhost:5960/json.php',
dataType: 'json'
}).done(function (jsonData) {
var data = new google.visualization.DataTable();
data.addColumn('string', 'Время');
data.addColumn('number', 'Влажность');
data.addColumn('number', 'Температура(фаренгейт)');
data.addColumn('number', 'Фоторезистор');
// Assuming jsonData is an array of objects
for (var i = 0; i < jsonData.length; i++) {
var row = [
new Date(jsonData[i].unixtime * 1000).toString(),
parseFloat(jsonData[i].humanity),
parseFloat(jsonData[i].temp),
parseFloat(jsonData[i].photorezister)
];
data.addRow(row);
}
var options = {
chart: {
title: 'Статистика погоды'
},
width: $(window).width(),
height: $(window).height()*0.75
//width: 1200,
//height: 1200
};
var chart = new google.charts.Line(document.getElementById('chart_div'));
chart.draw(data, google.charts.Line.convertOptions(options));
}).fail(function (jq, text, errMsg) {
console.log(text + ': ' + errMsg);
});
});
</script>
</head>
<body>
<!-- Div that will hold the chart -->
<div id="chart_div"></div>
</body>
</html>
Код ниже, пример для проигрывания мелодий на ультразвуковой мембране. Можно сделать #define PLAY_FROM_SERIAL и передавать мелодию через Python скрипт или любое другое по Serial. По умолчанию играет мелодию, если вода найдена датчиком для воды.
/*
for works need a ultrasound generator and water sensor. you can cut water sensor and just to play a melody.
https://forum.arduino.cc/t/play-smoke-on-the-water-melody/83628 from here a pinch.h
*/
class Frequencies {
public:
static constexpr auto num_notes = 89;
protected:
const char* noteNames[num_notes] = {
"NOTE_DS8", "NOTE_D8", "NOTE_CS8", "NOTE_C8", "NOTE_B7", "NOTE_AS7", "NOTE_A7",
"NOTE_GS7", "NOTE_G7", "NOTE_FS7", "NOTE_F7", "NOTE_E7", "NOTE_DS7",
"NOTE_D7", "NOTE_CS7", "NOTE_C7", "NOTE_B6", "NOTE_AS6", "NOTE_A6", "NOTE_GS6",
"NOTE_G6", "NOTE_FS6", "NOTE_F6", "NOTE_E6", "NOTE_DS6", "NOTE_D6", "NOTE_CS6",
"NOTE_C6", "NOTE_B5", "NOTE_AS5", "NOTE_A5", "NOTE_GS5", "NOTE_G5", "NOTE_FS5",
"NOTE_F5", "NOTE_E5", "NOTE_DS5", "NOTE_D5", "NOTE_CS5", "NOTE_C5", "NOTE_B4",
"NOTE_AS4", "NOTE_A4", "NOTE_GS4", "NOTE_G4", "NOTE_FS4", "NOTE_F4", "NOTE_E4",
"NOTE_DS4", "NOTE_D4", "NOTE_CS4", "NOTE_C4", "NOTE_B3", "NOTE_AS3", "NOTE_A3",
"NOTE_GS3", "NOTE_G3", "NOTE_FS3", "NOTE_F3", "NOTE_E3", "NOTE_DS3", "NOTE_D3",
"NOTE_CS3", "NOTE_C3", "NOTE_B2", "NOTE_AS2", "NOTE_A2", "NOTE_GS2", "NOTE_G2",
"NOTE_FS2", "NOTE_F2", "NOTE_E2", "NOTE_DS2", "NOTE_D2", "NOTE_CS2", "NOTE_C2",
"NOTE_B1", "NOTE_AS1", "NOTE_A1", "NOTE_GS1", "NOTE_G1", "NOTE_FS1", "NOTE_F1",
"NOTE_E1", "NOTE_DS1", "NOTE_D1", "NOTE_CS1", "NOTE_C1", "NOTE_B0"
};
const unsigned int noteFrequencies[num_notes] = {
4978, 4699, 4435, 4186, 3951, 3729, 3520, 3322, 3136, 2960, 2794, 2637,
2489, 2349, 2217, 2093, 1976, 1865, 1760, 1661, 1568, 1480, 1397, 1319,
1245, 1175, 1109, 1047, 988, 932, 880, 831, 784, 740, 698, 659, 622, 587,
554, 523, 494, 466, 440, 415, 392, 370, 349, 330, 311, 294, 277, 262, 247,
233, 220, 208, 196, 185, 175, 165, 156, 147, 139, 131, 123, 117, 110, 104,
98, 93, 87, 82, 78, 73, 69, 65, 62, 58, 55, 52, 49, 46, 44, 41, 39, 37,
35, 33, 31
};
public:
unsigned int getFrequency(const char* noteName) {
for(int i = 0; i < num_notes; i++) {
if(strcmp(noteName, noteNames[i]) == 0) {
return noteFrequencies[i];
}
}
return 0;
}
unsigned int getFrequency(unsigned short x) {
if (x > num_notes) return 0;
return noteFrequencies[x];
}
};
//Датчик воды, пин для чтения, пин для подачи + на мембрану, для UART baud rate
constexpr auto waterSensorInputPin = A0;
constexpr auto pinOfUltraSound = 9;
constexpr auto baundSpeed = 9600;
// Минимальное значения сенсора воды для мелодии
constexpr auto minWaterLevel = 100;
.// задержка перед новым звуком
constexpr auto toneDelay = 1000;
void setup() {
pinMode(waterSensorInputPin, INPUT); // аналоговый вход
pinMode(pinOfUltraSound, OUTPUT); //
// put your setup code here, to run once:
Serial.begin(baundSpeed);
}
#ifdef PLAY_FROM_SERIAL
Frequencies mFrequencies; //
void splitStringAndPlay(String str, char delimiter) {
int oldIndex = 0;
int index = str.indexOf(delimiter, oldIndex);
while(index != -1){
String noteName = str.substring(oldIndex, index);
oldIndex = index + 1;
play(noteName);
index = str.indexOf(delimiter, oldIndex);
}
// проигрывание последней ноты
String lastNoteName = str.substring(oldIndex);
play(lastNoteName);
}
void play(String noteName) {
unsigned int frequency = mFrequencies.getFrequency(noteName.c_str());
if(frequency == 0) { // если частота не найдена, пропустим эту ноту
Serial.println("Неизвестная нота: " + noteName);
return;
}
tone(pinOfUltraSound, frequency);
delay(toneDelay); // время звучания ноты
noTone(pinOfUltraSound);
}
void loop()
{
int wStatus = analogRead(waterSensorInputPin);
Serial.println(wStatus);
if (wStatus < minWaterLevel) return;
if (!Serial.available())
return;
String data = Serial.readStringUntil('\n');
splitStringAndPlay(data, ',');
delay(1000); // Пауза перед повторением мелодии
}
#else
void loop() {
Frequencies mFrequencies;
int wStatus = analogRead(waterSensorInputPin);
Serial.println(wStatus);
if (wStatus > minWaterLevel)
{
// Отрывок из мелодии "Кузнечик"
const char* melody[] = {"NOTE_E4", "NOTE_G4", "NOTE_A4", "NOTE_A4", "NOTE_G4", "NOTE_E4", "NOTE_G4", "NOTE_D4"};
const int noteDurations[] = {200, 200, 200, 200, 200, 200, 200, 200}; // Длительность каждой ноты в миллисекундах
int melodyLength = sizeof(melody) / sizeof(melody[0]);
for (int i = 0; i < melodyLength; i++) {
unsigned int frequency = mFrequencies.getFrequency(melody[i]);
tone(pinOfUltraSound, frequency);
delay(noteDurations[i]); // Подождите длительность ноты, прежде чем перейти к следующей
}
noTone(pinOfUltraSound); // Отключение звука после окончания мелодии
delay(1000); // Пауза перед повторением мелодии
}
Serial.println("подача на ультразвук выкл");
noTone(pinOfUltraSound);
delay(1000);}
#endif
import serial
import time
class PlaySounder:
def __init__(self, f = 'melody.txt', _serial = '/dev/ttyUSB0', bs = 9600):
self.melodies = []
self.ser = serial.Serial(_serial, bs)
with open('melody.txt', 'r') as file:
for line in file:
self.melodies.append(line)
def close(self,):
self.ser.close()
def PlayTimes(self,melody, count):
for i in range(0, count):
self.ser.write( self.melodies[melody].encode() )
Пример файла melody.txt. Без новых строк и пробелов:
NOTE_C4,NOTE_D4,NOTE_E4,NOTE_F4,NOTE_G4,NOTE_A4,NOTE_B4,NOTE_C5,NOTE_D5,NOTE_E5,NOTE_F5,NOTE_G5,NOTE_A5,NOTE_B5,NOTE_C6,NOTE_D6,NOTE_E6,NOTE_F6,NOTE_G6,NOTE_A6,NOTE_B6,NOTE_C7,NOTE_D7,NOTE_E7,NOTE_F7,NOTE_G7,NOTE_A7,NOTE_B7,NOTE_C8,NOTE_D8,NOTE_E8,NOTE_F8,NOTE_G8,NOTE_A8,NOTE_B8,NOTE_C8,NOTE_B7,NOTE_A7,NOTE_G7,NOTE_F7,NOTE_E7,NOTE_D7,NOTE_C7,NOTE_B6,NOTE_A6,NOTE_G6,NOTE_F6,NOTE_E6,NOTE_D6,NOTE_C6,NOTE_B5,NOTE_A5,NOTE_G5,NOTE_F5,NOTE_E5,NOTE_D5,NOTE_C5,NOTE_B4,NOTE_A4,NOTE_G4,NOTE_F4,NOTE_E4,NOTE_D4,NOTE_C4,NOTE_E4,NOTE_G4,NOTE_A4,NOTE_A4,NOTE_G4,NOTE_E4,NOTE_G4,NOTE_D4
Для распыления нужен транзистор Mofset с подачей внешнего источника тока, не делал из-за ненадобности. Ардуино выдает меньше чем нужно для распыления.
void setup() {
DDRB = B00001000; // Настройка цифрового пина 11 на OUTPUT (PORTB3 на ATmega328)
}
void loop () {
// Генерация квадратного сигнала частотой 2 МГц
// (каждые 8 циклов процессора происходит изменение состояния)
PORTB |= B00001000; // digital 11 HIGH
PORTB &= B11110111; // digital 11 LOW
PORTB |= B00001000; // digital 11 HIGH
PORTB &= B11110111; // digital 11 LOW
// и так далее
}
//Код для чтения ИК пульта. Проверьте батарейки в пульте!
//*TODO* from Serial read code? Python script
#include <IRremote.h>
int RECV_PIN = 2;
IRrecv irrecv(RECV_PIN);
decode_results results;
void setup()
{
Serial.begin(9600);
// pinMode(A3, INPUT);
irrecv.enableIRIn();
}
void loop()
{
if (irrecv.decode(&results))
{
Serial.println(results.value, HEX);
irrecv.resume();
}
//Serial.println ( analogRead(A3) );
delay(100);
}
Код для работы с разноцветным светоидоидом. Управление либо через джойстик, либо ИК-Пульт, либо рандомно:
#define IR 1
#ifdef RANDCOLORS
#include<time.h>
#endif
#ifdef IR
#include <IRremote.h>
constexpr auto pinIR = 9;
IRrecv irrecv(pinIR);
decode_results results;
// Maybe to namespace
namespace ir{
//enum colors {
// red,green,blue
//};
unsigned char mColor = 0;
enum codes{
PlusColor = 0xEE9C307B,
MinusColor = 0x3B4A03DB,
ChangeColor = 0x30A3001F,
};
}
#endif
namespace RGBDiod
{
constexpr auto RedPin = 2;
constexpr auto GreenPin = 3;
constexpr auto BluePin = 4;
void set(int r, int g, int b)
{
analogWrite(RGBDiod::RedPin, r);
analogWrite(RGBDiod::GreenPin, g);
analogWrite(RGBDiod::BluePin, b);
}
unsigned char r = 0;
unsigned char g = 0;
unsigned char b = 0;
};
#ifdef JOYSTICK
namespace JoyStick
{
constexpr auto vrxPin = A5;
constexpr auto vryPin = A4;
constexpr auto buttonPin = 8;
constexpr auto X_def = 508;
constexpr auto Y_def = 511;
int gX(void)
{
int x = analogRead(vrxPin);
return x - X_def;
}
int gY(void)
{
int y = analogRead(vryPin);
return y - Y_def;
}
bool wasClick(void)
{
return digitalRead(JoyStick::buttonPin) == HIGH; // TODO: fix
}
struct JValues
{
int x; int y; bool WasClick;
};
JValues get(void)
{
return JValues{gX(),gY(), wasClick()};
}
};
#endif
void setup() {
#ifdef RANDCOLORS
srand(time(NULL));
#endif
Serial.begin (9600);
// put your setup code here, to run once:
pinMode(RGBDiod::RedPin, OUTPUT);
pinMode(RGBDiod::GreenPin, OUTPUT);
pinMode(RGBDiod::BluePin, OUTPUT);
//
#ifdef JOYSTICK
pinMode(JoyStick::buttonPin, INPUT);
digitalWrite(JoyStick::buttonPin, HIGH);
#endif
#ifdef IR
irrecv.enableIRIn();
#endif
}
bool isFirstRun = true;
void CheckRGB(void)
{
if (!isFirstRun) return;
RGBDiod::set(255,0,0);
delay(1000);
RGBDiod::set(0,255,0);
delay(1000);
RGBDiod::set(0,0,255);
delay(1000);
isFirstRun=false;
}
#ifdef RANDCOLORS
unsigned int iteration = 0;
#endif
void loop() {
CheckRGB();
#ifdef IR
if (irrecv.decode(&results))
{
Serial.println(ir::mColor);
Serial.println(RGBDiod::r);
Serial.println(RGBDiod::g);
Serial.println(RGBDiod::b);
Serial.println(results.value, HEX);
#define ADDCOLOR(w) w = w < 128 ? 128 : w+1
switch(results.value)
{
case ir::codes::ChangeColor:
ir::mColor = (ir::mColor+1 ) % 3 ;
break;
case ir::codes::PlusColor:
if(ir::mColor == 0) ADDCOLOR(RGBDiod::r); //RGBDiod::r = RGBDiod::r < 128 ? 128 : RGBDiod::r+1;
else if(ir::mColor == 1) ADDCOLOR(RGBDiod::g);
else ADDCOLOR(RGBDiod::b);
break;
case ir::codes::MinusColor:
if(ir::mColor == 0) RGBDiod::r--;
else if(ir::mColor == 1) RGBDiod::g--;
else RGBDiod::b--;
break;
default:
Serial.print("Unknown code: ");
Serial.println(results.value);
break;
}
irrecv.resume();
}
#endif
#ifdef JOYSTICK
bool changes = false;
auto JoyStcikValues = JoyStick::get();
if (JoyStcikValues.x > 1 || JoyStcikValues.x < -1)
{
Serial.print("x+ = ");
Serial.println(JoyStcikValues.x);
RGBDiod::r+=JoyStcikValues.x;
changes = true;
}
if (JoyStcikValues.y > 1 || JoyStcikValues.y < -1)
{
Serial.print("y+ = ");
Serial.println(JoyStcikValues.y);
RGBDiod::g+=JoyStcikValues.y;
changes = true;
}
if ( JoyStcikValues.WasClick )
{
//RGBDiod::b += 128;
//Serial.println("Set blue");
}
#endif
RGBDiod::set(RGBDiod::r,RGBDiod::g,RGBDiod::b);
#ifdef RANDCOLORS
//Serial.println("___");
if (iteration % 1000 == 999) // каждую 1000 итерацию крч обнулять
{
RGBDiod::r = 0; RGBDiod::g = 0;RGBDiod::b = 0;
}
if (iteration % 30 == 5 && !changes)
{
RGBDiod::r = rand() % 255;
RGBDiod::g = rand() % 255;
RGBDiod::b = rand() % 255;
}
iteration++;
#endif
}