1+ #include < SPI.h>
2+ #include < WiFiNINA.h>
3+ // use WiFi.h when using an ESP32
4+ // #include <WiFi.h>
5+ #include < HttpClient.h>
6+ #include < EloquentTinyML.h>
7+
8+ #define NUMBER_OF_INPUTS 1
9+ #define NUMBER_OF_OUTPUTS 1
10+ #define TENSOR_ARENA_SIZE 2 *1024
11+
12+ char SSID[] = " NetworkSSID" ;
13+ char PASS[] = " Password" ;
14+
15+ // this is a server I owe that doesn't require HTTPS, you can replace with whatever server you have
16+ const char server[] = " 152.228.173.213" ;
17+ const char path[] = " /sine.bin" ;
18+
19+ WiFiClient client;
20+ HttpClient http (client);
21+
22+ uint8_t *model;
23+ Eloquent::TinyML::TfLite<NUMBER_OF_INPUTS, NUMBER_OF_OUTPUTS, TENSOR_ARENA_SIZE> ml;
24+
25+
26+
27+ void setup () {
28+ Serial.begin (115200 );
29+ delay (2000 );
30+
31+ wifi_connect ();
32+ http_get ();
33+
34+ // init Tf from loaded model
35+ if (!ml.begin (model)) {
36+ Serial.println (" Cannot inialize model" );
37+ Serial.println (ml.errorMessage ());
38+ delay (60000 );
39+ }
40+ else {
41+ Serial.println (" Model loaded, starting inference" );
42+ }
43+ }
44+
45+
46+ void loop () {
47+ // pick up a random x and predict its sine
48+ float x = 3.14 * random (100 ) / 100 ;
49+ float y = sin (x);
50+ float input[1 ] = { x };
51+ float predicted = ml.predict (input);
52+
53+ Serial.print (" sin(" );
54+ Serial.print (x);
55+ Serial.print (" ) = " );
56+ Serial.print (y);
57+ Serial.print (" \t predicted: " );
58+ Serial.println (predicted);
59+ delay (1000 );
60+ }
61+
62+
63+ /* *
64+ * Connect to wifi
65+ */
66+ void wifi_connect () {
67+ int status = WL_IDLE_STATUS;
68+
69+ while (status != WL_CONNECTED) {
70+ Serial.print (" Attempting to connect to SSID: " );
71+ Serial.println (SSID);
72+ status = WiFi.begin (SSID, PASS);
73+
74+ delay (1000 );
75+ }
76+
77+ Serial.println (" Connected to wifi" );
78+ }
79+
80+
81+ /* *
82+ * Download model from URL
83+ */
84+ void http_get () {
85+ http.get (server, path);
86+ http.responseStatusCode ();
87+ http.skipResponseHeaders ();
88+
89+ int modelSize = http.contentLength ();
90+
91+ Serial.print (" Model size is: " );
92+ Serial.println (modelSize);
93+ Serial.println ();
94+
95+ model = (uint8_t *) malloc (modelSize);
96+
97+ http.read (model, modelSize);
98+ print_model (modelSize);
99+ }
100+
101+
102+ /* *
103+ * Dump model content
104+ */
105+ void print_model (int modelSize) {
106+ Serial.print (" Model content: " );
107+
108+ for (int i = 0 ; i < 20 ; i++) {
109+ Serial.print (model[i], HEX);
110+ Serial.print (' ' );
111+ }
112+
113+ Serial.print (" ... " );
114+
115+ for (int i = modelSize - 20 ; i < modelSize; i++) {
116+ Serial.print (model[i], HEX);
117+ Serial.print (' ' );
118+ }
119+
120+ Serial.println ();
121+ }
0 commit comments