Offline
Зарегистрирован: 12.12.2019
Все перепробовал — не нашел ни где лишний символ:
/* Тестировалось на Arduino IDE 1.8.0 Дата тестирования 26.07.2017г. */ #include <ESP8266WiFi.h> const char* ssid = "Название Вашей сети"; const char* password = "Пароль от Вашей сети"; #define ONE_WIRE_BUS 2 int tempair = 0; WiFiServer server(80); void setup() { Serial.begin(115200); Serial.println(""); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); server.begin(); Serial.println("Web server running."); delay(10000); Serial.println(WiFi.localIP()); } void loop() { WiFiClient client = server.available(); if (client) { Serial.println("New client"); boolean blank_line = true; while (client.connected()) { if (client.available()) { char c = client.read(); if (c == 'n' && blank_line) { client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println("Connection: close"); client.println("Refresh: 10"); client.println(); client.println("<!DOCTYPE html>"); client.println("<html>"); client.println("<head>"); client.println("<meta charset="utf - 8">"); client.println("<title>Блокировка поля</title>"); client.println("<script>"); client.println("function agreeForm(f) {"); client.println{"if (f.agree.checked){ f.submit.disabled = 1"); client.println("f.submitone.disabled = 1"); client.println("f.timemode.disabled = 0"); client.println("f.datmode.disabled = 0}"); client.println("else {f.submit.disabled = 0"); client.println("f.submitone.disabled = 0"); client.println("f.timemode.disabled = 1"); client.println("f.datmode.disabled = 1} }"); client.println("</script>"); client.println("</head>"); client.println("<body>"); client.println("<form>"); client.println("<h2>Добро пожаловать хозяин</h2>"); client.println("<p><textarea cols="50 % " rows="4 % " disabled>Добро пожаловать в систему управления реле по WiFi, как вручную, так и используюя возможность автоматического управления по времени, либо по показаниями датчиков(например: температура и влажность воздуха, датчик света, датчик влажности почвы.Устройство принимает данные от любого датчика, с цифровым выводом Если появились вопросы - звоните 89831555030) "); client.println("</textarea></p>"); client.println("<h3>Temperature = "); client.println("*C</h3>"); client.println("<p><input type="submit" name="submit" value="Включить реле"></p>"); client.println("<p><input type="submit" name="submitone" value="Вsключить реле"></p>"); client.println("<p><input type="checkbox" name="agree" onclick="agreeForm(this.form)">"); client.println("Включить/Выключить автоматику</p>"); client.println("<p><input type="checkbox" name="timemode" disabled>"); client.println("Срабатывание по датчику температуры</p>"); client.println("<p><input type="checkbox" name="datmode" disabled>"); client.println("Срабатывание по датчику температуры</p>"); client.println("</form>"); client.println("</body>"); client.println("</html>"); break; } if (c == 'n') { blank_line = true; } else if (c != 'r') { blank_line = false; } } } client.stop(); Serial.println("Client disconnected."); } }
Первая прошивка
Итак, разобрались со средой разработки, теперь можно загрузить прошивку. Рекомендую загрузить пустую прошивку, чтобы убедиться, что все драйвера установились и плата вообще прошивается. Также лучше делать это с новой или заведомо рабочей платой.
1. Плата подключается к компьютеру по USB, на ней должны замигать светодиоды. Если этого не произошло:
- Неисправен USB кабель.
- Неисправен USB порт компьютера.
- Неисправен USB порт Arduino.
- Попробуйте другой компьютер, чтобы исключить часть проблем из списка.
- Попробуйте другую плату, чтобы исключить часть проблем из списка.
- На плате Arduino сгорел диод по питанию USB.
- Плата Arduino сгорела полностью из-за неправильного подключения питания или короткого замыкания
2. Компьютер издаст характерный сигнал подключения нового оборудования, а при первом подключении появится окошко “Установка нового оборудования”. Если этого не произошло:
- См. предыдущий список неисправностей.
- Кабель должен быть data-кабелем, а не “зарядным”.
- Кабель желательно втыкать напрямую в компьютер, а не через USB-хаб.
- Не установлены драйверы для Arduino.
3. В списке портов (Arduino IDE/Инструменты/Порт) появится новый порт, отличный от COM1. Если этого не произошло:
- См. предыдущий список неисправностей.
- Некорректно установлен драйвер CH341.
- Если список портов вообще неактивен – драйвер Arduino установлен некорректно, вернитесь к установке
- Возникла системная ошибка, обратитесь к знакомому компьютерщику
4. Выбираем свою плату. Если это Arduino Nano, выбираем в ИнструментыПлатаArduino Nano. Если другая – выбираем другую. Нажимаем стрелочку в левом верхнем углу (загрузить прошивку). Да, загружаем пустую прошивку.
- [Для Arduino Nano] В микроконтроллер китайских нанок зашит “старый” загрузчик, поэтому выбираем ИнструментыПроцессорATmega328p (Old Bootloader). Некоторые китайцы зашивают в свои платы новый загрузчик, поэтому если прошивка не загрузилась (загрузка идёт минуту и вылетает ошибка avrdude: stk500_getsync()) – попробуйте сменить пункт Процессор на ATmega328p.
Если появилась надпись “Загрузка завершена” – значит всё в порядке и можно прошивать другие скетчи. В любом случае на вашем пути встретятся другие два варианта событий, происходящих после нажатия на кнопку “Загрузка” – это ошибка компиляции и ошибка загрузки. Вот их давайте рассмотрим более подробно.
Ошибки компиляции
Возникает на этапе компиляции прошивки. Ошибки компиляции вызваны проблемами в коде прошивки.
- В некоторых случаях ошибка возникает при наличии кириллицы (русских букв) в пути к папке со скетчем. Решение: завести для скетчей отдельную папочку в корне диска с английским названием.
- В чёрном окошке в самом низу Arduino IDE можно прочитать полный текст ошибки и понять, куда копать.
- В скачанных с интернета готовых скетчах часто возникает ошибка с описанием название_файла.h no such file or directory. Это означает, что в скетче используется библиотека <название файла>, и нужно положить её в Program Files/Arduino/libraries/. Ко всем моим проектам всегда идёт папочка с использованными библиотеками, которые нужно установить. Также библиотеки всегда можно поискать в гугле по название файла.
- При использовании каких-то особых библиотек, методов или функций, ошибкой может стать неправильно выбранная плата в “Инструменты/плата“. Пример: прошивки с библиотекой Mouse.h или Keyboard.h компилируются только для Leonardo и Micro.
- Если прошивку пишете вы, то любые синтаксические ошибки в коде будут подсвечены, а снизу в чёрном окошке можно прочитать более детальное описание, в чём собственно косяк. Обычно указывается строка, в которой сделана ошибка, также эта строка подсвечивается красным.
- Иногда причиной ошибки бывает слишком старая, или слишком новая версия Arduino IDE. Читайте комментарии разработчика скетча
- Ошибка недостаточно свободного места возникает по вполне понятным причинам. Возможно поможет урок по оптимизации кода.
Частые ошибки в коде, приводящие к ошибке компиляции
- expected ‘,’ or ‘;’ – пропущена запятая или точка запятой на предыдущей строке
- stray ‘320’ in program – русские символы в коде
- expected unqualified-id before numeric constant – имя переменной не может начинаться с цифры
- … was not declared in this scope – переменная или функция используется, но не объявлена. Компилятор не может её найти
- redefinition of … – повторное объявление функции или переменной
- storage size of … isn’t known – массив задан без указания размера
Ошибки загрузки
Возникают на этапе, когда программа успешно скомпилирована и производится загрузка в плату по кабелю. Ошибка может возникать как по причине неисправностей железа, так и из-за настроек программы и драйверов.
- USB кабель, которым подключается Arduino, должен быть Data-кабелем, а не кабелем только для зарядки. Нужным нам кабелем подключаются к компьютеру плееры и смартфоны.
- Причиной ошибки загрузки являются не установленные/криво установленные драйвера CH340, если у вас китайская NANO.
- Также будет ошибка avrdude: ser_open(): can’t open device, если не выбран COM порт, к которому подключена Arduino. Если кроме COM1 других портов нет – читай два пункта выше, либо попробуй другой USB порт, или вообще другой компьютер.
- Большинство проблем при загрузке, вызванных “зависанием” ардуины или загрузчика, лечатся полным отключением ардуины от питания. Потом вставляем USB и по новой прошиваем.
- Причиной ошибки загрузки может быть неправильно выбранная плата в “Инструменты/Плата”, а также неправильно выбранный процессор в “Инструменты/Процессор”. Также в свежих версиях IDE нужно выбирать ATmega328P (Old Bootloader) для китайских плат NANO.
- Если у вас открыт монитор COM порта в другом окне Arduino IDE или плата общается через СОМ порт с другой программой (Ambibox, HWmonitor, SerialPortPlotter и т.д.), то вы получите ошибку загрузки, потому что порт занят. Отключитесь от порта или закройте другие окна и программы.
- Если у вас задействованы пины RX или TX – отключите от них всё! По этим пинам Arduino общается с компьютером, в том числе для загрузки прошивки.
- Если в описании ошибки встречается bootloader is not responding и not in sync, а все предыдущие пункты этого списка проверены – с вероятностью 95% сдох загрузчик. Второй неприятный исход – загрузчик “слетел”, и его можно прошить заново.
Предупреждения
Помимо ошибок, по причине которых проект вообще не загрузится в плату и не будет работать, есть ещё предупреждения, которые выводятся оранжевым текстом в чёрной области лога ошибок. Предупреждения могут появиться даже тогда, когда выше лога ошибок появилась надпись “Загрузка завершена“. Это означает, что в прошивке нет критических ошибок, она скомпилировалась и загрузилась в плату. Что же тогда означают предупреждения? Чаще всего можно увидеть такие:
- # Pragma message… – это просто сообщения, оставленные разработчиком проекта или библиотеки. Чаще всего номер версии и прочая информация.
- Недостаточно памяти, программа может работать нестабильно – Чуть выше этого предупреждения обычно идёт информация о задействованной памяти. Память устройства можно добивать до 99%, ничего страшного не случится. Это флэш память и во время работы она не изменяется. А вот динамическую память желательно забивать не более 85-90%, иначе реально могут быть непонятные глюки в работе, так как память постоянно “бурлит” во время работы. НО. Это зависит от скетча и в первую очередь от количества локальных переменных. Можно написать такой код, который будет стабильно работать при 99% занятой SRAM памяти. Так что ещё раз: это всего лишь предупреждение, а не ошибка.
FAQ
Завершая раздел Введение в Arduino поговорим о вопросах, которые очень часто возникают у новичков:
- Ардуину можно прошить только один раз? Нет, несколько десятков тысяч раз, всё упирается в ресурс Flash памяти. А он довольно большой.
- Как стереть/нужно ли стирать старую прошивку при загрузке новой? Память автоматически очищается при прошивке, старая прошивка автоматически удаляется.
- Можно ли записать две прошивки, чтобы они работали вместе? Нет, при прошивке удаляются абсолютно все старые данные. Из двух прошивок нужно сделать одну, причём так, чтобы не было конфликтов. Подробнее в этом уроке.
- Можно ли “вытащить” прошивку с уже прошитой Ардуины? Теоретически можно, но только в виде нечитаемого машинного кода, в который преобразуется прошивка на С++ при компиляции, т.е. вам это НИКАК не поможет, если вы не имеете диплом по низкоуровневому программированию. Подробнее в этом уроке.
- Зачем это нужно? Например есть у нас прошитый девайс, и мы хотим его “клонировать”. В этом случае да, есть вариант сделать дамп прошивки и загрузить его в другую плату на таком же микроконтроллере.
- Если есть желание почитать код – увы, прошивка считывается в виде бинарного машинного кода, превратить который обратно в читаемый Си-подобный код обычному человеку не под силу.
- Вытащить прошивку, выражаясь более научно – сделать дамп прошивки, можно при помощи ISP программатора, об этом можно почитать здесь.
- Снять дамп прошивки можно только в том случае, если разработчик не ограничил такую возможность, например записав лок-биты, запрещающие считывание Flash памяти, или вообще отключив SPI шину. Если же разработчик – вы, и есть желание максимально защитить своё устройство от копирования – гуглите про лок-биты и отключение SPI
Видео
Полезные страницы
- Набор GyverKIT – большой стартовый набор Arduino моей разработки, продаётся в России
- Каталог ссылок на дешёвые Ардуины, датчики, модули и прочие железки с AliExpress у проверенных продавцов
- Подборка библиотек для Arduino, самых интересных и полезных, официальных и не очень
- Полная документация по языку Ардуино, все встроенные функции и макросы, все доступные типы данных
- Сборник полезных алгоритмов для написания скетчей: структура кода, таймеры, фильтры, парсинг данных
- Видео уроки по программированию Arduino с канала “Заметки Ардуинщика” – одни из самых подробных в рунете
- Поддержать автора за работу над уроками
- Обратная связь – сообщить об ошибке в уроке или предложить дополнение по тексту ([email protected])
При попытке подключения .h файла выдает ошибка: stray ‘320’ in program. От чего это может быть? Пробовал скомпилировать без реализации в .сpp файле, по сути подключил .h файл в пустой .cpp файл, но она никуда не исчезла…
Вот так выглядит .h файл, работаю в QtCreator компилятор gcc под unix
#pragma once
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <fcntl.h>
#include <iostream>
#include "string.h"
#include <map>
#include <sys/epoll.h>
#include<vector>
#include "core.h"
#include "httpparser.h"
#include "htttpheader.h"
#include <sys/epoll.h>
class ConeThreadPool{
public:
ConeThreadPool(unsigned int numberОfThreads, int maxfd);
~ConeThreadPool();
int getFreeThread(epoll_event events[]);
void setFd(int thradFD, int fd);
private:
int threadManager;
unsigned int numberОfThreads;
std::vector<int> threadList;
int getFD(int socket);
};
JK_Action
9239 серебряных знаков22 бронзовых знака
задан 25 мар 2020 в 9:35
Denver TohaDenver Toha
2,5101 золотой знак9 серебряных знаков25 бронзовых знаков
2
Видимо копировали код или писали не сами? Перепишите из одного файлика в другой, в смысле перепечатайте, судя по всему попался служебный символ.
ответ дан 25 мар 2020 в 9:52
1
-
Здравствуйте! Что сделал не так? Помогите
Эксперимент 2. Маячок с нарастающей яркостью
exit status 1
stray ‘320’ in program -
Код и схему в студию.
Или вы хотите что-бы Вам написали, что не так в проекте Амперки.
Видимо на строку ругается! -
// даём разумное имя для пина №9 со светодиодом
// (англ. Light Emitting Diode или просто «LED»)
// Так нам не нужно постоянно вспоминать куда он подключён
#define LED_PIN 9void setup()
{
// настраиваем пин со светодиодом в режим выхода,
// как и раньше
pinMode(LED_PIN, OUTPUT);
}void loop()
{
// выдаём неполное напряжение на светодиод
// (он же ШИМ-сигнал, он же PWM-сигнал).
// Микроконтроллер переводит число от 0 до 255 к напряжению
// от 0 до 5 В. Например, 85 — это 1/3 от 255,
// т.е. 1/3 от 5 В, т.е. 1,66 В.
analogWrite(LED_PIN, 85);
// держим такую яркость 250 миллисекунд
delay(250);// выдаём 170, т.е. 2/3 от 255, или иными словами — 3,33 В.
// Больше напряжение — выше яркость!
analogWrite(LED_PIN, 170);
delay(250);// все 5 В — полный накал!
analogWrite(LED_PIN, 255);
// ждём ещё немного перед тем, как начать всё заново
delay(250);
}а схема та которая у них на картинке ,да и скетч с сайта
Последнее редактирование: 16 дек 2015
-
Copy/Paste?
Если, да, то похоже проблема с кодировкой.
Попробуйте убрать все комментарии:#define LED_PIN 9void setup()
{
pinMode(LED_PIN, OUTPUT);
}void loop()
{
analogWrite(LED_PIN, 85);
delay(250);
analogWrite(LED_PIN, 170);
delay(250);
analogWrite(LED_PIN, 255);
delay(250);
} -
Похоже, что где-то не на месте стоит русская буква «п».
-
#define LED_PIN 9
void setup()
{
pinMode(LED_PIN, OUTPUT);
}void loop()
{
analogWrite(LED_PIN, 25);
delay(250);
analogWrite(LED_PIN, 170);
delay(250);
analogWrite(LED_PIN, 255);
delay(250);
}
Загрузил,работает .
Всем спасибо!!!
0 / 0 / 0 Регистрация: 16.10.2015 Сообщений: 13 |
|
1 |
|
Ошибки при компиляции09.02.2017, 22:00. Показов 6949. Ответов 2
Вот такие ошибки у меня выдает при компиляции: error: stray ‘260’ in program
0 |
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
09.02.2017, 22:00 |
Ответы с готовыми решениями: с2079 и с2228 ошибки при компиляции ниже участок кода, с которым праблема и скрины ошибки // КЛАССЫ class mob Ошибка памяти при выполнении, при компиляции не выводит ошибки Ошибки при компиляции Ошибки при компиляции Условие задачи: Дан текст, состоящий из предложений, разделяемых… 2 |
Диссидент 27497 / 17185 / 3784 Регистрация: 24.12.2010 Сообщений: 38,714 |
|
09.02.2017, 22:04 |
2 |
Сообщение было отмечено Anton9volley как решение Решение
Что это может быть? Все, что угодно.
1 |
3174 / 1933 / 312 Регистрация: 27.08.2010 Сообщений: 5,131 Записей в блоге: 1 |
|
09.02.2017, 23:20 |
3 |
Именно. Причем, в кириллической раскладке ‘320’ — это Р, а ‘260’ — символ градуса. Сдается, что там в UTF-8
1 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
09.02.2017, 23:20 |
Помогаю со студенческими работами здесь Ошибки при компиляции Ошибки при компиляции Ошибки при компиляции Ошибки при компиляции Ошибки при компиляции #define MEN 2… Ошибки при компиляции Искать еще темы с ответами Или воспользуйтесь поиском по форуму: 3 |