Create: Computing AgesDoc Brass
Programmes intégrés

counter

compte des impulsions

Tourne sur Tous Tous les ordinateurs · 15 lignes
Tapez ceci à l'invite d'un ordinateur pour le copier sur le support :
Terminal
> examples counter
> edit counter

Compte les impulsions de redstone qui arrivent à gauche de l'ordinateur et affiche le total après chacune. Sans gaspiller une seule instruction entre deux impulsions : le programme dort jusqu'à ce que la redstone change.

Quoi construire

Posez quelque chose qui envoie des impulsions à gauche de l'ordinateur (la gauche vue face à l'écran) : un bouton, une plaque de pression à une porte pour compter les visiteurs, un fil de déclenchement, un observateur, le récepteur d'une Liaison de redstone de Create.

Terminal
> counter
J'attends des impulsions : left
Impulsions : 1
Impulsions : 2
Impulsions : 3

Comment il marche

Brass
os.pull_event("redstone")

os.pull_event() endort le programme jusqu'à l'arrivée d'un évènement. Un évènement redstone arrive à chaque fois que n'importe quelle entrée de l'ordinateur change, sur n'importe quelle face, à la montée comme à la descente. C'est pourquoi le programme vérifie ensuite la face qui l'intéresse. Attendre ainsi ne coûte rien, contrairement à une boucle qui relirait l'entrée sans arrêt.

Brass
local now = rs.get(side) > 0
if now and not was then
  count = count + 1
  print("Impulsions : " .. count)
end
was = now

rs.get() lit la puissance qui arrive sur une face, de 0 à 15, et > 0 la transforme en true ou false. Une impulsion n'est comptée que sur son front montant : quand l'entrée est allumée maintenant (now) alors qu'elle était éteinte avant (not was). Sans was, la fin de chaque impulsion (un autre évènement redstone) serait comptée aussi, tout comme les changements sur les autres faces.

La même détection de front, essayée sur une liste de mesures au lieu du vrai monde :

Brass
local mesures = {0, 15, 15, 0, 0, 15, 0, 15}
local total, avant = 0, false
for _, puissance in ipairs(mesures) do
  local maintenant = puissance > 0
  if maintenant and not avant then
    total = total + 1
  end
  avant = maintenant
end
print("Impulsions : " .. total)
Écran
Impulsions : 3

Idées

  • Affichez le total sur un Panneau d'affichage : ajoutez display.set({"Visiteurs", tostring(count)}) après l'augmentation du compte, et pointez une Liaison d'affichage de Create sur l'ordinateur. Voir display.
  • Un bouton de remise à zéro à droite, vérifié à chaque évènement :

    Brass
    if rs.get("right") > 0 then
      count = 0
      print("Remise à zéro")
    end
  • Gardez le compte d'un redémarrage à l'autre en l'enregistrant dans un fichier avec fs.write(), relu au démarrage avec fs.read().
  • Faites quelque chose toutes les 10 impulsions : if count % 10 == 0 then rs.set("top", true) end, pour allumer une lampe quand un lot est complet.
  • Mesurez le temps entre deux impulsions avec os.clock() pour connaître la cadence d'une chaîne de production.

Le programme

counter
-- Compte les impulsions de redstone reçues à gauche : un bouton, un
-- observateur, une machine... Gauche et droite vus face à l'écran.
local side = "left"
local count = 0
local was = false
print("J'attends des impulsions : " .. side)
while true do
  os.pull_event("redstone")  -- dort jusqu'à un changement d'entrée
  local now = rs.get(side) > 0
  if now and not was then
    count = count + 1
    print("Impulsions : " .. count)
  end
  was = now
end