Youen Toupin
3 years ago
5 changed files with 9198 additions and 3 deletions
@ -0,0 +1,198 @@
|
||||
import matplotlib.pyplot as plt |
||||
import numpy as np |
||||
import urllib.request |
||||
|
||||
|
||||
|
||||
|
||||
def meteo_choix(choix_utilisateur): #par heures sur la zone géographique concerné |
||||
lines = urllib.request.urlopen('https://vhelio.org/wp-content/uploads/2021/09/meteo_finale.csv').readlines() |
||||
|
||||
H1a=[] |
||||
H1b=[] |
||||
H1c=[] |
||||
H2a=[] |
||||
H2b=[] |
||||
H2c=[] |
||||
H2d=[] |
||||
H3=[] |
||||
|
||||
del lines[0] |
||||
del lines[0] |
||||
del lines[8761] |
||||
del lines[8760]#suppression des ';' en fin de csv |
||||
for line in lines: |
||||
|
||||
|
||||
|
||||
line = line.split(';') |
||||
line[0]=line[0].rstrip(';') |
||||
|
||||
H1a.append(float(line[0])) |
||||
H1b.append(float(line[1])) |
||||
H1c.append(float(line[2])) |
||||
H2a.append(float(line[3])) |
||||
H2b.append(float(line[4])) |
||||
H2c.append(float(line[5])) |
||||
H2d.append(float(line[6])) |
||||
H3.append(float(line[7])) |
||||
|
||||
del line[8] |
||||
del line[9] |
||||
del line[10] |
||||
if choix_utilisateur=='h1a': |
||||
return H1a |
||||
if choix_utilisateur=='h1b': |
||||
return H1b |
||||
if choix_utilisateur=='h1c': |
||||
return H1c |
||||
if choix_utilisateur=='h2a': |
||||
return H2a |
||||
if choix_utilisateur=='h2b': |
||||
return H2b |
||||
|
||||
if choix_utilisateur=='h2c': |
||||
return H2c |
||||
if choix_utilisateur=='h2d': |
||||
return H2d |
||||
if choix_utilisateur=='h3': |
||||
return H3 |
||||
return 'erreur dans la saisie de la composante de la région' |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
def liste_annee_function(donnee_annee):#permet de séparer les 8760 données soit 365 jours avec 24 données + le jour de la semine (lundi,mardi,etc) |
||||
annee=[] |
||||
jour=[] |
||||
l=0 |
||||
heure_aller=8 |
||||
heure_retour=16 |
||||
heure_promenade_week_end=10 |
||||
semaine=['lundi','mardi','mercredi','jeudi','vendredi','samedi','dimanche'] |
||||
for i in range (len(donnee_annee)): |
||||
|
||||
if i==0: |
||||
jour.append([donnee_annee[i],0]) |
||||
continue |
||||
else: |
||||
|
||||
if i%24==0:#permet de diviser les données par pack de 24 (soit un jour) |
||||
|
||||
jour.append(semaine[l]) |
||||
if jour[-1]=='dimanche' or jour[-1]=='samedi' : |
||||
jour[heure_promenade_week_end][1]=2# pour le week end on suspose une balade qui dure la distance moyenne journalière |
||||
else: |
||||
jour[heure_aller-1][1]=1#le vhelio sera utiiser a cette heure là |
||||
jour[heure_retour-1][1]=1 |
||||
annee.append(jour) |
||||
jour=[] |
||||
jour.append([donnee_annee[i],0]) |
||||
if l==6: |
||||
l=0 |
||||
else: |
||||
l=l+1 |
||||
continue |
||||
|
||||
jour.append([donnee_annee[i],0]) |
||||
annee.append(jour) |
||||
return annee |
||||
|
||||
def Capacite_batt_dans_le_temps(liste_annee,conso_WH_par_km, capacite_batt,distance_moyenne): |
||||
rendement_panneau=0.15 |
||||
surface_panneau=1 |
||||
capacite_batt_reel=capacite_batt |
||||
|
||||
compteur_de_charges=0 |
||||
liste_finale=[] |
||||
prix_moyen_kwh=0.192 |
||||
|
||||
|
||||
electricite_utilise_par_le_moteur=0 |
||||
for jours in range(len( liste_annee)): |
||||
|
||||
for heures in range(len(liste_annee[jours])-1): |
||||
|
||||
infos=liste_annee[jours][heures] |
||||
|
||||
# la capacité de la batterie varie selon ce que le panneaux fournit et la consommation éléctrique pendant l'utilisation du vhélio |
||||
electricite_utilise_par_le_moteur= electricite_utilise_par_le_moteur+infos[1]*conso_WH_par_km*distance_moyenne/2 |
||||
|
||||
capacite_batt_reel=capacite_batt_reel+ infos[0]*rendement_panneau*surface_panneau*1-infos[1]*conso_WH_par_km*distance_moyenne/2 |
||||
|
||||
|
||||
if capacite_batt_reel>capacite_batt: |
||||
|
||||
capacite_batt_reel=capacite_batt |
||||
if capacite_batt_reel<=0: |
||||
capacite_batt_reel=capacite_batt |
||||
compteur_de_charges=compteur_de_charges+1 |
||||
|
||||
|
||||
infos.append(capacite_batt_reel) |
||||
liste_finale.append(capacite_batt_reel/capacite_batt*100) |
||||
return liste_finale,liste_annee,compteur_de_charges,compteur_de_charges*(capacite_batt/1000)*prix_moyen_kwh, electricite_utilise_par_le_moteur |
||||
|
||||
def consommation_wh_par_km_estimation (denivele,poids): |
||||
#Après les expèriences faites on arrive sur une moyenne de 16 sur du plat et 25 en montée (c'estdonnées seront mise à jour avec les nouveaux tests du vhélio 4) |
||||
composante_poids=0 |
||||
composante_poids=(4/200)*poids# approche linéaire |
||||
if poids>=200: |
||||
composante_poids=4 |
||||
if poids<=0: |
||||
composante_poids=0 |
||||
|
||||
|
||||
if denivele==0: |
||||
return 14+composante_poids |
||||
if denivele>500: |
||||
return 21+composante_poids#21 est une moyenne entre la consommation en montée et la consommation en descente sur une distance moyenne |
||||
return 14+(7/500)*denivele+composante_poids# approximation linéaire de la consommation éléctrique |
||||
|
||||
def fonction_fianale(capacite_battrie_desiree,distance_moyenne_jour,denivele,poids,liste_ensolleillement_annee): |
||||
#cette fonction utilise toute les fonctions définis avant et permet l'affichage |
||||
|
||||
liste_ensolleillement_finale=liste_annee_function(liste_ensolleillement_annee) |
||||
liste_finale,liste_annee,compteur_de_charges,prix_annee,electricite_conso=Capacite_batt_dans_le_temps(liste_ensolleillement_finale,consommation_wh_par_km_estimation(denivele,poids),capacite_battrie_desiree,distance_moyenne_jour) |
||||
couverture_solaire=round(100*(electricite_conso-(compteur_de_charges+1)*capacite_battrie_desiree)/electricite_conso) |
||||
abs=np.linspace(0,8758,8759) |
||||
xlabels = ["Janvier", "Février", "Mars", "Avril", "Mai", "Juin","Juillet","Aout", "Septembre", "octobre", "Novembre", "Décembre"] |
||||
|
||||
ord=liste_finale |
||||
70 |
||||
plt.plot(abs,ord) |
||||
plt.xlabel(" ------|------------été--------------|---------------") |
||||
plt.ylabel('%') |
||||
plt.title(" Pourcentage de charge dans la batterie en fonction des heures de l'année " ) |
||||
|
||||
|
||||
plt.show() |
||||
|
||||
print('il faudra recharger le vhelio sur secteur environ',compteur_de_charges,"fois sur l'annee") |
||||
print("cela coutera" ,round(prix_annee,2),"€ sur l'annee") |
||||
print("la couverture solaire du vhelio est de",couverture_solaire,'%') |
||||
|
||||
|
||||
#%% |
||||
|
||||
print('Quelle capacite de batterie envisagez vous?\n(exemple: tapez" "700")' ) |
||||
capacite_battrie_desiree=float(input()) |
||||
print('Combien de kilometres fait vous chaque jour\n(exemple: tapez "10")') |
||||
distance_moyenne_jour=float(input()) |
||||
print('Quel est le denivele moyen de votre trajet journalier (en metres).\nPour indication: "0" signifie que le trajet se fait sur du plat, "100"m :legerement vallonne, "200": plutot vallonne, "300": vallonne, "500": montagneux, (exemple: tapez "100")') |
||||
denivele=float(input()) |
||||
print("Quel est le poids embarque en plus du conducteur (bagages + passagers).\n(exemple: un passagers de 80kg+50kg de chargement soit 130 kg.\nIl faut taper 130 dans le simulateur.)\n") |
||||
poids=(float(input())) |
||||
print("Veuillez rentrer votre zone climatique en miniscule.\nElle est indiquer sur la carte de france ci-dessus\n(exemple: taper h1a ou h2c) surtout ecrire les 3 caracteres en minuscules.") |
||||
zone_climatique=input() |
||||
|
||||
|
||||
|
||||
liste_ensolleillement_annee=meteo_choix(zone_climatique) |
||||
fonction_fianale(capacite_battrie_desiree,distance_moyenne_jour,denivele,poids,liste_ensolleillement_annee) |
||||
# .Le projet Vhélio est libre et collaboratif. Cette version du simulateur est une première version largement améliorable. N'hésitez pas à vous inscrire en tant que faiseur pour nous aider à l'améliorer. |
||||
# Lien : https://www.helloasso.com/associations/velo-solaire-pour-tous/adhesions/adhesion-a-l-association-velo-solaire-pour-tous-faiseur |
@ -0,0 +1,219 @@
|
||||
# -*- coding: utf-8 -*- |
||||
""" |
||||
Created on Thu Sep 9 11:56:41 2021 |
||||
|
||||
@author: hugo |
||||
""" |
||||
import csv |
||||
import numpy as np |
||||
import matplotlib.pyplot as plt |
||||
|
||||
def charge_fichier_csv(fichier, delimiter=";",N=0): |
||||
""" |
||||
Charge un fichier csv et le renvoie sous forme de tableau |
||||
|
||||
:param: nom de fichier, délimiteur de cellules (par défaut ";"), |
||||
nombre de lignes d'en-tête (en comptant les lignes vides) |
||||
:returns: tableau des données |
||||
""" |
||||
|
||||
with open(fichier, 'r') as f : |
||||
rfichier = csv.reader(f, delimiter=delimiter) |
||||
tableau=[] |
||||
index_row=0 |
||||
for row in rfichier: |
||||
if index_row < N: |
||||
index_row = index_row+1 |
||||
else : |
||||
for i in range (len(row)): |
||||
if len(tableau) <= i: |
||||
X = [] |
||||
tableau.append(X) |
||||
try: |
||||
tableau[i].append(float(row[i].replace(",",'.'))) |
||||
except ValueError: |
||||
print('erreur:contenu de cellule non numerique') |
||||
continue |
||||
|
||||
return (tableau) |
||||
tableau=charge_fichier_csv('meteo_moy.csv',delimiter=";",N=1) |
||||
H1a=tableau[4] |
||||
H1b=tableau[5] |
||||
H1c=tableau[6] |
||||
H2a=tableau[7] |
||||
H2b=tableau[8] |
||||
H2c=tableau[9] |
||||
H2d=tableau[10] |
||||
H3=tableau[11] |
||||
# print(H1a) |
||||
h1a=[40.5, 60.6, 98.5, 139.5, 159.9, 180.2, 130.1, 163.0, 131.9, 89.9, 32.6, 37.2] |
||||
h1b=[45.7, 62.3, 110.2, 147.4, 173.0, 157.2, 127.0, 150.7, 154.1, 57.5, 33.3, 23.0] |
||||
h1c=[33.0, 79.0, 127.5, 146.1, 146.9, 190.4, 140.5, 169.0, 98.7, 75.7, 44.0, 42.8] |
||||
h2a=[43.2, 68.6, 120.5, 146.5, 185.8, 184.6, 135.5, 163.0, 158.8, 86.2, 48.7, 46.3] |
||||
h2b=[56.6, 77.8, 126.2, 174.2, 205.9, 236.2, 167.7, 196.2, 204.3, 78.9, 58.7, 32.6] |
||||
h2c=[62.6, 86.5, 140.7, 153.0, 180.4, 196.9, 152.0, 174.3, 178.0, 101.9, 50.8, 41.3] |
||||
h2d=[97.9, 135.3, 185.5, 212.4, 214.4, 293.7, 217.5, 256.1, 196.4, 128.9, 105.5, 93.7] |
||||
h3=[120.2, 153.9, 179.4, 209.0, 247.8, 273.8, 219.9, 241.4, 173.6, 144.3, 92.0, 98.3] |
||||
|
||||
liste_mois=[[31,14,10],[28,13,11],[31,12,12],[30,10,14],[31,8,16],[30,8,16],[31,8,16],[31,9,15],[30,11,13],[31,13,11],[30,15,9],[31,15,9]] |
||||
#liste mois est une liste contenant 3 infos pour chaque moi (mois janvier etc ) le nb de jours du mois |
||||
#le nombre d''heure de nuit par jour , et le nombre de jours par jours |
||||
#mois=[janvier,fevrier,mars,avril,mai,juin,juillet,août,septembre,octobre,novembre,décembre] |
||||
|
||||
def creation_liste_annee (zone_geo,liste_mois): |
||||
liste_annee=[] |
||||
#objectif créer la liste année soit 365 element(jours) contenant 24 (heurs et ensolleillement)element avec les heure de nuit ou y'a 0 soleil et les heure de jours qui sont la moyenne solaire du mois divisee par le nombre d'heure ensolleiller |
||||
#ci-dessous heure du matin |
||||
for mois in range (len(liste_mois )): |
||||
for jour_par_moi in range (liste_mois[mois][0]): |
||||
liste_jour=[] |
||||
if liste_mois[mois][2]%2==0: |
||||
for w in range (int(liste_mois[mois][1]//2)): |
||||
liste_jour.append(0) |
||||
|
||||
else: |
||||
for w in range (int(liste_mois[mois][1]//2)+1): |
||||
liste_jour.append(0) |
||||
|
||||
#ci dessus on ajoute les heure de soleil |
||||
for heure_soleil in range(liste_mois[mois][2]): |
||||
ratio_moy_heure_soleil=liste_mois[mois][0]/liste_mois[mois][2] |
||||
liste_jour.append(zone_geo[mois]*ratio_moy_heure_soleil) |
||||
# ci-dessous heure de la après midi nuit |
||||
for i in range (int(liste_mois[mois][1]//2)): |
||||
liste_jour.append(0) |
||||
liste_annee.append(liste_jour) |
||||
return liste_annee |
||||
|
||||
def Specification_jour_semaine(liste_annee,heure_aller,heure_retour): |
||||
annee=[] |
||||
jour=[] |
||||
l=0 |
||||
|
||||
|
||||
semaine=['lundi','mardi','mercredi','jeudi','vendredi','samedi','dimanche'] |
||||
for i in range ((len(liste_annee))): |
||||
|
||||
jour.append(liste_annee[i]) |
||||
#le 0 c'est l'indicateur d'activité pourune heure donné |
||||
|
||||
jour.append(semaine[l]) |
||||
#if jour[-1]=='dimanche': |
||||
# jour[0][heure_promenade_dimanche]=2 |
||||
# else: |
||||
|
||||
# jour[0][heure_aller-1]=1 |
||||
# " jour[0][heure_retour-1]=1 |
||||
annee.append(jour) |
||||
jour=[] |
||||
|
||||
if l==6: |
||||
l=0 |
||||
else: |
||||
l=l+1 |
||||
continue |
||||
|
||||
|
||||
annee.append(jour) |
||||
return annee |
||||
|
||||
|
||||
|
||||
def Capacite_batt_dans_le_temps(liste_annee,conso_WH_par_km, capacite_batt,distance_moyenne,heure_de_rentre,heure_de_sortie): |
||||
rendement_panneau=0.15 |
||||
surface_panneau=1 |
||||
capacite_batt_reel=capacite_batt |
||||
|
||||
compteur_de_charges=0 |
||||
liste_finale=[] |
||||
prix_moyen_kwh=0.146 |
||||
activite=0 |
||||
|
||||
|
||||
for jours in range(len( liste_annee)): |
||||
|
||||
|
||||
|
||||
for heures in range(len(liste_annee[jours][0])):#ya le jour dans la semaine en 25 position |
||||
|
||||
infos=liste_annee[jours][0]#selection de la liste avec l'ensolleillement sur une journée |
||||
|
||||
|
||||
if liste_annee[jours][1]!='dimanche': |
||||
|
||||
if heures==heure_de_rentre or heures==heure_de_sortie: |
||||
activite=1 |
||||
|
||||
else: |
||||
activite=0 |
||||
else: |
||||
activite=0 |
||||
|
||||
|
||||
capacite_batt_reel=capacite_batt_reel+ infos[heures]*rendement_panneau*surface_panneau*1-activite*conso_WH_par_km*distance_moyenne/2 |
||||
if capacite_batt_reel>capacite_batt: |
||||
capacite_batt_reel=capacite_batt |
||||
if capacite_batt_reel<=0: |
||||
capacite_batt_reel=capacite_batt |
||||
|
||||
compteur_de_charges=compteur_de_charges+1 |
||||
infos.append(capacite_batt_reel) |
||||
liste_finale.append(capacite_batt_reel) |
||||
|
||||
return liste_finale,liste_annee,compteur_de_charges,compteur_de_charges*(capacite_batt/1000)*prix_moyen_kwh |
||||
|
||||
def consommation_wh_par_km_estimation (denivele): |
||||
if denivele==0: |
||||
return 16 |
||||
if denivele>500: |
||||
return 25 |
||||
return 16+(9/500)*denivele# approximation inéaire de la consommation éléctrique |
||||
|
||||
#%% |
||||
meteo=h1a |
||||
capacite_battrie_desiree=700 |
||||
distance_moyenne_jour=10 |
||||
denivele=100 |
||||
heure_aller=8 |
||||
heure_retour=16 |
||||
|
||||
annee=creation_liste_annee(meteo,liste_mois) |
||||
annee2=Specification_jour_semaine(annee,heure_aller,heure_retour) |
||||
liste_finale,liste_annee,compteur_de_charges,prix_annee=Capacite_batt_dans_le_temps(annee2,consommation_wh_par_km_estimation(denivele),capacite_battrie_desiree,distance_moyenne_jour,heure_aller,heure_retour) |
||||
|
||||
plt.figure(1) |
||||
|
||||
|
||||
abs=np.linspace(0,8759,8760) |
||||
|
||||
ord=liste_finale |
||||
plt.plot(abs,ord) |
||||
plt.xlabel('heures') |
||||
#plt.grid(True) |
||||
plt.ylabel('Wh dans la batterie ') |
||||
plt.title(" Wh dans la batterie e fonction de l'annee " ) |
||||
plt.legend() |
||||
|
||||
plt.show() |
||||
print(compteur_de_charges) |
||||
print(prix_annee) |
||||
|
||||
|
||||
# def import_data(lien_zone_climatique):#fonction permettant de récupèrer es données d'ensolleillement |
||||
# #par heures sur la zone géographique concerné |
||||
# lines = urllib.request.urlopen(lien_zone_climatique).readlines() |
||||
|
||||
|
||||
# liste_data=[] |
||||
# del lines[0] |
||||
# for line in lines: |
||||
# line=line.decode("utf-8") |
||||
# line = line.split(';') |
||||
# data=line[0] |
||||
|
||||
# data_float=float(data) |
||||
|
||||
# liste_data.append(data_float) |
||||
# return liste_data |
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,17 @@
|
||||
--Readme-- |
||||
|
||||
réalisé par |
||||
Trachsel Hugo |
||||
pour le projet Vhélio |
||||
|
||||
--Utilisation du code python-- |
||||
|
||||
-télécharger puis dézipper les fichiers. |
||||
-mettre le fichier météo_finale.csv dans le même dossier que le fichier code.py . |
||||
-Lancer le fichier code.py sur une interface supportant le language python(éviter les versions en ligne qui n'ont pas toutes les bibliothèques). |
||||
-Lancer le code. |
||||
-Tapez les données demandées dans la console pyhton. |
||||
-Lire les résultats. |
||||
|
||||
|
||||
|
Loading…
Reference in new issue