Ви не увійшли.
Теперь можно приделать у нему GPS модуль и память для сохранения маршрутов - будет сам ездить
Можно и так. Я описал порядок действий как бы делал я.
1. Подключить любую другую плату (не с али) и убедиться, что остатки arduino nano рабочие.
2. Написать любой скетч, в ИДЕ выбрать "Скетч - экспорт бинарного файла". Рядом с исходником создадутся 2 файлика.
3. Взять программатор и через SPI залить файлик содержащий бутлоадер. Заодно проверить правильность установки фьюз.
4. Подключить плату с али к остаткам arduino nano и проверить работоспособность.
Подобные вещи делаются елементарно, ничего сложного. Можно еще и дисплей прицепить для индикации напряжения и т.д.
Этой фразой я хотел сказать, что если программатором залить скетч без бутлоадера и оставить фьюз старта без изменений (старт останется с области бутлоадера), то проц сначала обработает 2К "nop"ов, затем перейдет к основной программе. Время обработки 2К "nop"ов будет намного меньше 1 сек. Сам не раз забывал переустанавливать фьюз старта - что так, что с переустановленым - старт мгновенный.
Вот я блин наивный
, все время думал что бутлоадер находится во флеш МК и прописывается один раз а фьюзы указывают размер и область бут-ра. При старте сначала стартует бут и потом передает управление программе (если нет команды на "заливку"). А оказывается хекс программы уже содержит бут, капец
.
Если прочитать первое сообщение - там как раз и идет речь о заливке hex не содержащего бутлоадер сторонним программатором, а не о стандартных средствах ардуино. Ваши рассуждения относятся к стандартным средствам ардуино, но никто не запрещает работать с платой ардуино через ICSP.
Если использовать программатор, то:
бутлоадер находится во флеш МК - согласен, изначально он там есть, но я вместо него могу записать программатором что хочу.
прописывается один раз а фьюзы указывают размер и область бут-ра - а что мешает переписывать бутлоадер хоть по сто раз на день? В самой IDE есть пункт "записать бутлоадер".
старте сначала стартует бут и потом передает управление программе - опять же если он там есть, я могу его область заполнить "nop"ами или переписать фьюзы на старт с нулевого адреса, а не с бутлоадера.
Для ТС было важно выиграть время, которое бутлоадер тратит на ожидание команды на "заливку". Делал он вроде правильно, но "что-то пошло не так".
Я не вижу смысла развивать дискуссию дальше, мы говорим о разных вещах и похоже ТС тема уже не интересна.
Откройте секрет что это за hex без загрузчика
. И пока проц где то бегает я стою в лыжи обутый
Выбираем:
Получаем:
Берем файлик без бутлоадера и заливаем любым программатором. Желательно также переустановить флаг старта. Если этого не сделать, программа будет стартовать с области бутлоадера, но так область бутлоадера забита "nop", проц пройдет по nop-ам до конца памяти и начнет сначала. Времени тратится примерно 2К / 16МГц = 0,0001 сек = 0.1 мсек.
4.7 кОм ставиш и будет работать.
evgeniy, если нужна долговечность и стабильность то DHT11 однозначно не подойдет.
1. 75% находится на краю рабочего диапазона измерения влажности (по памяти максималка 80) и точность тут будет сильно хромать.
2. При работе с таких условиях DHT11 бысто выходит из строя - начинает сильно врать. Я за сезон с инкубаторе поменял 2 шт.
Можно вообще не использовать бутлоадер, тогда никаких проблем с watchdog не возникает.
В ходе работы наткнулся на неприятность. Не работает такая конструкция:
void setup(){
.....
if (analogRead(ButonsPin) < 100) Set_Time_and_Date;
.....
}
void Set_Time_and_Date(){
.....
}
void loop() {
....
}
Если тело функции Set_Time_and_Date перенести в setup под оператор if - все работает. Так должно быть?
Даже если не переустановить флаг BOOTRST и записать hex без загрузчика - время старта будет несколько милисек, пока проц "пробежит" область загрузчика, но ни как не 1 сек.
Попробуй создать hex через "Скетч - экспорт бинарного файла"
Может точность?
А даташиты посмотреть? Там и точность, и линейность, и все остальное указано.
А кто модер на форуме?
Можно ли польский и не только спам поудалять и автора в бан?
Что например? У тебя подход к реализации неправильный. Советую ознакомится с базовыми принципами построения схем.
1. Надо начать с того, что у светодиодов считается рабочим ток, а не напряжение. Иными словами для светодиодов надо задавать ток, а напряжение какое на нем получится - такое и будет (указано в даташите). Что и делает последовательно с ним включенный резистор.
2. Выходы имеют логические уровни 0 и 1, а не 0В и 5В. В КМОП логике выходные напряжения 0 и 1 близки к 0В и уровню питания, причем часто фактически разделом является половина напряжение питания с 0,1-0,2В зоной неопределенности. А вот в ТТЛ "0" - меньше 0,4В, "1" - больше 3,5В (пишу по памяти, точные цифры не помню). Как правило выходы имеют защиту от КЗ - ограничение выходного тока, использовать этот режим не советую, грозит быстрым локальным перегревом кристалла и выходом микросхемы из строя.
3. 2,5В на светодиоде будет при определенном токе. Если в 2 раза уменьшить или увеличить ток, напряжение на нем не изменится в 2 раза. Его вольт-амперная характеристика похожа на характеристику обычного диода. Может быть такое, что увеличению тока в 2 раза последует увеличение напряжения на нем к примеру на 0,1В. То есть очень легко сжечь светодиод питая его от источника напряжения. Светодиод надо запитывать от источника тока.
4. Включая 2 светодиода вы оставляете очень маленький зазор напряжения для токоограничиваючего резистора, без него все равно ни как. Теоретически и практически можно, надо только подобрать резистор и светодиоды (разные светодиоды имеют разное падение напряжения при рабочем токе). Схема станет более чувствительной к перепадам напряжения питания.
На выходе не строго 5В а логическая 1, а это в большинстве случаев 4,5В.
Что будет - архитектура выхода в проце начнет работать как ограничитель тока. Что конкретно будет в вашем случае зависит от типа светодиодов и проца.
Чтобы не отправлялись все символы уберите Serial.println(symbol);
Еще.
Кнопка как подключена? Резистор есть?
SD-Card модуль какой?
Я пользуюсь PonyProg2000.
Данный код вставить не получится, так как это часть другой программы, его надо адаптировать для вашей программы - изменить или добавить переменные и функции.
Second, Minute, Hour ... - переменные в них хранятся соответствующие значения.
bcd2dec - функция преобразования формата чисел.
Print_Digits - функция преобразования числа в строку.
Надо писать свой обработчик или спросить у гугла.
Когда то давно я писал свой, не помню рабочий ли он на 100%. Вот код, это кусок из программы, но смысл понятен. Поправиш его под свои нужды.
Loop:
//блок считывания текущего времени и даты
Wire.beginTransmission(0x68);
Wire.write((byte)0);
Wire.endTransmission();
Wire.requestFrom(0x68, 7);
// if (Wire.available() < 7) return;
Second = bcd2dec(Wire.read() & 0x7f);
Minute = bcd2dec(Wire.read() );
Hour = bcd2dec(Wire.read() & 0x3f); // mask assumes 24hr clock
Wday = Wire.read();
Day = bcd2dec(Wire.read() );
Month = bcd2dec(Wire.read() );
Year = bcd2dec(Wire.read() ); //отсчет с 2000 года
//блок подготовки строк для вывода на дисплей
Print_Digits(output_string_1, 4, 2, ' ', Hour); //4,0
output_string_1[6] = ':';
Print_Digits(output_string_1, 7, 2, '0', Minute); //7,0
output_string_1[9] = ':';
Print_Digits(output_string_1, 10, 2, '0', Second); //10,0
Print_Digits(output_string_2, 3, 2, ' ', Day); //3,1
output_string_2[5] = '/';
Print_Digits(output_string_2, 6, 2, '0', Month); //6,1
output_string_2[8] = '/';
Print_Digits(output_string_2, 9, 4, '0', Year + 2000); //9,1
//вывод на дисплей
lcd.clear();
lcd.print(output_string_1);
lcd.setCursor(0, 1);
lcd.print(output_string_2);
//считываем нажатия кнопок
key = 0;
if (!digitalRead(GasButonPin)) key = 2;
if (!digitalRead(BenzButonPin)) key = 3;
if (analogRead(ButonsPin) < 100) key = 1;
if (key) delay(500);
else delay(100);
//корректируем время/дату
switch (Cursor) {
case 0: //часы
switch (key) {
case 1: //следующая
Cursor++;
if (Cursor > 5) Cursor = 0;
break;
case 2: // -
if (Hour > 0) Hour--;
break;
case 3: // +
if (Hour < 23) Hour++;
break;
}
lcd.setCursor(4, 0);
break;
case 1: //минуты
switch (key) {
case 1: //следующая
Cursor++;
if (Cursor > 5) Cursor = 0;
break;
case 2: // -
if (Minute > 0) Minute--;
break;
case 3: // +
if (Minute < 60) Minute++;
break;
}
lcd.setCursor(7, 0);
break;
case 2: //секунды
switch (key) {
case 1: //следующая
Cursor++;
if (Cursor > 5) Cursor = 0;
break;
case 2: // -
if (Second > 0) Second--;
break;
case 3: // +
if (Second < 60) Second++;
break;
}
lcd.setCursor(10, 0);
break;
case 3: //день
switch (key) {
case 1: //следующая
Cursor++;
if (Cursor > 5) Cursor = 0;
break;
case 2: // -
if (Day > 1) Day--;
break;
case 3: // +
if (Day < 31) Day++;
break;
}
lcd.setCursor(3, 1);
break;
case 4: //месяц
switch (key) {
case 1: //следующая
Cursor++;
if (Cursor > 5) Cursor = 0;
break;
case 2: // -
if (Month > 1) Month--;
break;
case 3: // +
if (Month < 12) Month++;
break;
}
lcd.setCursor(6, 1);
break;
case 5: //год
switch (key) {
case 1: //следующая
Cursor++;
if (Cursor > 5) Cursor = 0;
break;
case 2: // -
if (Year > 16) Year--;
break;
case 3: // +
if (Year < 250) Year++;
break;
}
lcd.setCursor(9, 1);
break;
}
//записываем время если были нажаты клавиши + или -
if (key > 1)
{
Second |= 0x80; // stop the clock
Wire.beginTransmission(0x68);
Wire.write((uint8_t)0x00); // reset register pointer
Wire.write(dec2bcd(Second)) ;
Wire.write(dec2bcd(Minute));
Wire.write(dec2bcd(Hour)); // sets 24 hour format
Wire.write(Wday);
Wire.write(dec2bcd(Day));
Wire.write(dec2bcd(Month));
Wire.write(dec2bcd(Year));
Wire.endTransmission();
Second &= 0x7f; // start the clock
Wire.beginTransmission(0x68);
Wire.write((uint8_t)0x00); // reset register pointer
Wire.write(dec2bcd(Second)) ;
Wire.endTransmission(); //!!!!!!!!!!!!!!!!!!!!!!!!!! проверить или будет работать с неполной передачей данных!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
}
goto Loop; //зацикливаем настройку, выход из настройки - выключением
}
Ничем. Чревато, если входом - внутренняя подтяжка не на всех процах работает.
Ну как-то так:
#include "etherShield.h"
#include "ETHER_28J60.h"
static uint8_t mac[6] = {0x54, 0x55, 0x58, 0x10, 0x00, 0x24}; // this just needs to be unique for your network,
// so unless you have more than one of these boards
// connected, you should be fine with this value.
static uint8_t ip[4] = {192, 168, 1, 15}; // the IP address for your board. Check your home hub
// to find an IP address not in use and pick that
// this or 10.0.0.15 are likely formats for an address
// that will work.
static uint16_t port = 80; // Use port 80 - the standard for HTTP
ETHER_28J60 ethernet;
void setup()
{
ethernet.setup(mac, ip, port);
}
void loop()
{
if (ethernet.serviceRequest())
{
ethernet.print("<H1>Hello World</H1>");
ethernet.respond();
}
delay(100);
}
Точно так же как и IP адреса - придумать и задать программно.
А зачем плодить еще одну тему?