Помогите с оптимизацией

Тема в разделе "Arduino & Shields", создана пользователем Yaroduinoo, 27 май 2020.

  1. Yaroduinoo

    Yaroduinoo Нерд

    Здравствуйте. Писал писал я значит скетч вроде места впритык на ардуину уно: 91% обьем памяти и 75% переменных. Начал тестировать и через секунд десять дуня зависла(. Подозреваю обьем скетча ведь без кода часов все работает. Но проект должен быть с часами иначе никак. Опыта в оптимизации 0 поэтому прошу помочь. Скоро добавлю код он просто не влезает
     
  2. Yaroduinoo

    Yaroduinoo Нерд

    Код (C++):
    #include "Adafruit_VEML6070.h"

    #include <SPI.h>
    #include "prescaler.h"

    #include <Adafruit_GFX.h>
    #include <Adafruit_PCD8544.h>
    Adafruit_PCD8544 display = Adafruit_PCD8544(6, 5, 4, 3, 2);

    #define NUMFLAKES 10
    #define XPOS 0
    #define YPOS 1
    #define DELTAY 2


    #define LOGO16_GLCD_HEIGHT 16
    #define LOGO16_GLCD_WIDTH  16

    Adafruit_VEML6070 uv = Adafruit_VEML6070();

    // Setup a new OneButton on pin A2.


    int buttonState10 = 0;

    int buttonState8 = 0;

    int buttonState9 = 0;

    int buttonState6 = 0;

    int buttonState = 0;

    int buttonState2 = 0;

    int buttonState3 = 0;

    int buttonState4 = 0;

    int buttonState5 = 0;

    #include <Wire.h>//уже есть в системе
    #include <Adafruit_BMP280.h>

    Adafruit_BMP280 bmp;


    long randNumber;


    int pres;
    int pres2;
    float temp;

    #include <SoftwareSerial.h>
    SoftwareSerial SIM800(8, 9);
    //#include <DS3231.h>
    это часть библиотек
     
  3. Yaroduinoo

    Yaroduinoo Нерд

    далее идут массивы но они вообще на форум не влезают(
    Setup
    Код (C++):
    void setup() {


      while (!bmp.begin(BMP280_ADDRESS - 1)) {

      }
    // rtc.begin();
      display.begin();
      delay(1000);
      display.setContrast(47);
      display.clearDisplay();
      testdrawrect();
      display.display();
      delay(2000);
      display.clearDisplay();
      display.setTextSize(2);
      display.setCursor(0, 0);
      display.print("C.");
      display.setCursor(0, 16);
      display.print("O.");
      display.setCursor(0, 32);
      display.print("H.");

      display.display();
      uv.begin(VEML6070_1_T);
      Serial.begin(9600);


      SIM800.begin(9600);
      delay(500);
      pinMode(A0, INPUT);
      pinMode(10, OUTPUT);
      randomSeed(analogRead(0));

      pinMode(A1, INPUT_PULLUP);
      pinMode(A3, INPUT);
      pinMode(A2, INPUT_PULLUP);
      pinMode(11, INPUT_PULLUP);
      pinMode(A5, INPUT);
      pinMode(12, INPUT_PULLUP);
      pinMode(A0, INPUT_PULLUP);
      pinMode(7, INPUT_PULLUP);
      pinMode(13, INPUT_PULLUP);
      delay(500);
      display.drawBitmap(0, 0, smileBmp, 84, 48, BLACK);
      display.display();

      delay(500);
      SIM800.println("AT+CLIP=1");
      SIM800.println("ATS0=3");

      delay(1500);
      tone(10, 400, 125);
      delay(70);
      tone(10, 200, 125);
      delay(50);
      noTone(10);

      pres2 = (bmp.readPressure() + 100 ) / 100;

    }
    :
     
  4. Yaroduinoo

    Yaroduinoo Нерд

    loop:
    Код (C++):
    void loop() {

      if (SIM800.available())           // Ожидаем прихода данных (ответа) от модема...
        Serial.write(SIM800.read());    // ...и выводим их в Serial
      if (Serial.available())           // Ожидаем команды по Serial...
        SIM800.write(Serial.read());



      buttonState = analogRead(A1);

      // если кнопка нажата, то её состояние HIGH:
      if (buttonState < 40) {
        setClockPrescaler(CLOCK_PRESCALER_1);
        delay(50);
        SIM800.println("ATA" );

        display.clearDisplay();
        display.setTextSize(1);

        display.setCursor(0, 0);
        display.println("Online...");
        display.drawBitmap(4, 16, smileBmP, 84, 33, BLACK);
        display.display();
        tone(10, 400, 125);
        delay(70);
        tone(10, 200, 125);
        delay(50);
        noTone(10);



        pres2 = bmp.readPressure() / 133 ;
      }

      buttonState6 = digitalRead(12);
      if (buttonState6 == LOW) {
        setClockPrescaler(CLOCK_PRESCALER_1);

        delay(50);
        tone(10, 400, 125);
        delay(70);
        tone(10, 200, 125);
        delay(50);
        noTone(10);
        display.clearDisplay();
        display.drawBitmap(0, 0,  logo16_glcd_bmp, 16, 15, BLACK);
        display.drawBitmap(20, 8,  logo16_glcd_bmp, 16, 15, BLACK);
        display.drawBitmap(0, 0, meteo, 84, 48, BLACK);
        display.display();
        delay(1500);
        display.clearDisplay();
        pres = bmp.readPressure() / 133 ;

        temp = bmp.readTemperature();
        display.clearDisplay();

        display.setTextSize(1);
        display.setCursor(0, 0);
        display.print("Pressure=");
        display.setCursor(55, 0);
        display.print(pres);
        display.print("m");
        display.setCursor(0, 20);
        display.print("Temp=");
        display.setCursor(30, 20);
        display.print(temp);
        display.setCursor(60, 20);
        display.print("C");
        display.setCursor(0, 10);

        display.println("UV=");
        display.setCursor(20, 10);
        display.println(uv.readUV());
        display.setCursor(0, 30);
        display.print("Alt=");
        display.print(bmp.readAltitude(pres2) - 5.10);
        display.print(" m");
        display.display();
        delay(50);
        display.display();
        float one = bmp.readAltitude(1000);
        delay (1000);
        float two = bmp.readAltitude(1000);
        display.setCursor(10, 40);
        display.println(one - two);
        display.setCursor(40, 40);
        display.println("m/c");
        display.display();

      }

      buttonState10 = analogRead(A0);

      if (buttonState10 < 40) {
        setClockPrescaler(CLOCK_PRESCALER_1);
        delay(50);
        tone(10, 400, 125);
        delay(70);
        tone(10, 200, 125);
        delay(50);
        noTone(10);
        delay(100);

        setClockPrescaler(CLOCK_PRESCALER_4);

        trueDelay(100);
        display.clearDisplay();
        testdrawbitmap(logo16_glcd_bmp, LOGO16_GLCD_WIDTH, LOGO16_GLCD_HEIGHT);



      }

      buttonState8 = digitalRead(7);
      if (buttonState8 == LOW) {
        setClockPrescaler(CLOCK_PRESCALER_1);
        display.clearDisplay();
        delay(50);
        tone(10, 400, 125);
        delay(70);
        tone(10, 200, 125);
        delay(50);
        noTone(10);
        display.drawBitmap(0, 0, pama, 84, 48, BLACK);

        display.setTextSize(1);
        display.setCursor(20, 35);
       // display.print(rtc.getDateStr());

        display.setTextSize(2);
        display.setCursor(5, 5);
       // display.println(rtc.getTimeStr());

        display.display();
        // Wait one second before repeating :)
        delay (100);


      }

      buttonState5 = analogRead(A5);
      if (buttonState5 < 40) {
        setClockPrescaler(CLOCK_PRESCALER_1);
        delay(50);
        SIM800.println("ATD+79177577864;" );
        display.clearDisplay();
        display.setTextSize(1);

        display.setCursor(0, 0);
        display.println("Call Papa.. ");
        display.drawBitmap(0, 16, SmileBmp, 84, 33, BLACK);
        display.display();
        tone(10, 400, 125);
        delay(70);
        tone(10, 200, 125);
        delay(50);
        noTone(10);

      }
      buttonState9 = digitalRead(13);
      if (buttonState9 == LOW) {
        setClockPrescaler(CLOCK_PRESCALER_1);
        delay(50);
        randNumber = random(5);
        tone(10, 400, 125);
        delay(70);
        tone(10, 200, 125);
        delay(50);
        noTone(10);
      }

      if (randNumber == 1) {
        display.clearDisplay();
        display.drawBitmap(0, 0, PESHKA, 84, 38, BLACK);
        display.setCursor(8, 40);

        display.setTextSize(1);
        display.println("Yes");
        display.display();
        randNumber = random(10, 10);

      }
      if (randNumber == 2) {
        display.clearDisplay();
        display.setTextSize(2);

        display.setCursor(0, 0);
        display.setCursor(8, 15);
        display.println("Eagle!");
        display.setCursor(8, 40);
        display.setTextSize(1);
        display.println("No");
        display.display();
        randNumber = random(10, 10);

      }
      if (randNumber == 3) {
        display.clearDisplay();
        display.drawBitmap(0, 0, PESHKA, 84, 38, BLACK);
        display.setCursor(8, 40);
        display.setTextSize(1);
        display.println("Other way?");
        display.display();
        randNumber = random(10, 10);

      }
      if (randNumber == 4) {
        display.clearDisplay();
        display.setTextSize(2);

        display.setCursor(0, 0);
        display.setCursor(8, 15);
        display.println("Eagle!");
        display.setCursor(8, 40);
        display.setTextSize(1);
        display.println("Think about");
        display.display();
        randNumber = random(10, 10);

      }
      buttonState2 = analogRead(A3);
      if (buttonState2 < 40) {
        setClockPrescaler(CLOCK_PRESCALER_1);
        delay(50);
        SIM800.println("ATD+79874785079;" );
        display.clearDisplay();
        display.setTextSize(1);

        display.setCursor(0, 0);
        display.println("Call Andrey..");
        display.drawBitmap(0, 16, SmileBmp, 84, 33, BLACK);
        display.display();
        tone(10, 400, 125);
        delay(70);
        tone(10, 200, 125);
        delay(50);
        noTone(10);

      }


      buttonState3 = analogRead(A2);

      // если кнопка нажата, то её состояние HIGH:
      if (buttonState3 < 40) {
        setClockPrescaler(CLOCK_PRESCALER_1);
        delay(50);
        SIM800.println("ATH" );
        display.clearDisplay();
        display.setTextSize(1);

        display.setCursor(0, 0);
        display.println("Reset call");
        display.drawBitmap(4, 16, SmileBmP, 84, 33, BLACK);
        display.display();
        tone(10, 400, 125);
        delay(70);
        tone(10, 200, 125);
        delay(50);
        noTone(10);
      }





      buttonState4 = digitalRead(11);
      if (buttonState4 == LOW) {
        setClockPrescaler(CLOCK_PRESCALER_1);
        delay(50);
        SIM800.println("ATD+79174131191;" );


        display.clearDisplay();
        display.setTextSize(1);
        display.setTextColor(BLACK);
        display.setCursor(0, 0);
        display.println("Call MaMa..");
        display.drawBitmap(0, 16, SmileBmp, 84, 33, BLACK);
        display.display();
        tone(10, 400, 125);
        delay(70);
        tone(10, 200, 125);
        delay(50);
        noTone(10);


      }


    }

    void testdrawrect(void) {
      for (int16_t i = 0; i < display.height() / 2; i += 2) {
        display.drawRect(i, i, display.width() - 2 * i, display.height() - 2 * i, BLACK);
        display.display();
      }
    }
    void testdrawbitmap(const uint8_t *bitmap, uint8_t w, uint8_t h) {
      uint8_t icons[NUMFLAKES][3];
      randomSeed(666);     // whatever seed

      // initialize
      for (uint8_t f = 0; f < NUMFLAKES; f++) {
        icons[f][XPOS] = random(display.width());
        icons[f][YPOS] = 0;
        icons[f][DELTAY] = random(5) + 1;

        Serial.print("x: ");
        Serial.print(icons[f][XPOS], DEC);
        Serial.print(" y: ");
        Serial.print(icons[f][YPOS], DEC);
        Serial.print(" dy: ");
        Serial.println(icons[f][DELTAY], DEC);
      }

      while (1) {
        // draw each icon
        for (uint8_t f = 0; f < NUMFLAKES; f++) {
          display.drawBitmap(icons[f][XPOS], icons[f][YPOS], logo16_glcd_bmp, w, h, BLACK);
        }
        display.display();
        trueDelay(130);

        // then erase it + move it
        for (uint8_t f = 0; f < NUMFLAKES; f++) {
          display.drawBitmap(icons[f][XPOS], icons[f][YPOS],  logo16_glcd_bmp, w, h, WHITE);
          // move it
          icons[f][YPOS] += icons[f][DELTAY];
          // if its gone, reinit
          if (icons[f][YPOS] > display.height()) {
            icons[f][XPOS] = random(display.width());
            icons[f][YPOS] = 0;
            icons[f][DELTAY] = random(5) + 1;
          }

        }
      }
    }




     
     
  5. KindMan

    KindMan Гик

    Выложите код на ГитХабе, например, если не влезает на форум. Так есть вероятность, что кто-то посмотрит.
    На вскидку - вы хотите использовать часы DS3231 и при этом у вас в коде buttonState5 = analogRead(A5); Как так? Приложите схему подключения всех устройств.
     
    NikitOS нравится это.
  6. b707

    b707 Гуру

    так они наверно и в ардуину не влезают
     
    KindMan нравится это.
  7. Yaroduinoo

    Yaroduinoo Нерд

    Не знаю как так но с бмп280 такое прокатило. Схему рисовать не умею поэтому на словах: нокиа дисплей к 6,5,4,3,2 пину потом динамик на 10, кнопки все аналоговые заняли кроме А4 и еще 7, 13, 12 , 11 пины, сим 800 к 8,9 пину, бмп280 на А4 и А5 Вроде все
    да не они влезают нормально, это же шестнадцатеричные картинки
     
  8. b707

    b707 Гуру

    вы правда думаете. что кто-то захочет разбираться с вашей проблемой. если вам самому даже схему лень нарисовать?
     
    parovoZZ нравится это.
  9. parovoZZ

    parovoZZ Гуру

    ТС, мне код писать лень, да и не умею я, поэтому скажу на словах: тебе надо оптимизировать код.