Скрыть объявление
На нашем форуме недоступен просмотр изображений для неавторизованных пользователей. Если Вы уже зарегистрированы на нашем форуме, то можете войти. Если у Вас еще нет аккаунта, мы будем рады, если Вы к нам присоединитесь. Зарегистрироваться Вы можете здесь.

Запрос примеров для Sming

Тема в разделе "Sming Open Source Framework", создана пользователем JustACat, 23 мар 2015.

  1. JustACat

    JustACat Moderator Команда форума

    Сообщения:
    568
    Симпатии:
    121
    Предлагаю в данную тему помещать ваши запросы примеров, которые бы вы хотели видеть в Sming.
    Вопросы по использованию каких-либо функций, библиотек и т.п. - тоже в эту тему.

    Старайтесь, пожалуйста, сформулировать ваш запрос как можно четче:
    - название (как вы это видите, если это законченный пример)
    - что конкретно в нем должно демонстрироваться (работа с какими аспектами)
    Для вопросов по функциям - просто опишите, что конкретно вам непонятно (подробно и с примерами).

    Не забывайте, пример - это не полноценная прошивка.
    Если вам необходимо решение какой-либо вашей личной частной задачи (тем более, если вы собираетесь использовать это решение в коммерческих целях), не стоит запрашивать это решение в качестве примера к Sming. Обратитесь в отдельной теме с описанием вашей задачи, напишите ТЗ, предложите (по возможности) вознаграждение.
    Пожалуйста, цените чужое время не меньше своего. Спасибо!

    Внимание: оффтоп будет удаляться, пожалуйста, придерживайтесь темы! Спасибо!
     
    Последнее редактирование: 12 апр 2015
  2. Климатехник

    Климатехник Читатель

    Сообщения:
    126
    Симпатии:
    11
    Пожскажите пожалуйста,каким образом установить статический IP в режиме wifi.station?В режиме AP понятно,в примерах есть.Думаю как то так:
    Код (C):
    1. ip_addr ip;
    2. ip_addr netmask;
    3. ip_addr gw;
    4. IP4_ADDR(&ip, 192, 168, 1, 100,&netmask,255.255.255.0&gw,192.168.1.1);
    5. WifiStation.setIP(ip,netmask,gw);
    Поправьте пожалуйста
     
  3. JustACat

    JustACat Moderator Команда форума

    Сообщения:
    568
    Симпатии:
    121
    Климатехник, вообще должно быть так же, как и для режима AP:
    Код (C):
    1.     ip_addr ip;
    2.     IP4_ADDR(&ip, 192, 168, 2, 1);
    3.     WifiAccessPoint.setIP(ip);
    То есть получается так:
    Код (C):
    1.     ip_addr ip;
    2.     IP4_ADDR(&ip, 192, 168, 2, 1);
    3.     WifiStation.setIP(ip);
    Но вот если мы посмотрим в текущую реализацию Station в Sming, то увидим вот тут:
    https://github.com/anakod/Sming/blob/master/Sming/SmingCore/Platform/Station.h
    Что в классе StationClass метод setIP закомменчен. То есть он не реализован.
    То есть я делаю вывод, что на данный момент для режима Station в Sming поддерживается только получение IP адреса от роутера по DHCP.

    А вот для режима AP он вполне себе реализован:
    https://github.com/anakod/Sming/blob/master/Sming/SmingCore/Platform/AccessPoint.h
    И тут вот реализация:
    https://github.com/anakod/Sming/blob/master/Sming/SmingCore/Platform/AccessPoint.cpp

    Если интересно, то IP4_ADDR - это всего лишь макрос, который объявлен вот тут:
    https://github.com/anakod/Sming/blob/master/Sming/system/include/lwip/ip_addr.h
    На 139 строке. Это к вопросу о том, как понять, какие и как можно использовать у какого-то макроса и/или функции параметры. Ищете просто изначальное объявление искомого объекта в исходниках, и смотрите, что там может быть.
    В данном случае имеем: IP4_ADDR(ipaddr, a,b,c,d)
    То есть 5 параметров, и ничего более.

    Хотя метод тыка (как у вас) - тоже часто сам использую, и иногда получается :)

    @anakod, вы не поможете нам разобраться, пожалуйста, почему нет установки IP в режиме Station? Все же функционал иногда полезный...
     
    Последнее редактирование: 12 апр 2015
  4. FGX

    FGX Читатель

    Сообщения:
    100
    Симпатии:
    9
    Добрый день. Смотрел примеры, не нашел примера получения данных по УАРТ, конечно может плохо искал но в основном они используется для вывода надписей для отладки. Второй вопрос как отправить данные через TCP на народмон (Формат пакета данных:
    [HASHTAG]#MAC[/HASHTAG][[HASHTAG]#NAME[/HASHTAG]][[HASHTAG]#LAT[/HASHTAG]][[HASHTAG]#LNG[/HASHTAG]][[HASHTAG]#ELE[/HASHTAG]]\n
    #mac1#value1[[HASHTAG]#time1[/HASHTAG]][[HASHTAG]#name1[/HASHTAG]]\n
    ##)
    Т.е. как подключиться к нему, в примере клиента есть отправка данных через какой-то HTTP запрос- thingSpeak.downloadString("http://api.thingspeak.com/update?key=7XXUJWCWYTMXKN3L&field1=" + String(sensorValue), onDataSent); но это не то.
    В общем задача получить данные через УАРТ, найти в них нужные значения и отправить чрез TCP порт на народ мод сформировав нужную строку. Вот сижу туплю, примеров много, а как сделать понять не могу.

    И третий вопрос, в примерах использования прерываний нет. Он вообще поддерживает прерывания на ножках или еще какие-то, которыми можно пользоваться из программы пользователя? По сравнению с обычными МК модуль работает не прозрачно. Вот когда идет наша программа он же может ее бросать и уходить в прерывания делать свои дела? Я не пойму как он все успевает и по вайфаю общаться и программу выполнять, он же не многоядерный, если мы напишем типа while(1){} в инициализации на этом работа модуля и станет, правильно? В тоже время void init() выполняется один раз, а где наша функция main? В примерах как то функция к функции блуждает или через таймер или через функции вайфая вызываются наши, а вот так чтобы while(1){и что-то делаем по кругу нельзя? Например,
    digitalWrite(LED_PIN, state); //кстати с какой частотой он способен шурудить своими выводами?
    state = !state;
    }
    Как ШИМом управлять, примеров АЦП нет.
    А как вы вообще проверяете как работает программа, каждый раз шьете? В эклипс отладка не работает, отладчика нет. Довольно хардкорно получается написание программа под него, т.е. по сравнению с авр студио или микрочип (ну любой обычной среды разработки со всеми плюшками и отладчиками, + в протеусе его нет, все в слепую через отладку по уарту).
     
  5. JustACat

    JustACat Moderator Команда форума

    Сообщения:
    568
    Симпатии:
    121
    Так ничем же не отличается от Arduino. Откройте любой пример с их сайта (или скачайте саму ардуино и прямо в ней откройте, там примеров очень много).
    Например: http://www.arduino.cc/en/Tutorial/SerialCallResponse - там после подключения есть код:
    код (раскрыть)
    Код (C):
    1. void loop()
    2. {
    3.   // if we get a valid byte, read analog ins:
    4.   if (Serial.available() > 0) {
    5.     // get incoming byte:
    6.     inByte = Serial.read();
    7.     // read first analog input, divide by 4 to make the range 0-255:
    8.     firstSensor = analogRead(A0)/4;
    9.     // delay 10ms to let the ADC recover:
    10.     delay(10);
    11.     // read second analog input, divide by 4 to make the range 0-255:
    12.     secondSensor = analogRead(1)/4;
    13.     // read  switch, map it to 0 or 255L
    14.     thirdSensor = map(digitalRead(2), 0, 1, 0, 255);
    15.     // send sensor values:
    16.     Serial.write(firstSensor);
    17.     Serial.write(secondSensor);
    18.     Serial.write(thirdSensor);            
    19.   }
    20. }


    Примера с TcpClient пока действительно нет. Ну тут у вас два варианта:
    - ждать, пока кто-нибудь его напишет
    - поразбираться самостоятельно - плясать можно от примера HttpClient - если пройти по объявлению этого класса, то увидите, что он как раз наследуется от TcpClient. А он у нас лежит уже вот тут:
    https://github.com/anakod/Sming/blob/master/Sming/SmingCore/Network/TcpClient.h
    И там уже вполне можно оценить, какие у него есть методы, и по их названиям определить их функции, ну или копать дальше - в их реализацию, а там и комментарии есть небольшие. В общем, не скажу, что просто, но разобраться можно.

    Вот и решайте свою задачу, а как решите - поделитесь с сообществом (если конечно не жалко), и тогда следующий решающий будет вам благодарен.
    Пока что именно вот такую задачу никто не решил (ну или просто не сообщил об этом, что вероятнее). Увы.

    Да.

    А чем вам init() вместо main не угодил? Только тем, что буквы в названии другие?
    Или вы может имеете ввиду нечто подобное loop в ардуино реализации?
    Так зачем оно тут?
    Пример Basic_Blink вроде наглядно показывает: init выполняется после старта (типа setup в ардуино), и в нем вы можете определить какой-то код, который будет дальше выполняться.
    В Basic_Blink запускается таймер, на который назначается функция. Вот вам и ваш loop, который при этом, в отличие от while(1){} не блокирует МК намертво и дает ему выполнять остальные задачи (тот же WiFi обрабатывать).
    Напишите вместо void blink(){} свою основную функцию, поставьте время в таймере не 1000 ms а меньше (сколько вам надо) и вперед.

    Ищите на форуме - уже было.

    Ой, да много чего в примерах нет. Да и в коде не все реализовано, что хотелось бы. Ну вот так. Автор - тоже человек. И он тоже не все успевает. У вас есть свободное время? Помогайте!

    Именно так. Либо в голове продумываем. Вот как раз по этому поводу, посмотрите (и пару сообщение до и после). Как говорится - что имеем...

    Прямо подмывает картинку вставить: This is SPARTAAAAA!!!!!! =)))
    Вы прямо сравнили, блин, Espressif с Микрочипом и Атмелом :)
    Но, многие считают, что и отладка по UART (либо WiFi) - это уже не мало, могло ведь и этого не быть :-Р

    PS: кстати, по отладке программ (то есть реальной, через jtag) тут на форуме тоже было. Правда не помню - чем кончилось, но вроде что-то выходило. Мне лень было с этим заморачиваться, мне хватает и UART-отладки (хотя даже jtag где-то валяется).
     
    Последнее редактирование: 12 апр 2015
  6. anakod

    anakod Moderator Команда форума

    Сообщения:
    314
    Симпатии:
    100
    Пока не реализовывал, т.к. DHCP обычно прекрасно решает проблему и более гибок. Но раз просите - добавлю.

    Полностью аналогично Ардуино.

    Если верить документации http://narodmon.ru/#!proto то можно отправлять данные в виде GET запроса, тогда будет полностью аналогично примеру Thingspeak который Вы уже смотрели.

    Да, пользовательские прерывания должны устанавливаться и работать аналогично классическому Ардуино (но не AVR).

    Аналогично Ардуино, analogWrite

    Все абсолютно прозрачно. Вы пишите пользовательский код который вызывается по таймеру или при поступлении новых данных (если задаете callback), все остальное время микроконтроллер обслуживает WiFi, TCP стек и множество других вещей.
     
    Последнее редактирование модератором: 12 апр 2015
  7. Климатехник

    Климатехник Читатель

    Сообщения:
    126
    Симпатии:
    11
    Кто то может объяснить по подробнее,как это работает?
     
  8. JustACat

    JustACat Moderator Команда форума

    Сообщения:
    568
    Симпатии:
    121
    Надо-надо. У DHCP есть пара минусов:
    - его может не быть =) ну, отключен, либо еще какие-то причины
    - с ним получение IP (то есть по сути выход на рабочий режим) занимает больше времени, и для тестов иногда проще выставить статический IP, а уж потом перейти на DHCP после отладки
    Можно, но они очень не рекомендуют. Хотя да, можно и так :)

    Но я таки собрался и накидал пробный проект для отсылки по TCP (все оказалось на самом деле довольно просто, если делать, как я написал - пойти внутрь исходников, и глянуть, что там и как).
    Так что, @FGX, вот, ловите код:
    Код (раскрыть)
    Код (C):
    1. #include <user_config.h>
    2. #include <SmingCore/SmingCore.h>
    3.  
    4. #define MY_SSID "WIFISSID"
    5. #define MY_SSID_PWD "WIFIPASSWORD"
    6. #define NARODM_HOST "narodmon.ru"
    7. #define NARODM_PORT 8283
    8.  
    9. String mac;
    10. Timer procTimer;
    11. float t1 = -2.5; // just for test
    12.  
    13. void nmOnCompleted(TcpClient& client, bool successful){
    14.     // debug msg
    15.     debugf("nmOnCompleted");
    16.     debugf("successful: %d", successful);
    17. }
    18.  
    19. void nmOnReadyToSend(TcpClient& client, TcpConnectionEvent sourceEvent){
    20.     // debug msg
    21.     debugf("nmOnReadyToSend");
    22.     debugf("sourceEvent: %d", sourceEvent);
    23.  
    24.     if(sourceEvent == eTCE_Connected){
    25.         /* send sensors (3 pieces) data
    26.          * T1 = t1 (temperature)
    27.          * H1 = 8 (humidity)
    28.          * P1 = 712.15 (pressure)
    29.          *
    30.          * after sending we close connection: last parameter = true
    31.          */
    32.         client.sendString("#"+mac+"\n#T1#"+t1+"\n#H1#8\n#P1#712.15\n##", true);
    33.     }
    34. }
    35.  
    36. bool nmOnReceive(TcpClient& client, pbuf *buf){
    37.     // debug msg
    38.     debugf("nmOnReceive");
    39.     debugf("%s", buf);
    40. }
    41.  
    42. TcpClient narodMon(nmOnCompleted, nmOnReadyToSend, nmOnReceive);
    43.  
    44. void sendData(){
    45.     // reading sensors data
    46.     t1 = t1 + 1.39; // just for test
    47.  
    48.     // connect to narodmon server
    49.     narodMon.connect(NARODM_HOST, NARODM_PORT);
    50. }
    51.  
    52. // Will be called when WiFi station was connected to AP
    53. void connectOk()
    54. {
    55.     // debug msg
    56.     debugf("I'm CONNECTED to WiFi");
    57.  
    58.     // Construct mac
    59.     mac = WifiStation.getMAC();
    60.     mac.toUpperCase();
    61.     mac = mac.substring(0,2)+"-"+mac.substring(2,4)+"-"+mac.substring(4,6)+"-"+
    62.             mac.substring(6,8)+"-"+mac.substring(8,10)+"-"+mac.substring(10,12);
    63.     debugf("mac: %s", mac.c_str());
    64.  
    65.     // narodMon send data "loop"
    66.     procTimer.initializeMs(6 * 60 * 1000, sendData).start(); // every 6 minutes
    67.     // force send first time so not to wait 6 mins after start
    68.     sendData();
    69. }
    70.  
    71. // Will be called when WiFi station timeout was reached
    72. void connectFail()
    73. {
    74.     debugf("I'm NOT CONNECTED!");
    75.     WifiStation.waitConnection(connectOk, 10, connectFail); // Repeat and check again
    76. }
    77.  
    78. // Will be called when WiFi hardware and software initialization was finished
    79. void ready()
    80. {
    81.     debugf("READY!");
    82. }
    83.  
    84. void init()
    85. {
    86.     Serial.begin(115200);
    87.     Serial.systemDebugOutput(true); // Allow debug print to serial
    88.     Serial.println("Hello friendly world! :)");
    89.  
    90.     // Set system ready callback method
    91.     System.onReady(ready);
    92.  
    93.     // Soft access point
    94.     WifiAccessPoint.enable(false);
    95.  
    96.     // Station - WiFi client
    97.     WifiStation.config(MY_SSID, MY_SSID_PWD); // Put you SSID and Password here
    98.     WifiStation.enable(true);
    99.  
    100.     // Run our method when station was connected to AP (or not connected)
    101.     WifiStation.waitConnection(connectOk, 30, connectFail); // We recommend 20+ seconds at start
    102. }

    Этим кодом нужно заменить полностью то, что лежит в файле: C:\Sming\Basic_WiFi\app\application.cpp (ну или где он у вас лежит там).
    Писалось на коленке и очень грязно (я нуб реально, особенно если доходит до всяких хитростей, типа работы со строками).
    На самом деле собрать mac адрес в виде XX-XX-XX-XX-XX-XX из xxxxxxxxxxxx, который возвращает WifiStation.getMAC(); - для меня заняло времени больше, чем понимание, как работать с TcpClient =)
    Я безнадежно испорчен удобствами PHP...
    Да, вот так - высокий уровень, ООП, все дела - это легко, а низкий - это я плаваю :) А если бы пришлось собирать по байтам, как в АВР (для экономии, без String), то вообще заколебался бы, наверное... Хотя... Ну не суть.

    В общем, у меня этот код отрабатывает (не забудьте сменить логин и пароль к вашему WiFi).

    Если интересно, то вот лог работы из Terminal:
    Лог (раскрыть)
    add 0
    aid 2
    pm open phy_2,type:2 0 0
    cnt

    connected with XXXXXX, channel 1
    dhcp client start...
    ip:192.168.168.12,mask:255.255.255.0,gw:192.168.168.1
    I'm CONNECTED to WiFi

    mac: 18-FE-34-XX-XX-XX

    connect to: narodmon.ru

    DNS record found: narodmon.ru = 94.19.113.221

    TcpConnection::connect result:, 0

    OnConnected

    TCP connected

    onReadyToSendData: 0

    nmOnReadyToSend

    sourceEvent: 0

    TCP connection send: 48 (48)

    TcpClient request completed

    TCP sent: 48

    onReadyToSendData: 2

    nmOnReadyToSend

    sourceEvent: 2

    nmOnCompleted

    successful: 1

    TCP connection closing

    -TCP connection

    +TCP connection

    connect to: narodmon.ru

    TcpConnection::connect result:, 0

    OnConnected

    TCP connected

    onReadyToSendData: 0

    nmOnReadyToSend

    sourceEvent: 0

    TCP connection send: 47 (47)

    TcpClient request completed

    onReadyToSendData: 3

    nmOnReadyToSend

    sourceEvent: 3

    TCP sent: 47

    onReadyToSendData: 2

    nmOnReadyToSend

    sourceEvent: 2

    nmOnCompleted

    successful: 1

    TCP connection closing

    -TCP connection

    +TCP connection

    connect to: narodmon.ru

    TcpConnection::connect result:, 0

    OnConnected

    TCP connected

    onReadyToSendData: 0

    nmOnReadyToSend

    sourceEvent: 0

    TCP connection send: 47 (47)

    TcpClient request completed

    onReadyToSendData: 3

    nmOnReadyToSend

    sourceEvent: 3

    TCP sent: 47

    onReadyToSendData: 2

    nmOnReadyToSend

    sourceEvent: 2

    nmOnCompleted

    successful: 1

    TCP connection closing

    -TCP connection

    Тут у нас 3 последовательные отправки раз в 6 минут.
    Ну и то, что в итоге прилетело на narodmon:
    2015-04-12_103449.png

    PS: если кто-нибудь это решит в виде примера оформить (типа HttpClient_ThingSpeak, назвать можно TcpClient_NarodMon), а @anakod включит в сборку - то будет вообще здорово :)
     
    Последнее редактирование: 12 апр 2015
    aloika нравится это.
  9. JustACat

    JustACat Moderator Команда форума

    Сообщения:
    568
    Симпатии:
    121
    Климатехник, а что конкретно вас интересует? Что такое вообще DHCP (ссылка на вики) и принцип его работы? Тогда тут это оффтоп.
    Или как его использовать в Sming? Так никак. Он просто работает и все, можно радоваться :)
    Мы сейчас говорим о том, что его пока отключить нельзя для режима Station. Но @anakod пообещал это добавить. Как добавит - так и узнаем.
    Думаю, можно прямо по setIP это зацепить. Если вызывает человек setIP - то отключаем DHCP. Хотя тогда еще функцию типа enableDHCP добавить надо, чтобы можно было обратно на DHCP вернуться. Но тут @anakod'у виднее.
     
  10. Климатехник

    Климатехник Читатель

    Сообщения:
    126
    Симпатии:
    11
    Да,именно это хотел спросить.И прошу прощение за оффтоп.Просто не знаю уже,в какой теме спросить:)

    Update:
    Прошу прощение,вопрос закрыт.Все стало ясно

    Update2:
    Я думаю что надо добавить пример,хотябы с одной html страницой,с которой можно было бы сделать предварительные настройки ssid,пароль и с настройками IP.Я как раз пытаюсь это сделать сейчас,вроде бы задачка не сложная.То есть,как обычно заходим по ip 192.168.4.1 и уже настраиваем подключение.На примере MeteoControl хорошо все показано,но новичкам там будет трудно разобраться.Вот и было бы не плохо простой пример для настроек.Пока тормоза у меня со статическим IP.
     
    Последнее редактирование модератором: 12 апр 2015
    JustACat нравится это.
  11. JustACat

    JustACat Moderator Команда форума

    Сообщения:
    568
    Симпатии:
    121
    Климатехник, а HttpServer_Bootstrap не подходит? Там вроде просто все, и самое основное все показано. Я конечно понимаю, что нет предела совершенству, но, имхо, 120 строчек кода можно разобрать :)
    Редактируем и загружаем свою страничку вместо той, что грузится с сайта @anakod'а - в нее втыкаем форму с SSID и паролем, например... А по приему этой формы проставляем параметры (там есть обработка приема 1 параметра - включения/выключения светика).
    Но я ни в коем разе не против - больше примеров хороших разных - только за!
     
  12. Климатехник

    Климатехник Читатель

    Сообщения:
    126
    Симпатии:
    11
    JustACat, нет,вы не думайте,что я прошу кого то написать пример,я просто сделал предложение.Как только пример будет готовый,выложу его сюда.HttpServer_Bootstrap пример испробовал,кстати файлы загружал через локальный сервер с помощью Denwer,очень удобно.
     
    JustACat нравится это.
  13. FGX

    FGX Читатель

    Сообщения:
    100
    Симпатии:
    9
    Спасибо, с Ардуино просто не знаком, знаком с обычным С и чистыми МК (АВР в том числе) без надстройки из-за которой не ясно, что там и как работает на самом деле. Поэтому и спросил, я привык, что в мк срабатывает прерывание при приеме данных по УАРТУ и все, а в ардуино я так понял сами сидим и опрашивает УАРТ не пришло ли там чего, а потом считываем, что пришло... В принципе не критично, жить можно. Просто часто идут ссылки на ардуино, что не совсем понятно, программа то на С и под эклипсом, причем тут ардуино, хотя я так понял тут использованы готовые портированные библиотеки от ардуино потому что их много готовых..
     
  14. FGX

    FGX Читатель

    Сообщения:
    100
    Симпатии:
    9
    Спасибо!
     
  15. anakod

    anakod Moderator Команда форума

    Сообщения:
    314
    Симпатии:
    100
    JustACat, это реально круто! Не хотите ли сделать pull-request с новым примером в основной репозиторий на гитхабе?

    Чем больше примеров тем проще будет новичкам!
     
    Последнее редактирование: 13 апр 2015
  16. Климатехник

    Климатехник Читатель

    Сообщения:
    126
    Симпатии:
    11
    Что то не нашел,или плохо искал функцию restatrt модуля.Надо бы еще подумать,чтобы загружать web файлы,сконвертируемые на bin файлы,по определенному адресу,конвертером который предложил pvvx.Не понятно еще,как происходит сканирование точек доступа
     
    Последнее редактирование: 13 апр 2015
  17. anakod

    anakod Moderator Команда форума

    Сообщения:
    314
    Симпатии:
    100
  18. anakod

    anakod Moderator Команда форума

    Сообщения:
    314
    Симпатии:
    100
    Это невозможно, тут другой формат и файловая система здесь перезаписываемая (read-write). Можно пробовать spiffy из LUA мира, она должна подойти, но пока вроде никто еще не тестировал.

    А в чем вопрос? Примеры по работе с сетями есть в семле Basic_WiFi
     
  19. JustACat

    JustACat Moderator Команда форума

    Сообщения:
    568
    Симпатии:
    121
    Ой да ладно вам :) Перехвалите. По поводу подгрузки на гитхаб - я б сделал, если б им пользовался. А так надо еще сначала с этим разобраться, ибо покамест с гитхаба я все только качал и то обычно одним архивом :) (это не к вам вопрос и вообще не вопрос, понятно, что это не должно быть сложно, нужно просто время на это найти, если, пока я собираюсь, никто не сделает, то закину конечно)
     
  20. FGX

    FGX Читатель

    Сообщения:
    100
    Симпатии:
    9
    Добрый день. Появилось время проверил и доработал пример JustACat под свое устройство, теперь принимает по ком порту строку с двумя температурами, вынимает из нее непосредственно значения и отправляет на народмон, вроде работает 1 день. Вдруг у кого-то тоже есть погодная станция, которая выдает значение температуры через ком порт и его можно без переделки подружить с интернетом, посылка должна содержать "="и далее значение и значек градуса, второе "=" и второе значение, если значений больше, то не сложно модифицировать код до нужного. Может кто и более красивый парсинг нарисует, но этот рабочий.
    Код (раскрыть)

    Код (C):
    1. #include <user_config.h>
    2. #include <SmingCore/SmingCore.h>
    3. #define MY_SSID "SSID"
    4. #define MY_SSID_PWD "PASWORD"
    5. #define NARODM_HOST "narodmon.ru"
    6. #define NARODM_PORT 8283
    7. char buf[100], T1[5], T2[5];
    8. String mac ;
    9. Timer procTimer, myTimer;
    10.  
    11. void nmOnCompleted(TcpClient& client, bool successful){
    12.     debugf("nmOnCompleted");
    13.     debugf("successful: %d", successful);
    14. }
    15. void nmOnReadyToSend(TcpClient& client, TcpConnectionEvent sourceEvent){
    16.     debugf("nmOnReadyToSend");
    17.     debugf("sourceEvent: %d", sourceEvent);
    18.     if(sourceEvent == eTCE_Connected){
    19.         client.sendString("#"+mac+"#Name#41.251418#34.687841\n#T1#"+T1+"#Home\n#T2#"+T2+"#Street\n##\n", true);
    20.     }
    21. }
    22. bool nmOnReceive(TcpClient& client, pbuf *buf){
    23.     debugf("nmOnReceive");
    24.     debugf("%s", buf);
    25. }
    26. TcpClient narodMon(nmOnCompleted, nmOnReadyToSend, nmOnReceive);
    27. void sendData(){
    28.     narodMon.connect(NARODM_HOST, NARODM_PORT);
    29. }
    30.  
    31. void Serial_reseiv_Data(){
    32.     int i=0, i2, i3, temp;
    33.     char  temp_buf[10];
    34.  
    35.       if (Serial.available()){
    36.          while( Serial.available() && (i< 99)) {
    37.             buf[i++] = Serial.read();
    38.          }
    39.          buf[i++]='\0';
    40. //дергаем из строки значения температуры
    41.       i2=0;
    42.       i3=0;
    43.       temp=0;
    44.       while (i3<i) {
    45.           if (buf[i3]=='=') {
    46.                            temp=temp+1;
    47.                             while (((i3+i2)<=i) && (i2<5)) {         i2=i2+1;
    48.                                                                      if (buf[i3+i2]!='°')  temp_buf[i2-1]= buf[i3+i2];
    49.                                                                      else  temp_buf[i2-1]='\0';
    50.  
    51.                                                              }
    52.                 i2=0;
    53.                 if (temp==1)  {
    54.                                for (char j=0; j<4; j++) {if (temp_buf[j]!='\0')  T1[j]=temp_buf[j]; else T1[j]='0';}
    55.                               }
    56.                 if (temp==2)  {
    57.                                for (char j=0; j<4; j++) {if (temp_buf[j]!='\0')  T2[j]=temp_buf[j]; else T2[j]='0';}
    58.                               }
    59.                           }
    60.                  i3=i3+1;
    61.                              }
    62.     }
    63. }
    64.  
    65. // Will be called when WiFi station was connected to AP
    66. void connectOk()
    67. {
    68.     debugf("I'm CONNECTED to WiFi");
    69.     // Construct mac
    70.     mac = WifiStation.getMAC();
    71.     mac.toUpperCase();
    72.     mac = mac.substring(0,2)+"-"+mac.substring(2,4)+"-"+mac.substring(4,6)+"-"+
    73.             mac.substring(6,8)+"-"+mac.substring(8,10)+"-"+mac.substring(10,12);
    74.     debugf("mac: %s", mac.c_str());
    75.     // narodMon send data "loop"
    76.     procTimer.initializeMs(60 * 5* 1000, sendData).start(); // every 5 minutes
    77.     myTimer.initializeMs(30 *  1000, Serial_reseiv_Data).start(); // every 30 sec
    78.     // force send first time so not to wait 5 mins after start
    79.     sendData();
    80. }
    81. // Will be called when WiFi station timeout was reached
    82. void connectFail()
    83. {
    84.     debugf("I'm NOT CONNECTED!");
    85.     WifiStation.waitConnection(connectOk, 10, connectFail); // Repeat and check again
    86. }
    87. // Will be called when WiFi hardware and software initialization was finished
    88. void ready()
    89. {
    90.     debugf("READY!");
    91. }
    92. void init()
    93. {
    94.     Serial.begin(500000);
    95.     Serial.systemDebugOutput(true); // Allow debug print to serial
    96.     // Serial.println("0\n\r");
    97.     // Set system ready callback method
    98.     System.onReady(ready);
    99.     // Soft access point
    100.     WifiAccessPoint.enable(false);
    101.     // Station - WiFi client
    102.     WifiStation.config(MY_SSID, MY_SSID_PWD); // Put you SSID and Password here
    103.     WifiStation.enable(true);
    104.     // Run our method when station was connected to AP (or not connected)
    105.     WifiStation.waitConnection(connectOk, 30, connectFail); // We recommend 20+ seconds at start
    106. }
    107.  
     
    Последнее редактирование модератором: 20 апр 2015
    JustACat и Климатехник нравится это.

Поделиться этой страницей