Примеры-коды для АрБуино

Ниже код для домашней метеостанции, на улице сгорит датчик.

Предыдущий код подобного — пример подключения 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
}

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *