1

(2 ответов, оставленных в Технические вопросы)

Вот решение проблемы.
http://freeduino.ru/forum/viewtopic.php?id=132

2

(6 ответов, оставленных в Технические вопросы)

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

3

(6 ответов, оставленных в Технические вопросы)

дополню. Температуру с датчика получать начинает не сразу неправильную а спустя минуты три как начинает гореть светодиод. При чём может либо не получать значения либо же получаь но всякую чушь типа то минус пять градусов то минус 170 градусов покажет.

4

(6 ответов, оставленных в Технические вопросы)

И снова требуется Ваша помощь потому как сам я не могу понять причину моих злоключений да и опыт этот у меня первый ввиду чего скорее всего я не вижу элементарной ошибки.
Собственно задумка следуеющая. Девайс мониторит температуру и приеё занчение меньше заданного включается релюха. Вместо релюхи пока юзается светодиод для тестов. Что имею сейчас. Freeduino 2009 + Ethernet Shield v2 + DS18B20.
Собственно сам исходник


#include <DallasTemperature.h>
#include <Ethernet.h>
#include <EEPROM.h>
#include <WString.h>
//Подключаем описание библиотеки ethernet
//Здесь задается MAC адрес и IP адрес устройства.
//В данном примере предполагается, что IP адрес компьютера, с которого
//будем обращаться к устройству будет любым из сети 192.168.1.x,
//и маска 255.255.255.0
//MAC адрес можно задать любой, лишь бы он не пересекался с имеющимися в сети
int outputPin = 9;
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 100, 100, 100, 174 };
Server server(80);
DallasTemperature tempSensor;
String readString = String(30); //string for fetching data from address
//Создаем сервер, слушающий 80й порт (80 – это порт HTTP)
void setup()
{
Ethernet.begin(mac, ip);
server.begin();
tempSensor.begin(8);
pinMode(outputPin, OUTPUT);
Serial.begin(9600);
//EEPROM.write(1, 01);
//EEPROM.write(2, 10);
}
//Инициализируем Ethernet модуль
//Начинаем ожидать соединений на 80 порту
void loop()
{
float f=tempSensor.getTemperature();
Serial.println(tempSensor.getTemperature());
//Serial.println(tempSensor.getTemperature());
//часть отвечающая за подачу сигнала на реле
uint8_t start = EEPROM.read(1);
uint8_t stop = EEPROM.read(2);
if (f < start) {
  digitalWrite(outputPin, HIGH);
  EEPROM.write(0, 2);
}
else if (f > stop) {
  digitalWrite(outputPin, LOW);
  EEPROM.write(0, 1);
}
//uint8_t - тип данных, занимающий 1 байт,
//и хранящий значение от 0 до 255
//uint8_t status;
//считываем значение текущее
uint8_t status = EEPROM.read(0);
//Если кто-то установил соединение с нашим сервером, следующая строчка
//создаст объект-клиент.
Client client = server.available();
if (client) { //если client не нулевой (т.е. соединение есть)
//...значит кто-то подключился. Согласно протокола HTTP клиент
//шлет довольно сложный запрос, но мы не будет его разбирать -
//нам достаточно дождаться окончания запроса.
//Запрос заканчивается пустой строкой, поэтому мы просто дождемся
//получения символа '\n', перед которым тоже были получены '\n' и '\r'.
//current_line_is_blank - это переменная-флаг. Она равна true, если
//вновь полученная от клиента строка пустая, т.е. в полученных данных
//не встретилось символов отличных от '\n' и '\r'.
//Будем выставлять переменную current_line_is_blank в false при
//получении любого отличного от '\n' и '\r' символа
boolean current_line_is_blank = true;
while (client.connected()) {
//пока клиент подключен
if (client.available()) {
//если от него пришел символ
char c = client.read();
//читаем этот символ
if (readString.length() < 30) {
        //store characters to string
        readString.append( c);                   
    } 
   
//Serial.print( c);
//Если получен перевод строки ('\n') и current_line_is_blank == true,
//значит мы получили пустую строку, т.е. запрос клиента окончен –
//можно слать ответ
if (c == '\n' && current_line_is_blank) {
            //температура включения завесы
            if(readString.contains("Start=0")) {
              EEPROM.write(1, 0);
            } else 
            if(readString.contains("Start=1")) {
              EEPROM.write(1, 1);
            } else
            if(readString.contains("Start=2")) {
              EEPROM.write(1, 2);
            } else           
            if(readString.contains("Start=3")) {
              EEPROM.write(1, 3);
            } else
            if(readString.contains("Start=4")) {
              EEPROM.write(1, 4);
            }
            if(readString.contains("Start=5")) {
              EEPROM.write(1, 5);
            }
           
            //температура выключения завесы
            if(readString.contains("Stop=6")) {
              EEPROM.write(2, 6);
            } else         
            if(readString.contains("Stop=7")) {
              EEPROM.write(2, 7);
            } else
            if(readString.contains("Stop=8")) {
              EEPROM.write(2, 8);
            } else           
            if(readString.contains("Stop=9")) {
              EEPROM.write(2, 9);
            } else
            if(readString.contains("Stop=10")) {
              EEPROM.write(2, 10);
            } else         
            if(readString.contains("Stop=11")) {
              EEPROM.write(2, 11);
            } else
            if(readString.contains("Stop=12")) {
              EEPROM.write(2, 12);
            } else           
            if(readString.contains("Stop=13")) {
              EEPROM.write(2, 13);
            } else
            if(readString.contains("Stop=14")) {
              EEPROM.write(2, 14);
            } else
            if(readString.contains("Stop=15")) {
              EEPROM.write(2, 15);
            } else
            if(readString.contains("Stop=16")) {
              EEPROM.write(2, 16);
            } else
            if(readString.contains("Stop=17")) {
              EEPROM.write(2, 17);
            } else
            if(readString.contains("Stop=18")) {
              EEPROM.write(2, 18);
            } else
            if(readString.contains("Stop=19")) {
              EEPROM.write(2, 19);
            } else
            if(readString.contains("Stop=20")) {
              EEPROM.write(2, 20);
            }
//шлем стандартный HTTP заголовок
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println();
//он тоже заканчивается пустой строкой!
int temp1 = (f - (int)f) * 100;
int temp_start = EEPROM.read(1);
int temp_stop = EEPROM.read(2);
client.print("Т в экране ");
client.print((int)f);
//client.print(",");
//client.print((int)temp1);
client.println("<br>");
client.println("Т запуска завесы-");
client.print((int)temp_start);
client.println("<br>");
client.println("Т остановки завесы-");
client.print((int)temp_stop);
client.println("<br>");
//
//client.println("<br>");
//HTML тэг <br> - перевод строки
//Вывод состояния тепловой завесы
if (status == 1) {
  client.print("Завеса ВЫКЛЮЧЕННА");
}
if (status == 2) {
  client.print("Завеса ВКЛЮЧЕННА");
}
client.println("<br>");
client.println("<form method=get><input type=text name=Start>Start<br><input type=text name=Stop>Stop<br><input type=submit value=Применить></form>");
break;
//работа окончена – можно выходить из цикла while
}
if (c == '\n') { //если получен перевод строки, значит началась новая
//строка. Выставим флаг current_line_is_blank = true
current_line_is_blank = true;
} else if (c != '\r') { //если получен любой другой символ, отличный
//от возврата каретки ('\r'), значит получаемая строка непустая
current_line_is_blank = false;
}
}
}
//небольшая пауза, чтобы данные успели уйти
delay(1);
//разрываем соединение с клиентом
readString="";
client.stop();
}
}

