Bonjour, j'ai un projet dans lequel je dois créer une interface permettant de modifier certaines variables et de voir les effets que cela a sur les courbes dépendant de ces variables. Mais j'ai plusieurs problèmes, mes variables 'temp' et Ensoleil semble être liées entre elles je ne sais pas trop comment et mes courbes ne se mettent pas à jour lorsque je change les variables.

Si quelqu'un a une solution je suis preneuse (Je débute tout juste sur Python)

Voici mon code source:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
# Créé par Lisa, le 14/10/2019
from tkinter import * #on utilise tkinter pour créer l'ihm
from pylab import * #on utilise Pylab pour faciliter le transfert du code Matlab sur Python
import matplotlib
matplotlib.use("TkAgg")
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg
from matplotlib.figure import Figure
import tkinter as tk
from tkinter import ttk
import matplotlib.animation as animation
from matplotlib import style
 
def Ia(Va,Suns,TaC):     #function Ia = Projet(Va,Suns,TaC)
# Tension appliqué au panneau, ensoleillement et temperature
# Ia = Projet(Va,G,T) = array voltage
# Ia,Va = courant, tension appliqué
# G = nombre de soleil (1 Soleil = 1000 W/mˆ2)
# T = Tempétature en Deg C
 
    k = 1.38e-23 #Costante de  Boltzman
    q = 1.60e-19 # charge d'un electron
 
# enter the following constants here, and the model will be
# calculated based on these. for 1000W/mˆ2
    A = 1.2 # "diode quality" factor, =2 for crystaline, <2 for amorphous
    Vg = 1.12 # band gap voltage, 1.12eV for xtal Si, ˜1.75 for amorphous Si.
    Ns = 36 # number of series connected cells (diodes)
 
    T1 = 273 + 25
    Voc_T1 = 21.06 /Ns # open cct voltage per cell at temperature T1
    Isc_T1 = 3.80 # short cct current per cell at temp T1
 
    T2 = 273 + 75
    Voc_T2 = 17.05 /Ns # open cct voltage per cell at temperature T2
    Isc_T2 = 3.92 # short cct current per cell at temp T2
 
    TaK = 273 + TaC # array working temp
    TrK = 273 + 25  # reference temp
 
# when Va = 0, light generated current Iph_T1 = array short cct current
# constant "a" can be determined from Isc vs T
 
    Iph_T1 = Isc_T1 * Suns
    a = (Isc_T2 - Isc_T1)/Isc_T1 * 1/(T2 - T1)
    Iph = Iph_T1 * (1 + a*(TaK - T1))
 
    Vt_T1 = k * T1 / q; # = A * kT/q
    Ir_T1 = Isc_T1 / (exp(Voc_T1/(A*Vt_T1))-1)
    Ir_T2 = Isc_T2 / (exp(Voc_T2/(A*Vt_T1))-1)
 
    b = Vg * q/(A*k)
    Ir = Ir_T1 * (TaK/T1)**(3/A) *exp(-b*(1/TaK - 1/T1))
 
    X2v = Ir_T1/(A*Vt_T1) * exp(Voc_T1/(A*Vt_T1))
    dVdI_Voc = - 1.15/Ns / 2; # dV/dI at Voc per cell –
                          # from manufacturers graph
    Rs = - dVdI_Voc - 1/X2v  # series resistance per cell
 
# Ia = 0:0.01:Iph;
    Vt_Ta = A * 1.38e-23 * TaK / 1.60e-19 #=A*kT/q
 
# Ia1 = Iph - Ir.*( exp((Vc+Ia.*Rs)./Vt_Ta) -1);
# solve for Ia: f(Ia) = Iph - Ia - Ir.*( exp((Vc+Ia.*Rs)./Vt_Ta) -1) = 0;
# Newton’s method: Ia2 = Ia1 - f(Ia1)/f’(Ia1)
 
    Vc = Va/Ns
    Ia = zeros(size(Vc))
# Iav = Ia;
    for j in range(1,5):
        Ia = Ia - (Iph - Ia - Ir*( exp((Vc+Ia*Rs)/Vt_Ta) -1))/ (-1 - (Ir*( exp((Vc+Ia*Rs)/Vt_Ta) -1))*Rs/Vt_Ta)
