Доброго времени суток, задача получить показания с сонара sr04 через esp8266 по wifi Arduino Mega есть скетч
002 | HardwareSerial & ESPport = Serial1; |
004 | const int ledPin = 13; |
006 | #define BUFFER_SIZE 128 |
007 | char buffer[BUFFER_SIZE]; |
012 | #define MAX_DISTANCE 200 |
013 | NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); |
018 | pinMode(ledPin, OUTPUT); |
019 | Serial .begin(115200); |
020 | ESPport.begin(115200); |
021 | Serial .println(GetResponse( "AT+CIOBAUD=9600" ,100)); |
025 | Serial .println( "RESET 3,5 sek" ); |
026 | Serial .println(GetResponse( "AT+RST" ,3400)); |
027 | Serial .println(GetResponse( "AT+CWMODE=1" ,300)); |
028 | connectWiFi( "****" , "****" ); |
029 | Serial .println(GetResponse( "AT+CIPMODE=0" ,300)); |
030 | Serial .println(GetResponse( "AT+CIPMUX=1" ,300)); |
031 | Serial .print( "Start TCP-server: " ); |
032 | Serial .println(GetResponse( "AT+CIPSERVER=1,88" , 300)); |
033 | Serial .println(GetResponse( "AT+CIPSTO=2" , 300)); |
034 | Serial .println(GetResponse( "AT+CIFSR" , 300)); |
035 | digitalWrite(ledPin,ledState); |
037 | Serial .print(sonar.ping_cm()); |
040 | ///////////////////основной цикл, принимает запрос от клиента/////////////////// |
044 | Serial .print(sonar.ping_cm()); |
046 | int ch_id, packet_len; |
051 | ESPport.readBytesUntil( '\n' , buffer, BUFFER_SIZE); |
053 | if (strncmp(buffer, "+IPD," , 5)==0) |
056 | sscanf(buffer+5, "%d,%d" , &ch_id, &packet_len); |
060 | while (*pb!= ':' ) pb++; |
062 | if ((strncmp(pb, "GET / " , 6) == 0) || (strncmp(pb, "GET /?" , 6) == 0)) |
065 | Serial .println(buffer); |
066 | Serial .print( "get led from ch :" ); |
067 | Serial .println(ch_id); |
083 | digitalWrite(ledPin, ledState); |
087 | otvet_klienty(ch_id); |
094 | //////////////////////формирование ответа клиенту//////////////////// |
095 | void otvet_klienty( int ch_id) |
099 | Header = "HTTP/1.1 200 OK\r\n" ; |
100 | Header += "Content-Type: text/html\r\n" ; |
101 | Header += "Connection: close\r\n" ; |
109 | Content = "<body><form action='' method='GET'><input type='submit' value='VKL/OTKL'> " +vklotkl; |
110 | Content += "</form></body></html>" ; |
112 | Header += "Content-Length: " ; |
113 | Header += ( int )(Content.length()); |
114 | Header += "\r\n\r\n" ; |
116 | ESPport.print( "AT+CIPSEND=" ); |
117 | ESPport.print(ch_id); |
119 | ESPport.println(Header.length()+Content.length()); |
122 | if (ESPport.find( ">" )) |
124 | ESPport.print(Header); |
125 | ESPport.print(Content); |
129 | /////////////////////отправка АТ-команд///////////////////// |
130 | String GetResponse(String AT_Command, int wait) |
134 | ESPport.println(AT_Command); |
136 | while (ESPport.available() >0 ) |
138 | char c = ESPport.read(); |
141 | if ( tmpData.indexOf(AT_Command) > -1 ) |
149 | //////////////////////очистка ESPport//////////////////// |
150 | void clearSerialBuffer( void ) |
152 | while ( ESPport.available() > 0 ) |
157 | ////////////////////очистка буфера//////////////////////// |
158 | void clearBuffer( void ) { |
159 | for ( int i =0;i<BUFFER_SIZE;i++ ) |
164 | ////////////////////подключение к wifi///////////////////// |
165 | boolean connectWiFi(String NetworkSSID,String NetworkPASS) |
167 | String cmd = "AT+CWJAP=\"" ; |
173 | Serial .println(GetResponse(cmd,6500)); |
веб сервер запускается и работает, с сонара данные получает и пишет в setup блоке,
Serial.print(sonar.ping_cm());
переношу в loop - отказывается компилировать и выдает кучу ошибок:
C:\Users\intel\Documents\Arduino\wifi_super\wifi_super.ino: In function 'void otvet_klienty(int)': C:\Users\intel\Documents\Arduino\wifi_super\wifi_super.ino:130:22: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings] if(ESPport.find(">")) ^ C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\main.cpp: In function 'main': C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\main.cpp:51:1: error: unable to find a register to spill in class 'NO_REGS' } ^ C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\main.cpp:51:1: error: this is the insn: (insn 562 559 565 15 (set (mem:QI (post_dec:HI (reg/f:HI 32 __SP_L__)) [0 S1 A8]) (subreg:QI (reg/f:HI 369) 1)) C:\Users\intel\Documents\Arduino\wifi_super\wifi_super.ino:64 1 {pushqi1} (expr_list:REG_ARGS_SIZE (const_int 7 [0x7]) (nil))) C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\main.cpp:51: confused by earlier errors, bailing out lto-wrapper: C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-gcc returned 1 exit status c:/program files (x86)/arduino/hardware/tools/avr/bin/../lib/gcc/avr/4.9.2/../../../../avr/bin/ld.exe: lto-wrapper failed collect2.exe: error: ld returned 1 exit status exit status 1 Ошибка компиляции для платы Arduino/Genuino Mega or Mega 2560.
как победить?
Что и куда Вы переносите? Потрудитесь, пожалуйста, выложить ТОТ САМЫЙ скетч, который не нравится компилятору.
И сделайте так, чтобы в сообщении компилятора сохранились оригинальные переводы строк (например, выложите сообщение тоже как код).
Во, блин, опять куски на Лиспе
(insn 562 559 565 15 (set (mem:QI (post_dec:HI (reg/f:HI 32 __SP_L__)) [0 S1 A8]) (subreg:QI (reg/f:HI 369) 1)) (expr_list:REG_ARGS_SIZE (const_int 7 [0x7]) (nil)))
это и есть то самый код.
если пишу
Serial.print(sonar.ping_cm());
в setupe он выводит в порт, пишу в loope выдает ошибки
01
C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\main.cpp: In function
'main'
:
02
03
C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\main.cpp:51:1: error: unable to find a register to spill
in
class
'NO_REGS'
04
05
}
06
07
^
08
09
C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\main.cpp:51:1: error:
this
is
the insn:
10
11
(insn 583 580 586 16 (
set
(mem:QI (post_dec:HI (reg/f:HI 32 __SP_L__)) [0 S1 A8])
12
13
(subreg:QI (reg/f:HI 384) 1)) C:\Users\intel\Documents\Arduino\wifi_super\wifi_super.ino:73 1 {pushqi1}
14
15
(expr_list:REG_ARGS_SIZE (const_int 7 [0x7])
16
17
(nil)))
18
19
C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\main.cpp:51: confused by earlier errors, bailing
out
20
21
lto-wrapper: C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-gcc returned 1 exit status
22
23
c:/program files (x86)/arduino/hardware/tools/avr/bin/../lib/gcc/avr/4.9.2/../../../../avr/bin/ld.exe: lto-wrapper failed
24
25
collect2.exe: error: ld returned 1 exit status
26
27
exit status 1
28
Ошибка компиляции для платы Arduino/Genuino Mega or Mega 2560.
Во, блин, опять куски на Лиспе (insn 562 559 565 15 (set (mem:QI (post_dec:HI (reg/f:HI 32 __SP_L__)) [0 S1 A8]) (subreg:QI (reg/f:HI 369) 1)) (expr_list:REG_ARGS_SIZE (const_int 7 [0x7]) (nil)))
не посвященым не вникать?
Выложите (или дайте сыслку), пожалуйста, библиотеку NewPing
можно и без библиотеки
есть два скетча первый отсюда
https://istarik.ru/blog/esp8266/29.html
он создает веб сервер выводит адрес. по адресу в браузере можно подключится к esp8266 видеть состояние лампочки и включать выключать ее. Второй скетч любой с сонаром sr04. Причем что с библиотекой что без. например :
1
int
echoPin = 9;
int
trigPin = 8;
void
setup
() {
Serial
.begin (9600); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); }
void
loop
() {
int
duration, cm; digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); cm = duration / 58;
Serial
.print(cm);
Serial
.println(
" cm"
); delay(100);}
задача: данные сонара (второго скетча) вывести в первом скетче в ответе клиенту:
Content = "<body><form action='' method='GET'><input type='submit' value='VKL/OTKL'> " + vklotkl; Content += "</form></body></html>";
вместо переменной vklotkl
Этот скетч нормально компилируется.
01
int
echoPin = 9;
02
int
trigPin = 8;
03
void
setup
() {
04
Serial
.begin (9600);
05
pinMode(trigPin, OUTPUT);
06
pinMode(echoPin, INPUT);
07
}
08
void
loop
() {
09
int
duration, cm;
10
digitalWrite(trigPin, LOW);
11
delayMicroseconds(2);
12
digitalWrite(trigPin, HIGH);
13
delayMicroseconds(10);
14
digitalWrite(trigPin, LOW);
15
duration = pulseIn(echoPin, HIGH);
16
cm = duration / 58;
17
Serial
.print(cm);
18
Serial
.println(
" cm"
);
19
delay(100);
20
}
Дайте мне скетч, который вызывает ошибку со всем его потрохами (библиотеками), чтобы я мог повторить ошибку у себя.
прошу прощения но иначе как чудом не могу объяснить. Отключил датчик и есп модуль (чтобы на работе завтра на другой плате попробывать). Залил скетч чтобы скопировать ошибку, залился без ошибок. Подключил назад модуль и датчик, и о чудо работает!!!! Крайне удивлен и прошу прощения за потраченное время.
а нет снова та же ошибка, скетч выложу завтра с работы уже плохо соображаю
скетч выложу завтра с работы уже плохо соображаю
казнить нельзя помиловать
и снова здравствуйте
вот скетч который не компилируется:
001
#include <SoftwareSerial.h>
002
SoftwareSerial ESPport(10, 11);
003
004
#define BUFFER_SIZE 128
005
char
buffer[BUFFER_SIZE];
006
int
echoPin = 9;
007
int
trigPin = 8;
008
void
setup
()
009
{
010
pinMode(trigPin,OUTPUT);
011
pinMode(echoPin,INPUT);
012
013
// Serial.begin(115200); // Терминал
014
// ESPport.begin(115200); // ESP8266
015
016
webserver();
017
018
019
}
020
///////////////////основной цикл, принимает запрос от клиента///////////////////
021
void
loop
()
022
{
023
//getDistance();
024
int
ch_id, packet_len, d;
025
char
*pb;
026
027
028
029
ESPport.readBytesUntil(
'\n'
, buffer, BUFFER_SIZE);
030
031
if
(strncmp(buffer,
"+IPD,"
, 5)==0){
032
sscanf(buffer+5,
"%d,%d"
, &ch_id, &packet_len);
033
if
(packet_len > 0)
034
{
035
pb = buffer+5;
036
while
(*pb!=
':'
) pb++;
037
pb++;
038
if
((strncmp(pb,
"GET / "
, 6) == 0) || (strncmp(pb,
"GET /?"
, 6) == 0))
039
{
040
Serial
.println(buffer);
041
Serial
.print(
"get led from ch :"
);
042
Serial
.println(ch_id);
043
delay(100);
044
clearSerialBuffer();
045
046
otvet_klienty(ch_id);
047
}
048
}
049
}
050
clearBuffer();
051
}
052
053
054
055
056
//////////////////////формирование ответа клиенту////////////////////
057
void
otvet_klienty(
int
ch_id)
058
{
059
float
duration,cm;
060
digitalWrite(trigPin, LOW);
061
delayMicroseconds(2);
062
digitalWrite(trigPin, HIGH);
063
delayMicroseconds(10);
064
digitalWrite(trigPin, LOW);
065
duration = pulseIn(echoPin, HIGH);
066
cm = duration / 58;
067
//cm=50;
068
069
String Header;
070
071
Header =
"HTTP/1.1 200 OK\r\n"
;
072
Header +=
"Content-Type: text/html\r\n"
;
073
Header +=
"Connection: close\r\n"
;
074
075
String Content;
076
077
Content =
"<body><form action='' method='GET'><input type='submit' value='VKL/OTKL'> "
+String(cm);
078
Content +=
"</form></body></html>"
;
079
080
Header +=
"Content-Length: "
;
081
Header += (
int
)(Content.length());
082
Header +=
"\r\n\r\n"
;
083
084
ESPport.print(
"AT+CIPSEND="
);
// ответ клиенту
085
ESPport.print(ch_id);
086
ESPport.print(
","
);
087
ESPport.println(Header.length()+Content.length());
088
delay(20);
089
090
if
(ESPport.find(
">"
))
091
{
092
ESPport.print(Header);
093
ESPport.print(Content);
094
delay(200);
095
}
096
}
097
/////////////////////отправка АТ-команд/////////////////////
098
String GetResponse(String AT_Command,
int
wait)
099
{
100
String tmpData;
101
102
ESPport.println(AT_Command);
103
delay(wait);
104
while
(ESPport.available() >0 )
105
{
106
char
c = ESPport.read();
107
tmpData += c;
108
109
if
( tmpData.indexOf(AT_Command) > -1 )
110
tmpData =
""
;
111
else
112
tmpData.trim();
113
114
}
115
return
tmpData;
116
}
117
//////////////////////очистка ESPport////////////////////
118
void
clearSerialBuffer(
void
)
119
{
120
while
( ESPport.available() > 0 )
121
{
122
ESPport.read();
123
}
124
}
125
////////////////////очистка буфера////////////////////////
126
void
clearBuffer(
void
) {
127
for
(
int
i =0;i<BUFFER_SIZE;i++ )
128
{
129
buffer[i]=0;
130
}
131
}
132
////////////////////подключение к wifi/////////////////////
133
boolean connectWiFi(String NetworkSSID,String NetworkPASS)
134
{
135
String cmd =
"AT+CWJAP=\""
;
136
cmd += NetworkSSID;
137
cmd +=
"\",\""
;
138
cmd += NetworkPASS;
139
cmd +=
"\""
;
140
Serial
.println(cmd);
141
Serial
.println(GetResponse(cmd,6500));
142
}
143
144
void
webserver(){
145
Serial
.println(GetResponse(
"AT+CIOBAUD=9600"
,100));
146
Serial
.begin(9600);
// Терминал
147
ESPport.begin(9600);
// ESP8266
148
clearSerialBuffer();
149
Serial
.println(
"RESET 3,5 sek"
);
150
Serial
.println(GetResponse(
"AT+RST"
,3400));
// перезагрузка ESP
151
Serial
.println(GetResponse(
"AT+CWMODE=1"
,300));
// режим клиента
152
Serial
.println(GetResponse(
"AT+CWDHCP=1,0"
,300));
// режим клиента
153
Serial
.println(GetResponse(
"AT+CIPSTA=\"*.209\",\"*.1\",\"255.255.255.0\""
,300));
// ip
154
connectWiFi(
"**"
,
"**pas"
);
// подключаемся к домашнему роутеру (имя точки, пароль)
155
Serial
.println(GetResponse(
"AT+CIPMODE=0"
,300));
// сквозной режим передачи данных.
156
Serial
.println(GetResponse(
"AT+CIPMUX=1"
,300));
// multiple connection.
157
Serial
.print(
"Start TCP-server: "
);
158
Serial
.println(GetResponse(
"AT+CIPSERVER=1,88"
, 300));
// запускаем ТСР-сервер на 88-ом порту
159
Serial
.println(GetResponse(
"AT+CIPSTO=2"
, 300));
// таймаут сервера 2 сек
160
Serial
.println(GetResponse(
"AT+CIFSR"
, 300));
// узнаём адрес
161
}
162
пишет:
C:\Users\Intel\Documents\Arduino\wifi_super\wifi_super.ino: In function
'void otvet_klienty(int)'
:
C:\Users\Intel\Documents\Arduino\wifi_super\wifi_super.ino:90:22: warning: deprecated conversion from
string
constant to
'char*'
[-Wwrite-strings]
if
(ESPport.find(
">"
))
^
C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\main.cpp: In function
'main'
:
C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\main.cpp:51:1: error: unable to find a register to spill
in
class
'NO_REGS'
}
^
C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\main.cpp:51:1: error:
this
is
the insn:
(insn 671 668 674 37 (
set
(mem:QI (post_dec:HI (reg/f:HI 32 __SP_L__)) [0 S1 A8])
(subreg:QI (reg/f:HI 450) 1)) C:\Users\Intel\Documents\Arduino\wifi_super\wifi_super.ino:32 1 {pushqi1}
(expr_list:REG_ARGS_SIZE (const_int 7 [0x7])
(nil)))
C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\main.cpp:51: confused by earlier errors, bailing
out
lto-wrapper: C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-gcc returned 1 exit status
c:/program files (x86)/arduino/hardware/tools/avr/bin/../lib/gcc/avr/4.9.2/../../../../avr/bin/ld.exe: lto-wrapper failed
collect2.exe: error: ld returned 1 exit status
exit status 1
Ошибка компиляции для платы Arduino/Genuino Uno.
если в блоке:
01
//////////////////////формирование ответа клиенту////////////////////
02
void
otvet_klienty(
int
ch_id)
03
{
04
float
duration,cm;
05
digitalWrite(trigPin, LOW);
06
delayMicroseconds(2);
07
digitalWrite(trigPin, HIGH);
08
delayMicroseconds(10);
09
digitalWrite(trigPin, LOW);
10
duration = pulseIn(echoPin, HIGH);
11
cm = duration / 58;
12
//cm=50;
13
14
String Header;
15
16
Header =
"HTTP/1.1 200 OK\r\n"
;
17
Header +=
"Content-Type: text/html\r\n"
;
18
Header +=
"Connection: close\r\n"
;
19
20
String Content;
21
22
Content =
"<body><form action='' method='GET'><input type='submit' value='VKL/OTKL'> "
+String(cm);
23
Content +=
"</form></body></html>"
;
24
25
Header +=
"Content-Length: "
;
26
Header += (
int
)(Content.length());
27
Header +=
"\r\n\r\n"
;
28
29
ESPport.print(
"AT+CIPSEND="
);
// ответ клиенту
30
ESPport.print(ch_id);
31
ESPport.print(
","
);
32
ESPport.println(Header.length()+Content.length());
33
delay(20);
34
35
if
(ESPport.find(
">"
))
36
{
37
ESPport.print(Header);
38
ESPport.print(Content);
39
delay(200);
40
}
41
}
вместо
1
float
duration,cm;
2
digitalWrite(trigPin, LOW);
3
delayMicroseconds(2);
4
digitalWrite(trigPin, HIGH);
5
delayMicroseconds(10);
6
digitalWrite(trigPin, LOW);
7
duration = pulseIn(echoPin, HIGH);
8
cm = duration / 58;
9
//cm=50;
написать например
1
float
duration,cm;
2
3
cm=50;
то все компилируется и работает. Запускается веб сервер, по адресу пишет растояние 50.
отдельно скетч определения расстояния откуда копирую код
01
int
echoPin = 9;
02
int
trigPin = 8;
03
void
setup
(){
04
Serial
.begin(9600);
05
pinMode(trigPin,OUTPUT);
06
pinMode(echoPin,INPUT);
07
}
08
09
void
loop
(){
10
int
duration,cm;
11
digitalWrite(trigPin, LOW);
12
delayMicroseconds(2);
13
digitalWrite(trigPin, HIGH);
14
delayMicroseconds(10);
15
digitalWrite(trigPin, LOW);
16
duration =pulseIn(echoPin, HIGH);
17
cm = duration / 58;
18
Serial
.print(cm);
19
Serial
.println(
" cm"
);
20
delay(100);
21
}
22
23
тоже работает. Что я не так связываю? И что за ошибки?
И что за ошибки?
С такой проблемой сталкиваюсь второй раз. Пока могу сказать, что это в любом случае не Ваша ошибка, но Вы её чем-то провоцируете. Сегодня в течение дня найду время заняться и, надеюсь, разберусь как убрать провокацию.
В IDE 1.6.5 компилируется хорошо
В 1.8.1 ошибка вылазит
Попробую скачать старую иде, отпишусь
Хорошо, а я попробую разобраться с этой.
Только не обещаю прямо сейчас, но в течение дня найду время.
Поставил 1.6.5 скомпилировал - отказался вгружать.
1.6.3 скомпилировал вгрузил но работает не коректно.
веб страница не всегда отображается, но чаще отображается. А данные с датчика хоть и меняются от изменения расстояния, но не пропорционально и совсем не похожи на сантиметры
Поставил 1.6.5 скомпилировал - отказался вгружать.
1.6.3 скомпилировал вгрузил но работает не коректно.
веб страница не всегда отображается, но чаще отображается. А данные с датчика хоть и меняются от изменения расстояния, но не пропорционально и совсем не похожи на сантиметры
Это уже скорее всего проблема кода как такового.
В общем, по изначальному сообщению. Там написано (в Вашем сообщении) что ломается "lto-wrapper failed". Причины (что с ним) ясны не до конца. Скорее всего, какая-то часть файлов поставляемых уже скомпилированными, компилировалась без lto - а это неправильно. По идее, если используется lto то все файлы должны компилироваться с этой опцией, и линкер надо запускать с нею же.
Простое решение таково (отказаться от использования lto):
1. Находите файл <где стоит IDE>\hardware\arduino\avr\platform.txt
2. В нём заменяете все вождения контекста "-flto" на, например, пробел
3. Перезапускаете IDE и всё компилируется (проверял на 1.8.1).
Рещение хреновое, т.к. lto не самая бесполезная вещь, но более глобально разбираться и заставлять его работать - совсем другое время требуется. Попробуйте запостить кейс на сайте разработчиков IDE. Пусть они заставляют это работать.
может не правильно что то понял в моем файле platform.txt следущее
# ctags
# ------------------------------
tools.ctags.path={runtime.tools.ctags.path}
tools.ctags.cmd.path={path}/ctags
tools.ctags.pattern=
"{cmd.path}"
-u --language-force=c++ -f - --c++-kinds=svpf --fields=KSTtzns --line-directives
"{source_file}"
# additional entries
tools.avrdude.path={runtime.tools.avrdude.path}
preproc.macros.flags=-w -x c++ -E -CC
#preproc.macros.compatibility_flags={build.mbed_api_include} {build.nRF51822_api_include} {build.ble_api_include} {compiler.libsam.c.flags} {compiler.arm.cmsis.path} {build.variant_system_include}
#recipe.preproc.macros="{compiler.path}{compiler.cpp.cmd}" {compiler.cpreprocessor.flags} {compiler.cpp.flags} {preproc.macros.flags} -DF_CPU={build.f_cpu} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} {compiler.cpp.extra_flags} {build.extra_flags} {preproc.macros.compatibility_flags} {includes} "{source_file}" -o "{preprocessed_file_path}"
и как понимаю нет никаких -flto
arduino ide 1.8.1
Это не тот файл.
Давайте так, у меня IDE установлена по адресу C:\Arduino\arduino-1.8.1\ . У Вас, возможно, в другом месте. Поэтому делайте поправку на корневую папку.
Так вот
Этот файл, что Вы показваете, находится в папке
C:\Arduino\arduino-1.8.1\hardware
а Вам нужен файл из папки
C:\Arduino\arduino-1.8.1\hardware\arduino\avr
Он там есть, посмотрите.
Ну, чё, помогло?
да) Все работает как и хотел!
счас попробую остальные три дальномера добавить, а чем черевато отключение этого lto?
а чем черевато отключение этого lto?
Менее интеллектуально будет выбрасывать из кода неиспользуемые функции.
Вот смотрите. Если Вы описали в программе какую-нибудь функцию и ни разу нигде её не вызываете, её по идее не нужно включать в окончательный загружаемый код. Тут всё зависит от того, как именно Вы её описали
1
// Случай №1
2
void
kakaya_to_funkciya_1(
void
) {
3
....
4
}
5
6
// Случай №2
7
static
void
kakaya_to_funkciya_2(
void
) {
8
....
9
}
В втором случае kakaya_to_funkciya_2 будет выброшена самим компилятором и тут проблем нет и lto не при делах.
В первом же случае компилятор не может выбросить функцию kakaya_to_funkciya_1, т.к. она может вызываться из других файлов, а компилятору это неоткуда узнать - он только с одним файлом работает.
Эту функцию скорее всего выбросит компоновщик. Но это "скорее всего". Возможны варианты при которых он не поймёт, что она не нужна и оставит её в коде от греха подальше.
Так вот lto - это совместная техника компилятора и компоновщика. Первый помечает функции, которые в данном файле не нужны, а второй, основываясь на этих пометках и на своём собственном анализе, выбрасывает реально ненужные функции более надёжно, чем он может это сделать без lto-шных пометок.
Понятен механизм?
Чтобы это работало надо включать lto и при компиляции, и при компоновке. А ошибка возникакет скорее всего из-за того. что часть файлов была скомпилирована без lto и компоновщик не может найти никаких пометок и это его иногда сводит с ума.
И, кстати, надеюсь, теперь Вам будет понятен совет: если Вы пишете функцию (или описываете глобальную переменную), которую не предполагаете вызывать из других файлов, не поленитесь использовать слово static. Этим Вы облегчите жизнь компилятору и гарантированно получите правильную оптимизацию.
Евгений большое спасибо за помощь и пояснения!
планирую сделать прикольную штуку, но именно с ардуино это мой первый проект.
Если интересно , вкраце, автоматизированный стеллаж хранения металла.
четыре телеги заезжают на двигателях в этажерку друг над другом, для экономии места на производсвтенном участке.
arduino позволит через веб интерфейс выдвивгать необходимую полку с металлом, и показывать анимацию. будет доступно как с компюьтера так и с телефона.
а сонары нужны чтобы определять расстояние до телег для позиционирования
Круто! У меня вот проблема с позиционированием тележки. Я правда хочу это "в чистом поле" делать, никак не могу придумать как её позиционировать точнее, чем по GPS :(
Круто! У меня вот проблема с позиционированием тележки. Я правда хочу это "в чистом поле" делать, никак не могу придумать как её позиционировать точнее, чем по GPS :(
смотри какая тема
Режим RTK обеспечивает в реальном времени точность порядка 1 см в плане и 2 см по высоте.
https://ru.wikipedia.org/wiki/GPS