Тинька Пульт и Свет

SERgunCHIK
Offline
Зарегистрирован: 11.02.2015

Накидал я скетч (точнее собрал из кусков) для управления светом.

Спаял уже платку на базе ATtiny85.

Ввиду своей огромной опытности в програмировании, не могу догнать как оптимизировать код так, чтобы он помещался в тиньку.




#include <IRremote.h> // это скачанная библиотека
int RECV_PIN = A3; //вход ИК приемника
IRrecv irrecv(RECV_PIN);
decode_results results;
unsigned long eventTime=0;
boolean but1 = true;
byte power = 20;
byte light = 0; 
#define Led 1          // светодиодик в выключателе
#define button A2      // обычный выключатель света 
#define L1 4           // выход, через MOSFET свет

void setup(){
 irrecv.enableIRIn(); // включить приемник
  pinMode(Led, OUTPUT); // назначаем пины как выходы
  pinMode(L1, OUTPUT); 
  pinMode(button,INPUT_PULLUP);
  pinMode(RECV_PIN, INPUT);
} 
void loop() {
  if (digitalRead(RECV_PIN) == LOW) 
    eventTime=millis();
  if(millis()-eventTime>100)
    digitalWrite(Led, LOW);
  if (irrecv.decode(&results)) {
    if (results.value == 2155833750 
    || results.value == 2155815390
    || results.value == 2155824060
    || results.value == 2155856700)digitalWrite(Led, HIGH); 
    if (results.value == 2155833750 && power <= 250)
   power = power + 5;
   if (results.value == 2155856700 && power >=5)
   power = power - 5;
   if (results.value == 2155815390)
   {light = 0;
   analogWrite (L1, light);}
   if(results.value == 2155824060 || results.value == 2155833750 
   || results.value == 2155856700)
  { light = power;
   analogWrite(L1, light);}
    irrecv.resume(); 
  }
 boolean but2 = digitalRead(button);
if(but1 == !but2){
   eventTime=millis();
  if(millis()-eventTime>50)
  but2 = digitalRead(button);
  if(but1 == !but2 && light >= 1)
  light = 0;
  else if (but1 == !but2 && light == 0)
  light = power;
  analogWrite(L1, light);
  but1 = but2;
}
}

 На ARDUINO PRO MICRO (с изменением пинов ввода\вывода) все работает.

При смене платы на ATTiny85 - IDE выдает ошибку:

Arduino: 1.6.1 (Windows 7), Плата"ATtiny85 @ 16 MHz  (internal PLL; 4.3 V BOD)"
 
Third-party platform.txt does not define compiler.path. Please report this to the third-party hardware maintainer.
 
c:/program files (x86)/arduino/hardware/tools/avr/bin/../lib/gcc/avr/4.8.1/../../../../avr/bin/ld.exe: C:\Users\D899~1\AppData\Local\Temp\build2294397848251248995.tmp/IRDA2.cpp.elf section `.text' will not fit in region `text'
 
