Vai al contenuto
PLC Forum


Wsystem, ovvero nascita di un sistema domotico.


walterword

Messaggi consigliati

Falconetel

i cinesi saranno anche bravi ma se io per esempio volessi realizzare un arduino nano l'Atmega328  lo compro a 1.59euro per quantità il cinesino mi spedisce a casa la scheda fatta e finita a 1.36euro. Non c'è storia!

Per il controllo tapparelle o in generale il controllo di dispositivi remoti io non userei 485 ma can bus (ma è una mia preferenza) Segnalo a Walter questo protocollo

http://www.vscp.org/

Sull'uso del C++ sono anche io curioso. Sarà un mio preconcetto ma l'allocazione dinamica della ram in un sistema embedded acceso 24h su 24h mi fa paura.

Io cerco di non usarla temo che alla lunga la malloc/new fallisca e cosa si fa in quel caso ?.

Mi fa piacere che nessuno usi sostanze proibite e sinceramente rimango stupito dalla produttività di Walter considerato che in 24h farà anche altro non dedicherà il suo tempo solo al Wsystem.

Link al commento
Condividi su altri siti


  • Risposte 247
  • Created
  • Ultima risposta

Top Posters In This Topic

  • walterword

    149

  • Livio Orsini

    48

  • Falconetel

    16

  • accacca

    13

Top Posters In This Topic

Posted Images

alla  fine  si  parlava di hw in generale ,il  fatto  dei  cinesi  si  sà la  produzione è  tutta  li ...

poi la  passione  ti  porta a  metterci  il  massimo  in  quello  che  fai ... io  adesso devo  riprendere propio  perchè  sono  stato  fermo  tutta  l  estate  penso  che  tra  qualche  mese  riesco a  creare  una  prima  immagine  per  sdcard  di  una  versione  base  del  mio  centralino multifunzione.. 

Link al commento
Condividi su altri siti

il martello possono farlo anche sulla luna ....ma se non saei capace di usarlo oppure lo usi solo per demolire non serve a nulla.

Io faccio sempre paragoni con l'edilizia anche perche l'infromatica e la programmazione hanno uno spirtio molto simile.

HH : la programmazione dinamica la uso solo in fase di setup dopodiche quella e' e quella gira . Questo mi permette di configurare l'impianto tramite un configratore sw e/o tramite android .Si scelgono gli oggetti lampadina , termostato , pompe, allarme ect e ci sono delle aree di comunciazione fisse . In questo modo si può scegliere a quale ingreso e/o quale uscita agganciare pulsanti , pompe, lampadine etc senza essere costretti di dover collegare qua o la i fili . La configurazione hw viene scritta in un file ospitato nella micro sd card che sta vicino ad arduino. Legge la conf. crea gli oggetti e poi fa quello che deve, Durante l'esecuzione del programma non c'e' niente da dinamicizzare ....non è che mentre annaffio il giardino cambio l'uscita della pompa con quella del campanello.

Ogni volta che l'utente o l'installatore decidono di fare modifiche , togliere , aggiungere ect rifanno la configurazione , arduino processa e ricrea le strutture. Se anche in questo modo non c'e' da fidarsi e' meglio cambiare mestiere e buttare via tutto perche significa che i processori e l'informatica fanno cacare ....i ssitemi operativi , dispositivi come i plc e molto altro si basano su questa architettura....non capisco di cosa si debba avere paura , se non funziona vuol dire che il sistema e che il processore ARM sono inutili 

Modificato: da walterword
Link al commento
Condividi su altri siti

Una rapida risposta non voglio sporcare il tuo thread con argomenti non pertinenti

Un ambiente che lavora in allocazione dinamica si porta dietro un processo background di garbage collector se non c'è rischi di avere problemi in allocazione della memoria.Usare l'allocazione dinamica su PC dove c'è un processo di garbage collector e soprattuto misuri la RAM in Gbyte non vedo problemi.

Quanto alla tua applicazione Walter, sarò di vecchia scuola, ma io utilizzerei una union in C dove metto dentro tutti i possibili descrittori (le strutture) dei device. L'applicazione gestise un bel vettore di N device che possono essere oggetti qualsiasi: tre lampade quattro prese un irrigatore o otto prese e sette interruttori... In questo modo qualunque cosa faccia il tuo installatore ha spazio certo e definito per N devices Devi solo controllare che l'indice del device non esca dal limite del vettore. No liste puntatori allocazione... cose che, chiarisco, non considero inutili ma solo non adatte a un sistema con processore potentissimo ma costretto a muoversi in 512KB di flash e 200KB di ram.

E scusa l'OT