Теперь суть проблемы. Всё прекрассно работает ровно до тех пор пока например температура не принила низкое значение и должен врубится светодиод. Он включается, но спустя некоторое время девай вести себя начинает чудно. Температуру перестаёю получать. То есть показывает 0.00 градуса и всё. Как только температура принимает значение при котором светодиод должен отрубится то девайс начинает работать нормально. То есть я так думаю сума сходить начинает эта весчь тогда когда outputPin, HIGH. Я вот только не пойму почему. И ещё почему то очень сильно греется микросхема W5100/ Корчое прошу вашей помощи потому как сам я уже не знаю что ещё можно сделать

5

(25 ответов, оставленных в Технические вопросы)

Сергей Деменков пишет:

Господа, все уже давно придумано за нас :)

Вопрос pinicilin2006: после подключения питания сделайте сброс кнопкой Reset - я на 99,9% уверен, что все заработает.

Пояснение в оригинале на офф. сайте: http://www.arduino.cc/cgi-bin/yabb2/YaB … 25354009/2

Если кратко и по сути, то хитрость такая: чипу W5100 требуется длинный импульс сброса после подачи питания. Если втыкать в USB, то пока драйвера FTDI вместе с виндой чего-то там фурычат, они умудряются плату раза 3 сбросить, и эффект не проявляется.
Если же запитаться от внешнего БП (или снять джампер сброса), то чип W5100 не успевает сброситься.
Решение проще простого - воткнуть конденсатор на 1мкФ (вроде у кого-то и меньше помогло) между выводом Reset и Gnd. Можно электролит - минусом на Gnd, плюсом на Reset.
Запаивать его нельзя, т.к. при таком конденсаторе увеличивается время сброса и платы Arduino, и заливка прошивок перестает работать.

...второй раз на форуме об этом пишу, неплохо было бы ребятам из freeduino.ru в свою документацию это вписать. Накатаю им письмецо в e-mail.

Вот за это большое спасибо!!! А в документацию это и вправду стоит включить. ещё раз огромное спасибо.

6

(25 ответов, оставленных в Технические вопросы)

Возникло предположение что виной всему именно то что девайс автоматически определяет запитан он от usb или от внешнего блока. Может именно поэтому при подаче питания он зависает до последующего сброса. Короче подстава какая то.

7

(25 ответов, оставленных в Технические вопросы)

Да дело в том что я их уже штук пять всяких разных перепробовал. Пробовал 12в 1.5А. С ним при подаче питания девайc подвисает ровно до тех пор пока не нажму на девайсе сброс и после этого начинает работать. ну а это в моём случае не вариант. Так же пробовал и и с другими характеристиками блоки.

Здравствуйте. Возникла следующая проблема. При помощи комплекта arduino и  ethernet собрал девайс. При питание от usb порта девай запускается без проблем и сразу начинает отрабатывать положенную программу. При подключение же внешнего блока питания происходит следующая непонятная хрень. То он запускается нормаль(один раз из десяти) либо он подвисает и не начинает работать пока не нажмёшь на кнопку сброса на девайсе. Блок питания взял на 500ma. Волтаж менял от 6 до 12. результат одинаковый. Пожалуйста подскажите что делаю не так а то уже мозги на бекрень лезут