demoss

clock

May 4th, 2022
1,149
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.83 KB | None | 0 0
  1. #define STRIP_PIN 7     // пин ленты
  2. #define NUMLEDS 240      // кол-во светодиодов
  3. #define COLOR_DEBTH 2
  4. #include <microLED.h>   // подключаем библу
  5. microLED<NUMLEDS, STRIP_PIN, MLED_NO_CLOCK, LED_WS2812, ORDER_GRB, CLI_AVER> strip;
  6.  
  7. #include <SPI.h>
  8. #include "RF24.h"
  9. #include "GyverStepper2.h"
  10. GStepper2<STEPPER2WIRE> moto(48, A1, A2, A3);
  11.  
  12. #include <GyverPower.h>
  13. volatile boolean isrflag = true;
  14. int Pstate = 0;
  15.  
  16. RF24 radio(9, 10); // "создать" модуль на пинах 9 и 10
  17. byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"};
  18. uint32_t timer0, timer1, timer2, timer3;
  19. float voltage = 4.2;
  20. byte PUpin = 2;
  21. byte moto_p = 4;
  22. byte power_mesure = A0;
  23. bool ledo = 1;
  24. byte ledb = 0;
  25. bool ledp = 0;
  26. byte ledst = 0;
  27. int leddir = 1;
  28. int moto_en = 0;
  29. int moto_r = 0;
  30. int bri = 0;
  31. int brii = 0;
  32. uint16_t ledc[1];
  33. uint16_t recieve_data[1]; // массив принятых данных
  34.  
  35. void setup() {
  36.   ledc[0] = mWhite;
  37.   strip.setBrightness(0);
  38.   pinMode(PUpin, OUTPUT);
  39.   digitalWrite(A3, HIGH);
  40.   digitalWrite(PUpin, HIGH);
  41.   pinMode(power_mesure, INPUT); // вход с делителя
  42.   analogReference(INTERNAL);
  43.   Serial.begin(57600); //открываем порт для связи с ПК
  44.   Serial.println("start_setup");
  45.  
  46.   moto.setSpeed(600);         // в градусах/сек
  47.   moto.disable();
  48.  
  49.   radio.begin();               // активировать модуль
  50.   radio.setAutoAck(1);         // режим подтверждения приёма, 1 вкл 0 выкл
  51.   radio.setRetries(0, 15);     // (время между попыткой достучаться, число попыток)
  52.   radio.enableAckPayload();    // разрешить отсылку данных в ответ на входящий сигнал
  53.   radio.setPayloadSize(32);    // размер пакета, байт
  54.   radio.openWritingPipe(address[0]);
  55.   radio.openReadingPipe(1, address[0]);
  56.   radio.setChannel(0x68);  //выбираем канал (в котором нет шумов!)
  57.   radio.setPALevel (RF24_PA_MAX); //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
  58.   radio.setDataRate (RF24_1MBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS
  59.   //должна быть одинакова на приёмнике и передатчике!
  60.   //при самой низкой скорости имеем самую высокую чувствительность и дальность!!
  61.   Serial.println("start_radio");
  62.   radio.powerUp(); //начать работу
  63.   radio.startListening();  //начинаем слушать эфир, мы приёмный модуль
  64.   power.autoCalibrate(); // автоматическая калибровка ~ 2 секунды , средняя но достаточная точность
  65.   // см раздел константы в GyverPower.h, разделяющий знак " | "
  66.   power.setSleepMode(POWERDOWN_SLEEP); // если нужен другой режим сна, см константы в GyverPower.h (по умолчанию POWERDOWN_SLEEP)
  67.   power.bodInSleep(false); // рекомендуется выключить bod во сне для сохранения энергии (по умолчанию false - выключен!!)
  68.   delay(200);
  69.  
  70. }
  71.  
  72. void loop() {
  73.   moto.tick();  //тикаем двигло
  74.   byte pipeNo;
  75.   bri = map(brii, 0, 1000, 0, ledb);  // мапим яркость
  76.  
  77.   if (ledo == 0 && ledst == 1) {  //загорелся
  78.     if (brii < 999) {
  79.       strip.setBrightness(bri);
  80.       strip.fill(ledc[0]);
  81.       strip.show();
  82.       brii++;
  83.     }
  84.   }
  85.   if (ledo == 1 && ledst == 1) {  //потух
  86.     if (brii > 1) {
  87.       strip.setBrightness(bri);
  88.       strip.fill(ledc[0]);
  89.       strip.show();
  90.       brii--;
  91.     }
  92.   }
  93.  
  94.   if (ledst == 2) {
  95.     if (1 > brii) leddir = -leddir;   //ТУДА-СЮДА
  96.     if (999 < brii) leddir = -leddir;
  97.     strip.setBrightness(bri);
  98.     strip.fill(ledc[0]);
  99.     strip.show();
  100.     brii + leddir;
  101.   }
  102.  
  103.   // устанавливаем значение
  104.   // float voltage = (float)(analogRead(power_mesure) * 3.3) / 1024 / 0.666; //получаем напряжение аккумулятора
  105.  
  106.   if (millis() - timer0 >= 3600000) {   // таймер на 30min пинать питальник - прижать
  107.     timer0 = millis();
  108.     Pstate = 1;
  109.   }
  110.   if (millis() - timer1 >= 12000) {   // таймер на 12s пинать питальник
  111.     digitalWrite(moto_p, LOW);
  112.   }
  113.   if (millis() - timer1 >= 12400) {   // таймер на 12s пинать питальник
  114.     digitalWrite(moto_p, HIGH);
  115.     timer1 = millis();
  116.   }
  117.   if (millis() - timer2 >= 30000) {   // таймер на 30 сек - замер напруги
  118.     timer3 = millis();
  119.     int power_mesure = analogRead(A0);
  120.     voltage = power_mesure * 0.005;
  121.     Serial.println (power_mesure);
  122.     Serial.println (voltage);
  123.     if (voltage < 3.1) {
  124.       Pstate = 1;
  125.     }
  126.   }
  127.   switch (Pstate) {
  128.     case 1:
  129.       Pstate = 0;
  130.       Serial.println("timer"); //спать
  131.       delay(200);
  132.       digitalWrite(PUpin, LOW);
  133.       digitalWrite(moto_p, LOW);
  134.       delay(400);
  135.       digitalWrite(moto_p, HIGH);
  136.       delay(400);
  137.       digitalWrite(moto_p, LOW);
  138.       delay(400);
  139.       digitalWrite(moto_p, HIGH);
  140.       radio.powerDown();
  141.       attachInterrupt(digitalPinToInterrupt(2), wkp, HIGH);
  142.       power.hardwareDisable(PWR_ADC | PWR_TIMER1);
  143.       power.sleep(SLEEP_FOREVER);
  144.       break;
  145.   }
  146.   //switch (ledo) {
  147.   //  case 1:
  148.   //    strip.fill(mWhite);
  149.    //   strip.show();
  150.    //   break;
  151.  // }
  152.   if ( radio.available(&pipeNo)) {  // слушаем эфир со всех труб
  153.     radio.read( &recieve_data, sizeof(recieve_data) );
  154.     radio.writeAckPayload(pipeNo, &voltage, sizeof(voltage));
  155.  
  156.     // чиатем входящий сигнал
  157.     if (recieve_data[0] == 0x1) { // затухание или загорание ленты
  158.       recieve_data[0] = 0x0;
  159.       ledo = !ledo;
  160.       ledst = 1;
  161.       timer0 = millis();
  162.     }
  163.  
  164.     if (recieve_data[0] == 0x2) { // мерцание ленты
  165.       recieve_data[0] = 0x0;
  166.       ledst = 2;
  167.       timer0 = millis();
  168.     }
  169.  
  170.     if (recieve_data[0] == 0x3) { // яркость ленты - перебор
  171.       recieve_data[0] = 0x0;
  172.       if (ledb == 0) ledb = 30;
  173.       if (ledb == 30) ledb = 90;
  174.       if (ledb == 90) ledb = 150;
  175.       if (ledb == 150) ledb = 230;
  176.       if (ledb == 230) ledb = 0;
  177.       timer0 = millis();
  178.     }
  179.  
  180.     if (recieve_data[0] == 0x4) {         перебор цвета ленты
  181.       recieve_data[0] = 0x0;
  182.       if (ledc[0] == mWhite) ledc[0] = mBlue;
  183.       if (ledc[0] == mBlue) ledc[0] = mRed;
  184.       if (ledc[0] == mRed) ledc[0] = mWhite;
  185.       timer0 = millis();
  186.     }
  187.     if (recieve_data[0] == 0x5) {   // Включить - выключить стрелки
  188.       recieve_data[0] = 0x0;
  189.       moto_en = !moto_en;
  190.       moto.invertEn(moto_en);
  191.       timer0 = millis();
  192.     }
  193.     if (recieve_data[0] == 0x6) {         //Инверсия движения
  194.       recieve_data[0] = 0x0;
  195.       moto_r = !moto_r;
  196.       moto.reverse(moto_r);
  197.       timer0 = millis();
  198.     }
  199.     if (recieve_data[0] == 0x7) {         //((recieve_data[0] == 0x2) && (last_data[0] != 0x3) && (last_data[0] != 0x4))  { // резерв
  200.       recieve_data[0] = 0x0;
  201.       timer0 = millis();
  202.     }
  203.     if (recieve_data[0] == 0x8) {         //((recieve_data[0] == 0x2) && (last_data[0] != 0x3) && (last_data[0] != 0x4))  { // резерв
  204.       recieve_data[0] = 0x0;
  205.       timer0 = millis();
  206.     }
  207.   }
  208. }
  209. void wkp() {
  210.   power.hardwareEnable(PWR_ADC | PWR_TIMER1);  //проснись
  211.   power.autoCalibrate();
  212.   isrflag = true;
  213.   Serial.print("WKPstart");
  214. }
Advertisement
Add Comment
Please, Sign In to add comment