Текущее значение курса доллара

Gagarin
Offline
Зарегистрирован: 25.12.2014

Друзья!

Я начинающий (3 дня всего) ардуиновод, по этой причине не пинайте и не смейтесь. )

Есть потребность выводить на семисегментный восьмизначный дисплей (MAX7219) текущий (мгновенный) курс доллара.

В MS Access это делаю так:

Public Function kurs()
    Dim URL As String
    URL = "http://www.finanz.ru/valuti/diagramma-realnom-vremeni/USD-RUB"
    Dim oHttp As Object
    On Error Resume Next
    Set oHttp = CreateObject("MSXML2.XMLHTTP")
    If Err.Number <> 0 Then
        Set oHttp = CreateObject("MSXML.XMLHTTPRequest")
    End If
    On Error GoTo 0
    If oHttp Is Nothing Then
        MsgBox "Не удалось инициализировать объект MSXML!"
        Exit Function
    End If
    oHttp.Open "GET", URL, False
    oHttp.Send
    sss = oHttp.ResponseText
    Set oHttp = Nothing
    sss1 = Mid(sss, InStr(1, sss, "USD/RUB - в реальном времени"), 500)
    s1 = "lsformat=" & Chr(34) & "| |,|4|0|" & Chr(34) & ">"
    sss2 = Mid(sss1, InStr(1, sss1, s1) + Len(s1))
    kurs = Mid(sss2, 1, InStr(1, sss2, "</div>") - 1)
    Debug.Print kurs
End Function

 

Помогите переработать код функции в скетч.

Актуально же для большинства.

В интернет контроллер будет ходить через ESP8266.

 

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

"Слона нужно есть по частям" говорил один из преподов в универе...

для начала изобретем логику парсера:

работать будем со строкой String str;  - обьявить надо глобально и когда надо очистить сами разберемся.

разбиение строк надо делать по символам "<" - самый простой парсинг - нам не нужно дерево обьектов

тоесть получаем символ char sym = client.read(); и очищаем буфер if(sym == '<'){str="";}else{str=str+sym;}. В итоге в какой то момент в буфере окажется строка:

div field="bid" item="X0000020200839420" source="lightstreamer" table="1" class="price" lsformat="| |,|4|0|">53,4995

Определить ее можно if(str.indexOf("class=\"price\"") != -1){}, потом найти позицию символа ">" этойже функции и вытащить число 53,4995 - String num = str.substring(str.indexOf('>')); потом надо преобразовать его в double функцией strtod(). Возможно придется сначала заменить "," на "."

разбираться с дисплеем надо на следущем этапе, после того как курс 53,4995 регулярно получается программой через вайфай модуль(выводить можно пока в порт), потому что примеров работы с дисплеем навалом, а парсить хтмл сложнее.

Gagarin
Offline
Зарегистрирован: 25.12.2014

Как из хтмлки достать необходимое значение (курса доллара) более менее понятно.

Мне не понятно как вообще html получить.

 

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

Gagarin пишет:

Мне не понятно как вообще html получить.

http client get string или что-то похожее по смыслу... Т.е., кто-то должен ткнуться по указанному адресу и сказать туда GET - в ответ он получает html, Вы можете это проверить просто телнетом на 80-й порт.

Цитата:

~$ telnet www.finanz.ru 80
Trying 65.52.145.144...
Connected to finando-bundle3-web-neu.cloudapp.net.
Escape character is '^]'.
GET /valuti/diagramma                                                 
HTTP/1.1 200 OK
Cache-Control: private
Content-Type: text/html; charset=utf-8
Server: Microsoft-IIS/7.5
Set-Cookie: ASP.NET_SessionId=e1qppopsncbqieychr3na5ku; path=/; HttpOnly
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Fri, 26 Dec 2014 14:35:07 GMT
Content-Length: 13547
X-Cache: MISS from fbsd2.office
Via: 1.1 fbsd2.office (squid/3.2.13)
Connection: close

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><script type="text/javascript">window.NREUM||(NREUM={});NREUM.info = {"beacon":"beacon-2.newrelic.com","errorBeacon":