{"id":1186,"date":"2013-04-08T20:35:03","date_gmt":"2013-04-08T18:35:03","guid":{"rendered":"https:\/\/www.giannifavilli.it\/blog\/?p=1186"},"modified":"2022-02-22T16:09:46","modified_gmt":"2022-02-22T15:09:46","slug":"arduino-attendere-calibrazione-eseguire-funzioni-con-variazioni-significative","status":"publish","type":"post","link":"https:\/\/www.giannifavilli.it\/blog\/arduino-attendere-calibrazione-eseguire-funzioni-con-variazioni-significative\/","title":{"rendered":"Arduino: attendere calibrazione di sensori ed eseguire funzioni solo con variazioni significative dei valori"},"content":{"rendered":"<p>Scrivendo uno sketch di Arduino mi sono trovato a dover eseguire una o pi\u00f9 funzioni solo quando erano strettamente\u00a0 necessarie.<\/p>\n<p>Un esempio di utilizzo \u00e8 un monitor dei sensori\/attuatori collegati ad Arduino che interagisce inviando GET o POST via HTTP a un server web\/php\/mysql o su un Form di Google Drive, solo quando \u00e8 veramente necessario, senza rischiare che la web hosting o nel caso si utilizzino i <a title=\"Arduino &amp; Google Drive: monitor dei sensori con trigger e invio notifiche\" href=\"https:\/\/www.giannifavilli.it\/blog\/arduino-googledrive-trigger\/\" target=\"_blank\" rel=\"noopener\">Trigger Script di Google Drive<\/a> scambino i nostri GET\/POST come una sorta di <a title=\"Wikipedia BOT\" href=\"http:\/\/it.wikipedia.org\/wiki\/Bot\" target=\"_blank\" rel=\"noopener\">BOT<\/a> invasivi e possibilmente dannosi, con la conseguenza di avere il servizio web interrotto.<\/p>\n<p><!--more--><br \/>\n<div class=\"clear-block\"><div class=\"ad alignnone\">\n\t\t\t\t<script async src=\"\/\/pagead2.googlesyndication.com\/pagead\/js\/adsbygoogle.js\"><\/script>\n\t\t\t\t<!-- GianniFavilli - Responsive -->\n\t\t\t\t<ins class=\"adsbygoogle\"\n\t\t\t\t     style=\"display:block\"\n\t\t\t\t     data-ad-client=\"ca-pub-1205156047762515\"\n\t\t\t\t     data-ad-slot=\"6873384605\"\n\t\t\t\t     data-ad-format=\"auto\"><\/ins>\n\t\t\t\t<script>\n\t\t\t\t(adsbygoogle = window.adsbygoogle || []).push({});\n\t\t\t\t<\/script>\n\t\t\t\t<\/div><\/div>\n<h3>Descrizione dello Sketch<\/h3>\n<p>In questo esempio, Arduino prima di eseguire il primo loop, attende 2 minuti e 30. Questa tempo di attesa potrebbe servire ad alcuni sensori analogici (sensore GAS, termometro, misuratore ad induzione di corrente, ecc.) per calibrarsi ed entrare in regime stabile, evitando dei falsi positivi che potrebbero verificarsi se il sensore \u00e8 troppo freddo, caldo o non ha ancora raggiunto la tensione o corrente ottimale di funzionamento.<\/p>\n<p>Una volta passati il tempo di calibrazione, Arduino registra lo status e i valori delle porte ed esegue il primo loop. Nel loop viene controllato che il valore dei sensori analogici non abbia superato una certa soglia che abbiamo impostato nell&#8217;inizializzazione dello sketch o che i sensori digitali non siano cambiati di stato. Nel caso sia avvenuta una variazione significativa di una o pi\u00f9 porte Arduino esegue la nostra funzione e registra il valore delle porte. Mentre se questa variazione significativa non \u00e8 accaduta Arduino registra il valore delle porte per essere controllato al loop successivo e continua a controllare i valori delle porte senza eseguire alcuna azione.<\/p>\n<div class=\"clear-block\"><div class=\"ad alignnone\">\n\t\t\t\t<script async src=\"\/\/pagead2.googlesyndication.com\/pagead\/js\/adsbygoogle.js\"><\/script>\n\t\t\t\t<!-- GianniFavilli - Responsive -->\n\t\t\t\t<ins class=\"adsbygoogle\"\n\t\t\t\t     style=\"display:block\"\n\t\t\t\t     data-ad-client=\"ca-pub-1205156047762515\"\n\t\t\t\t     data-ad-slot=\"6873384605\"\n\t\t\t\t     data-ad-format=\"auto\"><\/ins>\n\t\t\t\t<script>\n\t\t\t\t(adsbygoogle = window.adsbygoogle || []).push({});\n\t\t\t\t<\/script>\n\t\t\t\t<\/div><\/div>\n<h3>Lo Sketch<\/h3>\n<pre class=\"brush:cpp\">\/* ***\r\n\r\nAttesa della calibrazione dei sensori analogici ed esecuzione funzione solo quando si verificano variazioni significative dei sensori analogici o variazioni di stato degli I\/O digitali.\r\n\r\nSi ringrazia Leo72 ( moderatore della sezione Software Italiana del Forum Ufficiale di Arduino http:\/\/forum.arduino.cc ) per l'aiuto e senza il quale sarebbe passato troppo tempo prima di terminare uno sketch funzionante ;)\r\n\r\nIl codice \u00e8 di dominio pubblico e pu\u00f2 essere consultato sul blog personale del sottoscritto.\r\n\r\n<blockquote class=\"wp-embedded-content\" data-secret=\"nU2esVHV4l\"><a href=\"https:\/\/www.giannifavilli.it\/blog\/arduino-attendere-calibrazione-eseguire-funzioni-con-variazioni-significative\/\">Arduino: attendere calibrazione di sensori ed eseguire funzioni solo con variazioni significative dei valori<\/a><\/blockquote><iframe loading=\"lazy\" title=\"&#8220;Arduino: attendere calibrazione di sensori ed eseguire funzioni solo con variazioni significative dei valori&#8221; &#8212; GianniFavilli.it\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; clip: rect(1px, 1px, 1px, 1px);\" src=\"https:\/\/www.giannifavilli.it\/blog\/arduino-attendere-calibrazione-eseguire-funzioni-con-variazioni-significative\/embed\/#?secret=nU2esVHV4l\" data-secret=\"nU2esVHV4l\" width=\"600\" height=\"338\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\r\n\r\nCreato il 08\/04\/2013\r\nby Gianni Favilli\r\n\r\n*** *\/\r\n\r\n\/\/init sensori analogici\r\nint a0; \/\/ imposto il valore di a0 come intero\r\nint prevA0; \/\/ imposto valore precedente di a0 come intero\r\n\r\nconst int range = 15; \/\/imposto il range massimo permesso di variazione da usare per i sensori analogici\r\n\r\n\/\/init sensori digitali\r\nint d7; \/\/ imposto il valore di d7 come intero\r\nint ind7 = 7; \/\/ imposto il pin digitale 7 per la lettura\r\nint prevD7; \/\/ imposto valore precedente di d7 come intero\r\n\r\nboolean run = false; \/\/ imposto run come falsa\r\n\r\n\/\/ la mia funzione da eseguire solo se ci sono variazioni significative dei pin\r\nvoid funzione () {\r\n  Serial.println(\"*** *** *** *** *** ***\");\r\n  Serial.println(\".::ESEGUO FUNZIONE::.\");\r\n  Serial.println(\"*** *** *** *** *** ***\");\r\n}\r\n\r\nvoid setup(){\r\n  pinMode(ind7, INPUT); \/\/ inizializzo pin digitale 3 come ingresso\r\n\r\n  \/\/ calibrazione per i primi 150000 millisecondi = 2' e 30'' \r\n  while (millis() &lt; 150000) { \/\/ attendi 2,5 min  \r\n    \/\/attendi\r\n  }\r\n  \/\/lettura iniziale di prevA0 con conversione da 1024 a 256 bit del pin analogico 0\r\n  prevA0 = map(analogRead(A0), 0, 1023, 0, 255);\r\n\r\n  \/\/lettura iniziale di prevD7\r\n  prevD7 = digitalRead(ind7);\r\n\r\n  Serial.begin(9600);\r\n  Serial.println(\"partito\");\r\n}\r\n\r\nvoid loop(){  \r\n\r\n  Serial.println(\"inzio loop\");\r\n\r\n  \/\/leggo il pin analogico 0 e lo converto a 256 bit\r\n  a0 = map(analogRead(A0), 0, 1023, 0, 255);\r\n\r\n  \/\/leggo lo stato del pin digitale 7\r\n  d7 = digitalRead(ind7);\r\n\r\n  \/\/scrivo un report ad ogni loop\r\n  Serial.print(\"valore A0 precedente:\");\r\n  Serial.print(prevA0);\r\n  Serial.print(\" - valore A0 attuale:\");\r\n  Serial.println(a0);\r\n  Serial.print(\"valore D7 precedente:\");\r\n  Serial.print(prevD7);\r\n  Serial.print(\" - valore D7 attuale:\");\r\n  Serial.println(d7);\r\n\r\n  \/\/controllo che il valore a0 non abbia superato il range stabilito o il d7 non sia cambiato di stato\r\n  \/\/ e come dice Leo72 per il primo controllo if si usa abs() affinch\u00e9 non debba fare 2 confronti\r\n  if ((abs(prevA0 - a0) &gt; range) || (d7 != prevD7)) {\r\n    run = true; \/\/ imposto il booleano come vero per eseguire la funzione \r\n    Serial.println(\".:: OVERFLOW ::.\"); \/\/ scrivo che c'\u00e8 un cambio stato\r\n  } \r\n  else {\r\n    run = false; \/\/ imposto il booleano come falso e non eseguo niente\r\n    Serial.println(\"valori nel range\"); \/\/ scrivo che tutto \u00e8 ok\r\n  }\r\n\r\n  prevA0 = a0; \/\/ salvo la lettura di prevA0 per il loop successivo\r\n  prevD7 = d7; \/\/ salvo la lettura di prevD7 per il loop successivo\r\n\r\n  if (run){ \/\/ se run \u00e8 vera eseguo la funzione\r\n    delay(1000); \/\/attendo un secondo prima di eseguire la funzione\r\n    funzione();\r\n  }\r\n\r\n  delay(2500); \r\n  Serial.println(\"fine loop\");\r\n} \/\/loop<\/pre>\n<p>Come potete notare ho cercato di commentare il pi\u00f9 possibile lo sketch per una pi\u00f9 facile comprensione di quello che Arduino dovr\u00e0 eseguire.<br \/>\n\t<!-- \/\/NOTE inibito\n\t<div class=\"paga_box_sandbox\"><h4>In questo momento non fare donazioni, sto testando il sistema. Grazie!<\/h4>\t<p>Dona 1.49 Euro per scaricare il progetto completo<\/p>\n\t<p class=\"mini\">A donazione effettuata una email con le informazioni e il link per scaricare il progetto ti sar\u00e0 inviata all'indirizzo di posta che hai utilizzato su PayPal per fare la donazione<\/p>\n\t<form method=\"post\" name=\"paypal_form_donap_4235\" action=\"https:\/\/www.sandbox.paypal.com\/cgi-bin\/webscr\">\n\t\t<input type=\"hidden\" name=\"business\" value=\"info@giannifavilli.it\" \/>\n\t\t<input type=\"hidden\" name=\"cmd\" value=\"_donations\" \/>\n\t\t<input type=\"hidden\" name=\"return\" value=\"http:\/\/www.giannifavilli.it\/blog\/ppget\/?mailpp=1\" \/>\n\t\t<input type=\"hidden\" name=\"cancel_return\" value=\"http:\/\/www.giannifavilli.it\/blog\/wp-json\/wp\/v2\/posts\/1186\" \/>\n\t\t<input type=\"hidden\" name=\"notify_url\" value=\"http:\/\/www.giannifavilli.it\/listen\/donazione_pp_ipn.php\" \/>\n\t\t<input type=\"hidden\" name=\"rm\" value=\"2\" \/>\n\t\t<input type=\"hidden\" name=\"currency_code\" value=\"EUR\" \/>\n\t\t<input type=\"hidden\" name=\"lc\" value=\"IT\" \/>\n\t\t<input type=\"hidden\" name=\"cbt\" value=\"Grazie! Permi qui per torna sul blog e scarica il progetto\" \/>\n\t\t<input type=\"hidden\" name=\"item_name\" value=\"(ArduinoCalibrazione) Progetto per Donazione al fine di mantenere il blog\" \/>\n\t\t<input type=\"hidden\" name=\"amount\" id=\"amount\" value=\"1.49\">\n\t\t<input type=\"hidden\" name=\"custom\" value=\"ArduinoCalibrazione\" \/>\n\t\t<input type=\"hidden\" name=\"no_note\" value=\"1\" \/>\n\t\t<input class=\"pulsantepp\" type=\"image\" src=\"https:\/\/www.paypalobjects.com\/it_IT\/IT\/i\/btn\/btn_donateCC_LG.gif\" border=\"0\" name=\"submit\" alt=\"PayPal - Il metodo rapido, sicuro e affidabile per fare donazioni.\" \/>\n\t<\/form>\n\t<\/div>\n\t-->\n\t<\/p>\n<h3>Conclusioni<\/h3>\n<p>Lo sketch controlla solo lo status di una porta analogica e una digitale ma nulla vieta di aggiungere il controllo per una o pi\u00f9 porte.<\/p>\n<p>Come accennavo nell&#8217;introduzione questo sketch \u00e8 molto utili per i progetti che richiedono l&#8217;esecuzione di una o pi\u00f9 funzioni solo quando \u00e8 strettamente necessario, evitando sprechi di energia elettrica, anche se infinitesimali e sopratutto, per le applicazioni che richiedono l&#8217;interazione con server esterni.<\/p>\n<p>Supponiamo di dover inviare i valori delle porte di Arduino ad una pagina PHP che registra questi valori su un database MySQL. Nel caso non avessimo adottato il controllo dei valori sulle porte, Arduino avrebbe inviato i dati al database ogni 2500 millisecondi (due secondi e mezzo) con la conseguenza di avere la &#8220;bellezza&#8221; di 24 record in un solo minuto fate il calcolo per un ora e poi per un giorno e cos\u00ec via, vi garantisco che sono un po&#8217; troppi record!!! \ud83d\ude42<\/p>\n<div class=\"alert alert-info fade in\">NOTE E RIFLESSIONI PER ESPERTI DI PHP\/MySQLCerto \u00e8 che con PHP \u00e8 possibile fare i controlli sui valori prima di registrare un nuovo record nel database ma ci\u00f2 implica molte righe di programmazione in pi\u00f9 e moltissime SELECT, UPDATE, INSERT INTO da fare sul database con la conseguenza di avere dei ritardi sull&#8217;esecuzione del codice e il possibile misunderstand (BOT o DDoS) con la web hosting dove abbiamo appoggiato il nostro servizio.Per esperienza personale, in alcuni progetti mi sono servito di Tophost che \u00e8 una web hosting molto configurabile a basso costo ma che usa macchine virtuali STRA-CARICHE. Vi garantisco che spesso e volentieri mi sono ritrovato i fantastici messaggi di MySQL che avvisavano dell&#8217;impossibilit\u00e0 di connettersi al DB perch\u00e9 troppe connessioni simultanee o timeout della connessione. Si pu\u00f2 essere bravi quanto ci pare con la programmazione in PHP ma se i servizi che utilizziamo sono scarsi, perch\u00e9 a basso costo, non ci possiamo fare niente per incappare in queste spiacevole situazioni.Ho bypassato il problema facendo &#8220;decidere&#8221; ad Arduino quando inviare i valori che verranno interpretati da PHP e registrati su MySQL \ud83d\ude42<\/p>\n<\/div>\n<h3>Reference<\/h3>\n<p><strong>Ringrazio Leo72, moderatore della sezione Software Italiana del Forum Ufficiale di Arduino<\/strong><\/p>\n<p><a title=\"Attendere che sensore entri in regime stabile\" href=\"http:\/\/arduino.cc\/forum\/index.php\/topic,158978.0.html\" target=\"_blank\" rel=\"noopener\">Link alla discussione<\/a> su forum.arduino.cc<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Scrivendo uno sketch di Arduino mi sono trovato a dover eseguire una o pi\u00f9 funzioni solo quando erano strettamente\u00a0 necessarie. Un esempio di utilizzo \u00e8 un monitor dei sensori\/attuatori collegati ad Arduino che interagisce inviando GET o POST via HTTP a un server web\/php\/mysql o su un Form di Google Drive, solo quando \u00e8 veramente necessario, senza rischiare che la web hosting o nel caso si utilizzino i Trigger Script di Google Drive scambino i nostri GET\/POST come una sorta di BOT invasivi e possibilmente dannosi, con la conseguenza di avere il servizio web interrotto.<\/p>\n","protected":false},"author":2,"featured_media":1411,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[16,3,17],"tags":[67,68],"class_list":["post-1186","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-arduino","category-informatica","category-programmazione","tag-arduino","tag-programmazione"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/www.giannifavilli.it\/blog\/wp-content\/uploads\/2013\/04\/Arduino_Uno_-_R3.jpg","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p4SGGs-j8","_links":{"self":[{"href":"https:\/\/www.giannifavilli.it\/blog\/wp-json\/wp\/v2\/posts\/1186","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.giannifavilli.it\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.giannifavilli.it\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.giannifavilli.it\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.giannifavilli.it\/blog\/wp-json\/wp\/v2\/comments?post=1186"}],"version-history":[{"count":0,"href":"https:\/\/www.giannifavilli.it\/blog\/wp-json\/wp\/v2\/posts\/1186\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.giannifavilli.it\/blog\/wp-json\/wp\/v2\/media\/1411"}],"wp:attachment":[{"href":"https:\/\/www.giannifavilli.it\/blog\/wp-json\/wp\/v2\/media?parent=1186"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.giannifavilli.it\/blog\/wp-json\/wp\/v2\/categories?post=1186"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.giannifavilli.it\/blog\/wp-json\/wp\/v2\/tags?post=1186"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}