Modificato: da accacca
Link al commento
Condividi su altri siti

Concordo con accaacca; questa è un po la filosofia degli SO in real time multitask che cercano di previlegiare sicurezza e velocità.

Link al commento
Condividi su altri siti

HH : il tuo intervento non è per niente OT , anzi è uno dei pochi interventi intelligenti dopo 2300 visualizzazioni.

Per quanto riguarda l'uso di indici , il progetto originale WSystem è già cosi. Lo sto completando con una serie di array etc . 

In questo modo si devono dare dei limiti alla creazione degli oggetti, per esempio si impone un massimo numero di lampadine , un massimo numero di tapparelle , un massimo di centraline ect .E' un po quello che fanno gli addetti alla domotica con l'uso dei plc . Questa strada è la piu "semplice" .

Io però la creazione dinamica la uso solo in fase di setup e poi rimane tale fino alla configurazione successiva .In effetti , dopo alcuni esperimenti, ho notato che se creo una lista di oggetti lunga 100 elementi , di lampadine , e una di tapparelle lunga 100-150 elementi , il programma finisce a mala pena il setup e poi si blocca. Credo che il problema sia dovuto anche al fatto che la memoria del micro è suddivisa in pagine. Però se impongo dei limiti potrei anche risolvere il problema.

Certo a questo punto devo finilizzare l'applicazione per uno scopo ben preciso o comunque un insieme di scopi ben precisi.

Volevo discutere un esempio , un plc ....va bene un plc ha un sistema operativo che gestisce la memoria però quando carichi un DB o blocco dati il micro del plc riceve un comando di creare dinamicamente un'area dati e la memoria RAM di un plc non e' che sia molto più grande di 100K ....

comunque sia posso tranquillamente definire un massimo di tapparelle, di lampadine , di rele',poi al massimo 2 cronotermostati , 2 irrigazioni , 1 centralina di allarme ect con l'ottimizzazione durante il setup che mi fa risparmiare tempo nei loop, se ho un massimo di 20 lampadine ma in realta ne ho solo 10 allora viene impostato come massimo numero 10 . In fase di settaggio da configuratore conto quanti oggetti sono richiesti e ne limito fin da subito l'uso. Cosi è quello che sto facendo , in parallelo sto facendo dei test con la dinamica che mi permette impostare anche 0 oggetti di un tipo e 100 di un altro , sempre con un controllo d'uso nel configuratore.

Cosa dite? 

Link al commento
Condividi su altri siti

in effetti la programmazione dinamica , anche se fatta una votla sola in fase di setup() , potrebbe corrompere lo stack delle chiamate o dei dati o creare dei malfunzionamenti sempre dovuti a questo problema .Va be se vedo che e' cosi allora lascio i miei bei array e fine ..... cioe andare a cercarsi rogne piu del dovuto non mi sembra il caso. Si rischia di cadere nel ridicolo e di dimostrare di non essere capaci di non accendere nemmeno una lampadina 

Link al commento
Condividi su altri siti

potrebbe corrompere lo stack delle chiamate o dei dati o creare dei malfunzionamenti sempre dovuti a questo problema

 

Questo è uno dei talloni di achille dei sistemi Win, mai corretto in modo defnitivo.

Link al commento
Condividi su altri siti

Livio mi riferivo ad arduino due no na Winzoz ....comunque anche con il mega mi era capitato che se usi troppe variabili locali e troppe indicizzazioni annidate la allcoazione di memoria va a corrompere l'area di stack e fai dei bordelli oltre che a non funzionare.Li avevo risolto aggiungendo piu elementi all'array e lasciando l'ultima riga della tabella vuota , occupata dallo stack ....comunque bisogna fare delle prove , ma se l acosa e' instabile continuo con gli array e fine del discorso , certo e' un peccato perche con le liste dinamiche stavo viaggiando bene ....:(

Link al commento
Condividi su altri siti

Livio mi riferivo ad arduino due no na Winzoz ...

ma ciò non toglie che è propro il difetto originale di Win.

I sistemi come RTOS Siemens-intel, Unix o QNX, tanto per citare tra i più noti ed anziani il controllo lo fanno a priori sul numero di variabili, di processi e di annidamenti; oltre un certo limite, stabilito dalla quantità di memoria disponibile, bloccano la compilazione.

Link al commento
Condividi su altri siti

In anteprima il CronoTermostato

94e1fe5f5f2655831917b2e83c3dccb4.png

Il quadratino bianco in realtà lampeggia e si sposta, "lampeggiando", man a mano che l'ora si incrementa.