c:/program files (x86)/arduino/hardware/tools/avr/bin/../lib/gcc/avr/4.8.1/../../../../avr/bin/ld.exe: region `text' overflowed by 340 bytes
 
collect2.exe: error: ld returned 1 exit status
 
Ошибка компиляции.
 
  Это сообщение будет содержать больше информации чем
  "Отображать вывод во время компиляции"
  включено в Файл > Настройки
 
dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

SERgunCHIK, скорее никак, этот код не для тинек.   мою тему читали? Я правда потом случайно нашёл специальную библиотеку ir-remote для дижиспарка из пакета DigistumpIDE1.5.8C, но не изучал её , т.к. уже было не актуально.

SERgunCHIK
Offline
Зарегистрирован: 11.02.2015

Мало чего понял, но похоже, вся проблема в тяжелой библиотеке.

При условии, что будет использоваться 1 пульт, и заранее известные команды с него.

Можно ли обойтись вообще без библиотеки?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

SERgunCHIK пишет:

Можно ли обойтись вообще без библиотеки?

Я же обошёлся ) Но вам бы посоветовал вытащить библу из дижистампа.

bbv
Offline
Зарегистрирован: 11.02.2020

Такая же байда для Atmega8, Atmega88. Та же самая ошибка...При  этом на Attiny85 скомпилировалось и прошилось...На симуляторе работает..  https://wokwi.com/projects/337797792212714066

Кто нить может подсказать в чем дело то?

c:/users/boris/appdata/local/arduino15/packages/arduino/tools/avr-gcc/7.3.0-atmel3.6.1-arduino7/bin/../lib/gcc/avr/7.3.0/../../../../avr/bin/ld.exe: C:\Users\Boris\AppData\Local\Temp\arduino_build_622850/Svetilnik.ino.elf section `.text' will not fit in region `text'
c:/users/boris/appdata/local/arduino15/packages/arduino/tools/avr-gcc/7.3.0-atmel3.6.1-arduino7/bin/../lib/gcc/avr/7.3.0/../../../../avr/bin/ld.exe: region `text' overflowed by 486 bytes
collect2.exe: error: ld returned 1 exit status
exit status 1
Ошибка компиляции для платы ATmega8.

#include <EEPROM.h>

int K = 0;
int B_ON = -1;
int B_1 = -1;
int B_2 = -1;
int B_U = EEPROM.read(1);
int B_D = EEPROM.read(2);

#include <IRremote.h>

IRrecv ir_rx(2);
decode_results ir_rx_results;

unsigned long fnc_ir_rx_decode()
 {
  bool decoded=false;
  if( ir_rx.decode(&ir_rx_results))
  {
    decoded=true;
    ir_rx.resume();
  }
  if(decoded)
    return ir_rx_results.value;
  else
    return 0;
 }


void setup() {
  Serial.begin(9600);
  ir_rx.enableIRIn();

  pinMode(6, OUTPUT);
  pinMode(5, OUTPUT);

}

void loop() {
    K = (unsigned long)fnc_ir_rx_decode();
    if (K == 17850) {
      B_ON = B_ON * -1;
       analogWrite(6, B_U);
       analogWrite(5, B_D);
      Serial.println(B_ON);
    }
    if (K == 3315) {
      B_1 = B_1 * -1;
      B_2 = -1;
      Serial.println(B_1);
    }
    if (K == 6375) {
      B_2 = B_2 * -1;
      B_1 = -1;
      Serial.println(B_2);
    }
    if (B_ON == 1 & B_1 == 1) {
      if (K == 16575) {
        B_U = B_U + 5;
        if (B_U > 255) {
          B_U = 255;
        }
        Serial.println(B_U);
        EEPROM.write(1,B_U);
        delay(50);
      }
      if (K == 6630) {
        B_U = B_U - 5;
        if (B_U < 0) {
          B_U = 0;
        }
        Serial.println(B_U);
        EEPROM.write(1,B_U);
        delay(50);
      }
       analogWrite(6, B_U);
    }
    if (B_ON == 1 & B_2 == 1) {
      if (K == 16575) {
        B_D = B_D + 5;
        if (B_D > 255) {
          B_D = 255;
        }
        Serial.println(B_D);
        EEPROM.write(2,B_D);
        delay(50);
      }
      if (K == 6630) {
        B_D = B_D - 5;
        if (B_D < 0) {
          B_D = 0;
        }
        Serial.println(B_D);
        EEPROM.write(2,B_D);
        delay(50);
      }
       analogWrite(5, B_D);
    }
    if (B_ON == -1) {
      pinMode(6, OUTPUT);
       digitalWrite(6, 0);
      pinMode(5, OUTPUT);
       digitalWrite(5, 0);
    }

} 
ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

In order to fit the examples to the 8K flash of ATtiny85 and ATtiny88, the Arduino library ATtinySerialOut is required for this CPU's.

b707
Offline
Зарегистрирован: 26.05.2017

Я вообще не понимаю, зачем на радио пульте Сериал?

Что касается радио на Тини, уточните, вам нужен приемник или передатчик? Чтобы запустить приемник на тини85, в стандартной либе достаточно исправить одну строчку. Помнится, я даже писал об этом на форуме году так в 18м... И занимает эта либа совсем немного места...
У ТС весь код 50 строк, это все должно помещать в 85-у со свистом, это же не тини13, у 85й целых 8к

bbv
Offline
Зарегистрирован: 11.02.2020

b707 пишет:
Я вообще не понимаю, зачем на радио пульте Сериал? 

Это временно , прошивать конечно же не буду сериал

bbv
Offline
Зарегистрирован: 11.02.2020

b707 пишет:
Что касается радио на Тини, уточните, вам нужен приемник или передатчик? Чтобы запустить приемник на тини85, в стандартной либе достаточно исправить одну строчку. Помнится, я даже писал об этом на форуме году так в 18м... И занимает эта либа совсем немного места...

 

Нужен приемник...Как я уже писал выше на Тини85 код прошивается на ура....а вот на Атмеге8, 88 ни в какую не хочет, ошибка...

.........`.text' will not fit in region `text'