# Iav = [Iav;Ia]; % to observe convergence for debugging.
    return Ia
 
class Interface(tk.Frame):
 
 # Création de la fenêtre principale
    IHM = Tk()
    IHM.title('Interface Homme-Machine')
 
    # création d'un widget Frame dans la fenêtre principale
    Frame1 = Frame(IHM,borderwidth=2,relief=GROOVE)
    Frame1.pack(side=LEFT,padx=10,pady=10)
    Frame1.place(x=1200,y=10)
 
    #On renomme le frame
    Label(Frame1,text="Réglage de l'ensoleillement et de la température").pack(padx=10,pady=10)
 
    #on met un scale horizontale dans le premier frame pour l'ensoleillement
    Ensoleil = 0
    ensoleillement= Scale(Frame1, orient='horizontal', from_=0, to=1000,resolution=0, tickinterval=100, length=350, variable=Ensoleil,label='Ensoleillement (W/m²)')
    ensoleillement.pack(padx=10,pady=10)
    Var1 = Entry(Frame1, textvariable= Ensoleil)
    Var1.focus_set()
    Var1.pack(side = LEFT, padx = 5, pady = 5)
    Var1.place(x=240,y=55)
 
    #on met un deuxième scale horizontale dans le premier frame pour la température
    Temp= 0
    Temperature= Scale(Frame1, orient='horizontal', from_=0, to=100,resolution=0, tickinterval=10, length=350, variable=Temp ,label='Température (°C)')
    Temperature.pack(padx=10,pady=10)
    Var2 = Entry(Frame1, textvariable= Temp)
    Var2.focus_set()
    Var2.pack(side = LEFT, padx = 5, pady = 5)
    Var2.place(x=240,y=155)
 
    # création d'un troisième widget Frame dans la fenêtre principale
    Frame3 = Frame(IHM,borderwidth=2,relief=GROOVE)
    Frame3.pack(side=LEFT,padx=10,pady=10)
    Frame3.place(x=1200,y=550)
 
    #On renomme le frame
    Label(Frame3,text="Réglage du rapport cyclique du convertisseur Buck").pack(padx=10,pady=10)
 
    #on met un scale horizontale dans le troisième frame pour le rapport cyclique
    Rapp= 0.0
    Rapport= Scale(Frame3, orient='horizontal', from_=0, to=1,resolution=0.01, tickinterval=0.1, length=350, variable=Rapp ,label='Rapport cyclique de Buck')
    Rapport.pack(padx=10,pady=10)
    Var4 = Entry(Frame3, textvariable= Rapp)
    Var4.focus_set()
    Var4.pack(side = LEFT, padx = 5, pady = 5)
    Var4.place(x=240,y=55)
 
    V=linspace(0,30,100) # On prend une centaine de valeur de V entre 0 et 30
    #Le rapport cyclique entre 0 et 1
 
    Vref=V*Rapp #on multiplie la tension d'entrée par le rapport cyclique
    #ensoleillement entre 0 et 1
    Suns=Ensoleil/1000
 
    #I=f(v)
    Itemp1=Ia(V,Suns,Temp)
    I1=Itemp1/Rapp
 
    #P=f(v)sans rapport cyclique
    P11=V*Itemp1
 
    #P=f(v)avec rapport cyclique
    P1=Vref*I1
 
    #tracer des courbes
    fig = Figure(figsize=(12, 8), dpi=96)
    a1 = fig.add_subplot(121)
    a1.plot(V,Itemp1)
    a1.plot(Vref,I1)
    a1.axes.set_ylim(0, 10)
    a1.grid()
 
    a2 = fig.add_subplot(122)
    a2.plot(V,P11)
    a2.plot(Vref,P1)
    a2.axes.set_ylim(0, 100)
    a2.grid()
 
    graph1 = FigureCanvasTkAgg(fig, IHM)
    canvas1 = graph1.get_tk_widget()
    canvas1.pack(side=LEFT)
 
    IHM.mainloop()