L'ora si incrementa e decrementa tramite i pulsanti H+ e H- , ma anche automaticamente dopo aver selezionato la temperatura di riferimento T1 o T2 o T3 .Se si sbaglia si può tornare indietro e correggere. Premendo T1...T3 una volta si imposta il rosso e una volta il blu .Il rosso indica accensione caldaia con set point riferito a T..T3 , il blu indica setpoint a 0 °C oppure in antigelo. Ovviamente se premo T3 si colorano di rosso che T2 e T1 della stessa colonna .

   

Link al commento
Condividi su altri siti

aggiungi due pulsantini per eliminare una colonna di temperature oppure tutto il programma giornaliero in un colpo

73998f53b576fc5a63a9f33763ee0d40.png

 

Modificato: da walterword
Link al commento
Condividi su altri siti

Una volta testate le funzionalità della libreria WChronoThermostat.h e relativo .cpp , si può creare un'applicazione ad hoc per Arduino UNO ossia un cronotermostato costituito dalle seguenti parti :

1- Arduino Uno 

2- Libreria WChronoThermostat.h 

3- WProtocol.h

4- Un rele'

5- Modulo Bluetooth per Arduino

6- Android app con connessione BT e relative pagine di gestione per il riscaldamento 

In questo modo si può decentrare questa funzionalità in un solo microcontrollore. Per il solo cronotermostato le risorse di arduino uno sono più che sufficienti 

Se qualcuno me lo sponsorizza lo faccio ;)

Modificato: da walterword
Link al commento
Condividi su altri siti

del_user_56966

Chissà cosa ne penserebbe Aleandro se leggesse questa discussione. Quasi quasi lo avviso.

penso che l'impegno e la condivisione del progetto di Walter è ammirevole....

 

 

 

 
 

 

 

Link al commento
Condividi su altri siti

questo algoritmo permette di spolpare una matrice bi-dimensionale, estrapolata da una matrice tridimensionale, e di caricarla su un vettore di bytes per poterli spedire

Mi ha preso tutto il giorno ....

 private void packDayInfo()
    {
        int i,j,indice=0,offset=0;
        byte[] data=new byte[9];
      
        for(i=0;i<3;i++)
        {
            for(j=0;j<24;j++)
            {
                indice=(j+(i*24))/8;
                offset=j-((j/8)*8);
                data[indice] |=(memWeek[giornoAttuale][i][j]) << 7-offset;
           }
        }

        setCronoDay(giornoAttuale,data);
    }

 

Modificato: da walterword
Link al commento
Condividi su altri siti

I test sul Cronotermostato settimanale procedono bene 

Se si ipotizza un programma di temperature , giornaliero, T1-T2-T3 di questo tipo 

40fc7c805d43ae16ecdb4596f550c46d.png

allora Arduino riceve e processa in questo modo 

945d32bcb9f62c4f6a61833369077be8.png

 

Vedete ci sono tre file di temperature , una per ogni soglia .La colonna esprime da 0 a 23 l'ora e la riga la soglia. Vengono acquisite le matrici in Android e spediti i byte su Bluetooth e poi arduino processa e ricostruisce la matrice con questo algoritmo , sempre farina del mio sacco 

void WChronoThermostat::setWeekTemperature(int day,byte data[])
{
	 int i,j,indice=0,offset=0,maschera=0,giorno;
	 giorno=day;
		
		 
 for(i=0;i<3;i++)
	{
	 for(j=0;j<24;j++)
		{
		   indice=(i*3)+(j/8);
		   offset=j-((j/8)*8);
		   maschera=pow(2,7-offset);
	   this->weekTemperature[giorno][i][j]=this->dayTemperature[i][j]=(data[indice] & (byte)maschera) >> (7-offset);
		}
			 
	}
	for(i=0;i<3;i++)
	  {
		  for(j=0;j<24;j++)
		  {
			  Serial.print(this->dayTemperature[i][j]); Serial.print("-");
		  }
		    Serial.println("");
		    Serial.println("****************************");
	  }
	  
	
	 
}

in poche parole , in arduino ho la stessa matrice che riempio in android quando vario le soglie T1....T3 

Si vedono nel monitor seriale le tre righe da 24 elementi e gli "1" che rappresentano la soglia . 

Modificato: da walterword
Link al commento
Condividi su altri siti

mia madre non capisce i cronotermostati moderni (da almeno 20 in qua) e quelli a lamella spesso si impastano.

Adesso lo progetto io con Arduino uno , sensore I2C , rele e BT .....potenziometro per regolazione locale e pulsantino per scelta di controllo locale/remoto 

Devo trovare solo una scatoletta....sapete dove le vendono a buon prezzo?

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora

×
×
  • Crea nuovo/a...