.......... region `text' overflowed by 486 bytes
 
collect2.exe: error: ld returned 1 exit status
exit status 1
Ошибка компиляции для платы ATmega8.

Что эти ошибки означают?? Текст не поместился в область текст и вторая типа область `текст переполнена на 486 байт текста?  Какого текста? у меня нет области текста...

b707
Offline
Зарегистрирован: 26.05.2017

bbv пишет:

.......... region `text' overflowed by 486 bytes

'если опустить технические подробности, это означает что ваша прошивка на 486 байт больше доступного размера флеша на плате. Вы точно ту самую плату выбираете? Сколько там места под программу?

На вид ваш код не должен занимать больше 3-4кбайт...

b707
Offline
Зарегистрирован: 26.05.2017

Сейчас попробовал собрать для Атмеги88 - у меня ваш код входит.

С сериалом размер 7580 байт, без Сериала - 7056 байт.

А у Атмеги88 - 8192 байта...

bbv
Offline
Зарегистрирован: 11.02.2020

b707 пишет:

Сейчас попробовал собрать для Атмеги88 - у меня ваш код входит.

С сериалом размер 7580 байт, без Сериала - 7056 байт.

А у Атмеги88 - 8192 байта...

Подскажите какую IDE используете, ну и плата какая?

 

b707
Offline
Зарегистрирован: 26.05.2017

bbv пишет:

Подскажите какую IDE используете, ну и плата какая?

 

плата атмега88, а IDE 1.8.13

 

А вообще, попробуйте лучше либу  IRSwitch.h вместо IRRemote.h, она раза в два меньше...

bbv
Offline
Зарегистрирован: 11.02.2020

b707 пишет:

bbv пишет:

Подскажите какую IDE используете, ну и плата какая?

 

плата атмега88, а IDE 1.8.13

 

А вообще, попробуйте лучше либу  IRSwitch.h вместо IRRemote.h, она раза в два меньше...

Такая?

 

b707
Offline
Зарегистрирован: 26.05.2017

ну почти :) Я плату в ИДЕ сам добавлял, там столько подробностей нет.

Главное отличие - у меня плата без бута.

 

А для того чтоб проверить, сколько у вас реально занимает код - скомпилируйте свой скетч для платы Ардуино Нано. Контроллер точно такой же, только размер больше, размер кода будет тем же как для атмеги88, но зато Ардуино ИДЕ вам его покажет, а не будет ругаться что нет памяти

bbv
Offline
Зарегистрирован: 11.02.2020
Для наны Скетч использует 8764 байт (28%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 426 байт (20%) динамической памяти, оставляя 1622 байт для локальных переменных. Максимум: 2048 байт.
 
bbv
Offline
Зарегистрирован: 11.02.2020

Вот щас снова попробывал для Atmega8, 88 снова ошибка, а для Attiny85 все скомпилировалось без ошибок...я не понимаю ваще...(((

bbv
Offline
Зарегистрирован: 11.02.2020

b707 пишет:

ну почти :) Я плату в ИДЕ сам добавлял, там столько подробностей нет.

Главное отличие - у меня плата без бута.

 

можно ссылочку на вашу плату?

b707
Offline
Зарегистрирован: 26.05.2017

bbv пишет:

можно ссылочку на вашу плату?

какую ссылочку, о чем вы? Я же пишу - я сам ее добавлял, то есть открывал файл boards.txt и вручную вписывал...

Но не думайте, от того как описана плата - размер кода не меняется. Размер может зависеть от версии ИДЕ и от версий библиотек. У вас что-то не то с настройками, размер получается на 1500 байт больше моего...

Кстати, какой размер получается для Тини?

 

bbv
Offline
Зарегистрирован: 11.02.2020

b707 пишет:

bbv пишет:

можно ссылочку на вашу плату?

 

Кстати, какой размер получается для Тини?

 

кетч использует 7938 байт (96%) памяти устройства. Всего доступно 8192 байт.
 
bbv
Offline
Зарегистрирован: 11.02.2020

А еще...когда я захожу в менеджер плат выскакивает вот такая надпись, не подскажете как от этого избавиться, ведь такого не должно быть?

Не найден boards.txt в C:\Users\Boris\AppData\Local\Arduino15\packages\ATtiny10Core\hardware\avr\2.1.0. Это точно pre-1.5?

 
BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Что у тебя там не получается то? По идеи - там не может не получиться.

У меня (Arduino IDE 1.8.19 / MiniCore):

1) Atmega8:

Скетч использует 6110 байт (74%) памяти устройства. Всего доступно 8192 байт.
Глобальные переменные используют 686 байт (66%) динамической памяти, оставляя 338 байт для локальных переменных. Максимум: 1024 байт. 

2) Atmega88:

Скетч использует 6280 байт (76%) памяти устройства. Всего доступно 8192 байт.
Глобальные переменные используют 686 байт (66%) динамической памяти, оставляя 338 байт для локальных переменных. Максимум: 1024 байт.

Другое ядро (Arduino IDE 1.8.19 / ATTinyCore):

3) Attiny85:

Скетч использует 5652 байт (68%) памяти устройства. Всего доступно 8192 байт.
Глобальные переменные используют 421 байт (82%) динамической памяти, оставляя 91 байт для локальных переменных. Максимум: 512 байт.

Скомпилированные выше HEX-файлы можно взять тут: https://cloud.mail.ru/public/oCZq/utqZqTd8X

Используемые настройки:

Atmega8:

Atmega88:

Attiny85:

Используемый для компиляции код из #4:

#include <EEPROM.h>

int K = 0;
int B_ON = -1;
int B_1 = -1;
int B_2 = -1;
int B_U = EEPROM.read(1);
int B_D = EEPROM.read(2);

#include <IRremote.h>

IRrecv ir_rx(2);
decode_results ir_rx_results;

unsigned long fnc_ir_rx_decode()
{
  bool decoded = false;
  if ( ir_rx.decode(&ir_rx_results))
  {
    decoded = true;
    ir_rx.resume();
  }
  if (decoded)
    return ir_rx_results.value;
  else
    return 0;
}


void setup() {
  Serial.begin(9600);
  ir_rx.enableIRIn();

  pinMode(6, OUTPUT);
  pinMode(5, OUTPUT);

}

void loop() {
  K = (unsigned long)fnc_ir_rx_decode();
  if (K == 17850) {
    B_ON = B_ON * -1;
    analogWrite(6, B_U);
    analogWrite(5, B_D);
    Serial.println(B_ON);
  }
  if (K == 3315) {
    B_1 = B_1 * -1;
    B_2 = -1;
    Serial.println(B_1);
  }
  if (K == 6375) {
    B_2 = B_2 * -1;
    B_1 = -1;
    Serial.println(B_2);
  }
  if (B_ON == 1 & B_1 == 1) {
    if (K == 16575) {
      B_U = B_U + 5;
      if (B_U > 255) {
        B_U = 255;
      }
      Serial.println(B_U);
      EEPROM.write(1, B_U);
      delay(50);
    }
    if (K == 6630) {
      B_U = B_U - 5;
      if (B_U < 0) {
        B_U = 0;
      }
      Serial.println(B_U);
      EEPROM.write(1, B_U);
      delay(50);
    }
    analogWrite(6, B_U);
  }
  if (B_ON == 1 & B_2 == 1) {
    if (K == 16575) {
      B_D = B_D + 5;
      if (B_D > 255) {
        B_D = 255;
      }
      Serial.println(B_D);
      EEPROM.write(2, B_D);
      delay(50);
    }
    if (K == 6630) {
      B_D = B_D - 5;
      if (B_D < 0) {
        B_D = 0;
      }
      Serial.println(B_D);
      EEPROM.write(2, B_D);
      delay(50);
    }
    analogWrite(5, B_D);
  }
  if (B_ON == -1) {
    pinMode(6, OUTPUT);
    digitalWrite(6, 0);
    pinMode(5, OUTPUT);
    digitalWrite(5, 0);
  }

}

 

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

bbv пишет:

Для наны Скетч использует 8764 байт (28%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 426 байт (20%) динамической памяти, оставляя 1622 байт для локальных переменных. Максимум: 2048 байт.

А вот у меня для Nano:

Скетч использует 6598 байт (21%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 686 байт (33%) динамической памяти, оставляя 1362 байт для локальных переменных. Максимум: 2048 байт.

Заметь, у меня для всех atmega8/88/328 указано количество байт глобальных переменных как 686, а у тебя почему-то - 426. Из чего я делаю вывод, что выложил ты один код, а компилируешь совершенно другой!

b707
Offline
Зарегистрирован: 26.05.2017

BOOM пишет:

Заметь, у меня для всех atmega8/88/328 указано количество байт глобальных переменных как 686, а у тебя почему-то - 426. Из чего я делаю вывод, что выложил ты один код, а компилируешь совершенно другой!

У меня тоже на его коде получвется  примерно 400

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

На Тини 85 у меня тоже чуть больше 400, возможно это и не «показатель».

А на нано у тебя какой "выхлоп"?

b707
Offline
Зарегистрирован: 26.05.2017

BOOM пишет:

А на нано у тебя какой "выхлоп"?


мои результаты в сообщении #10

bbv
Offline
Зарегистрирован: 11.02.2020

Короче все работает на другом компе, все компилируется и прошивается... Разобрался почему и на  этом компе не работало!! Все дело в библиотеке IRremote.h было, перекачал с гитхаба другую, залил, все заработало, закомпилировалось...Теперь вот так для Atmega88 

Скетч использует 6758 байт (87%) памяти устройства. Всего доступно 7680 байт.
Глобальные переменные используют 691 байт (67%) динамической памяти, оставляя 333 байт для локальных переменных. Максимум: 1024 байт.
 
Всем спасибо!
bbv
Offline
Зарегистрирован: 11.02.2020

BOOM пишет:

 

Скомпилированные выше HEX-файлы можно взять тут: https://cloud.mail.ru/public/oCZq/utqZqTd8X

 

Спасибо конечно, но это ж симуляция, коды  кнопок из симулятора... https://wokwi.com/projects/337825464684905042

позже будут реальные...